Context7
ส่งคู่มือการใช้ไลบรารีและเฟรมเวิร์กรุ่นล่าสุดให้ AI อ่านก่อนตอบ ช่วยให้โค้ดที่ AI เขียนไม่ใช้คำสั่งเก่าที่เลิกใช้แล้ว
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
Search willhaben.at for second-hand listings and rank the underpriced ones
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
WILLMEHR_MODE, WILLHABEN_COOKIE, WILLHABEN_MIN_INTERVAL_MSค่าที่ติดป้ายความลับคือกุญแจของบัญชีคุณ อย่าส่งให้ใคร และอย่าวางในแชต
ต้องเตรียมก่อน
คุณใช้แอปไหน
เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”
เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json
{
"mcpServers": {
"willmehr": {
"command": "npx",
"args": [
"-y",
"willmehr"
],
"env": {
"WILLMEHR_MODE": "ใส่ค่าของคุณ",
"WILLHABEN_COOKIE": "ใส่ค่าของคุณ",
"WILLHABEN_MIN_INTERVAL_MS": "ใส่ค่าของคุณ"
}
}
}
}พิมพ์คำสั่งนี้ใน Terminal
claude mcp add willmehr --env WILLMEHR_MODE='ใส่ค่าของคุณ' --env WILLHABEN_COOKIE='ใส่ค่าของคุณ' --env WILLHABEN_MIN_INTERVAL_MS='ใส่ค่าของคุณ' -- npx -y willmehrเติมค่าที่เว้นว่างไว้ก่อนรัน
วางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json
{
"mcpServers": {
"willmehr": {
"command": "npx",
"args": [
"-y",
"willmehr"
],
"env": {
"WILLMEHR_MODE": "ใส่ค่าของคุณ",
"WILLHABEN_COOKIE": "ใส่ค่าของคุณ",
"WILLHABEN_MIN_INTERVAL_MS": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"servers": {
"willmehr": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"willmehr"
],
"env": {
"WILLMEHR_MODE": "ใส่ค่าของคุณ",
"WILLHABEN_COOKIE": "ใส่ค่าของคุณ",
"WILLHABEN_MIN_INTERVAL_MS": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น
ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี
WILLMEHR_MODE envWILLHABEN_MIN_INTERVAL_MS envค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 7 พ.ย. 2569
ชื่อใน registry ยืนยันด้วยบัญชี GitHub taneron ซึ่งเป็นเจ้าของ repo
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต
ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน
รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต
เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo
จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
ต้องใส่ค่าเหล่านี้: WILLHABEN_COOKIE
รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)
repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (0.1.0) เข้า registry 2 เดือนที่ผ่านมา
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Node.js ในเครื่องด้วย
ในหมวดเดียวกันมี Context7, Codebase Memory, Exa
server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว
อ่านการ์ด:★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า registryi
ส่งคู่มือการใช้ไลบรารีและเฟรมเวิร์กรุ่นล่าสุดให้ AI อ่านก่อนตอบ ช่วยให้โค้ดที่ AI เขียนไม่ใช้คำสั่งเก่าที่เลิกใช้แล้ว
Codebase knowledge graph for AI agents — 162 languages, sub-ms queries, 99% fewer tokens.
Connect AI agents to Exa for web search, content fetching, and multi-step research.
ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
MCP servers for hunting deals on the German-speaking classifieds sites. TypeScript, over stdio locally or Streamable HTTP self-hosted; works with Claude Code, Claude Desktop, or any other MCP client.
Two servers ship from this repo, each registered separately:
| Server | Site | Entry point |
|---|---|---|
willmehr | willhaben.at (Austria) | dist/index.js |
kleinanzeigen-mcp | kleinanzeigen.de (Germany) | dist/kleinanzeigen/index.js |
They publish as two npm packages, willmehr and kleinanzeigen-mcp, released together from this repo at the same version.
The willhaben server was built by reverse-engineering the willhaben web app's own JSON API from a HAR capture. The Kleinanzeigen server is a port of jnslmk/kleinanzeigen-mcp — see Kleinanzeigen below.
claude mcp add willmehr -- npx -y willmehr
claude mcp add kleinanzeigen -- npx -y kleinanzeigen-mcp
Or from a clone, which is what you want for hacking on it or self-hosting:
git clone https://github.com/taneron/willmehr.git && cd willmehr
npm install && npm run build
claude mcp add willmehr -- node "$PWD/dist/index.js" claude mcp add kleinanzeigen -- node "$PWD/dist/kleinanzeigen/index.js"
Either way you get both servers locally, in full mode. Both are listed in the official MCP registry, as io.github.taneron/willmehr and io.github.taneron/kleinanzeigen, so a client that reads the registry can find them without this README. The willhaben account tools need a session cookie of your own — see Authentication; everything else works anonymously and needs no setup.
To run it as a shared HTTP server instead, on your own box, see Hosting. Nothing in this project phones home to anyone else's instance.
Both servers run in one of two modes. Same code, same binary — the mode is chosen at startup with --public / --full or WILLMEHR_MODE, and defaults to full.
full (default) | public | |
|---|---|---|
| willhaben account tools | registered | not registered |
.env / WILLHABEN_COOKIE | loaded | never read; ignored with a warning on stderr |
| willhaben request spacing | 400 ms | 900 ms |
| Kleinanzeigen spacing / pages / batch | 800 ms / 5 / 20 | 1500 ms / 3 / 10 |
public is what makes this safe to host for other people: the process holds no credential, and registers no tool that could use one, so a shared deployment cannot leak a session it never loads. The tighter pacing is the other half — in public mode every user shares one outbound IP, and both sites rate-limit per IP.
node dist/index.js --public # willhaben, anonymous
WILLMEHR_MODE=public node dist/kleinanzeigen/index.js
Account tools deliberately have no hosted equivalent. willhaben authenticates through Keycloak with PKCE, so there is no scoped token a third party could be granted — the only thing a hosted server could ask for is the raw session cookie, which reads messages and acts as the account. Anyone who wants those four tools runs full mode locally with their own cookie. See Hosting.
Four public tools, no account needed:
| Tool | Purpose |
|---|---|
willhaben_search | Search the marketplace with structured filters; auto-paginates |
willhaben_get_ad | Full detail for one ad: description, images, seller trust signals |
willhaben_find_deals | Price the market for a query, rank listings below the median |
willhaben_discover_filters | Resolve willhaben's opaque numeric category/brand ids |
Four account tools, requiring a session cookie:
| Tool | Purpose |
|---|---|
willhaben_my_profile | Your profile and numeric user id |
willhaben_my_watchlist | Ads saved to your watchlist |
willhaben_my_conversations | Recent buyer/seller chats |
willhaben_my_alert_count | Number of active saved-search alerts |
claude mcp add willmehr -- npx -y willmehr
Or from source:
npm install
npm run build npm run pack:kz # stage build/kleinanzeigen-mcp for publishing
willmehr publishes from the repo root. kleinanzeigen-mcp publishes from build/kleinanzeigen-mcp, staged by npm run pack:kz — it copies the built output the Kleinanzeigen entry point reaches (its own directory plus the shared mode module) and generates a manifest around it, so both packages ship the same commit at the same version. server.json and server.kleinanzeigen.json are the matching MCP registry entries.
Register it with Claude Code:
claude mcp add willmehr -- node "$PWD/dist/index.js"
Or in a client's MCP config:
{
"mcpServers": { "willmehr": { "command": "node", "args": ["/path/to/willmehr/dist/index.js"], "env": { "WILLHABEN_COOKIE": "BBX_JSESSIONID=...; x-bbx-csrf-token=..." } } } }
willhaben authenticates through Keycloak with PKCE, so there is no username/password grant to automate. Instead, lift the session from a logged-in browser:
npm run session -- ~/Downloads/www.willhaben.at.harnpm run check:authnpm run session writes .env (mode 0600, gitignored) and never prints cookie values. npm run check:auth exercises all four account tools and stops at the first 401 rather than repeatedly failing auth against your account.
The cookie must contain BBX_JSESSIONID (the session) and x-bbx-csrf-token. The CSRF token is read out of the cookie automatically — willhaben's web app mirrors that cookie into a same-named request header on every /webapi/ call, and the server reproduces that. WILLHABEN_CSRF_TOKEN only exists to override it.
The server loads .env from the package root itself, so MCP clients don't need to pass the cookie through their config.
BBX_JSESSIONID is sent with a five-day Max-Age, but the server invalidates it well before that — a session captured and replayed 38 minutes later was already rejected. It is not IP- or header-binding: the same jar, replayed verbatim with the browser's complete header set from the same machine and IP, still returns 401 while anonymous requests continue to work.
Treat the session as short-lived. Re-run npm run session right before you need the account tools, rather than expecting a capture to keep working for days.
| Variable | Default | Purpose |
|---|---|---|
WILLHABEN_COOKIE | — | Session cookie for account tools |
WILLHABEN_CSRF_TOKEN | from cookie | Override the CSRF token |
WILLHABEN_MIN_INTERVAL_MS | 400 (900 public) | Minimum spacing between requests |
WILLMEHR_MODE | full | full or public — see Modes |
Resolve ids before filtering. Categories and brands are opaque integers. Ask willhaben_discover_filters first — it returns each filter value with its id *and* a hit count for your current query:
Which laptop brands have listings under €300 in Vienna right now?
Narrow before ranking deals. willhaben_find_deals compares each listing against the median of its result set, so the query has to describe one kind of item. Searching thinkpad mixes €900 laptops with €5 docking stations and every "discount" it reports is noise. Searching thinkpad x1 carbon inside category 5831 (Notebooks) with priceFrom: 150 gives a median worth measuring against.
Watch for `suspiciouslyCheap`. Any listing under 20% of the median is flagged. Sometimes that's a genuine bargain; more often it's a placeholder price, a parts-only listing, or bait. The flag is a prompt to read the ad, not a verdict.
Sniping. Combine sort: "newest" with maxAgeHours: 2 to see only what appeared in the last couple of hours.
Find me underpriced ThinkPad X1 Carbons from private sellers in Vienna, posted in
the last day, and tell me which are worth messaging about.
The agent chains willhaben_discover_filters → willhaben_find_deals → willhaben_get_ad on the top candidates to check seller age and ad text.
Notes from the HAR analysis, since none of this is documented publicly:
/webapi/ route returns a bare 400 with an empty body without it. This looks exactly like a malformed query parameter and is the single easiest thing to get stuck on.navigatorGroups[], where each facet declares the query parameter it maps to and every legal value with a hit count. willhaben_discover_filters is a thin projection of that, which is why it stays correct when willhaben adds categories.1 newest, 3 price ascending, 4 price descending, 0 relevance.publicapi.willhaben.at and api.willhaben.at both refuse anonymous callers. The ad page is Next.js, so the full payload is read from __NEXT_DATA__, using the lighter /_next/data/ /...json route when the buildId is known and falling back to HTML when willhaben redeploys and the id rotates.src/normalize.ts flattens it.Requests are serialised through a single queue with a 400 ms floor between them, plus exponential backoff with jitter on 429/5xx. Please leave that in place.
Be aware that willhaben's robots.txt states *"It is expressively forbidden to use spiders, search robots or other automatic methods to access willhaben.at"*, disallows /webapi/, and specifically disallows the keyword, PRICE_FROM, PRICE_TO and periode parameters this server uses. Their Terms of Use likewise prohibit automated copying without consent. This tool performs exactly that kind of access.
That is a real constraint, not a formality: it's your account that would be suspended. This is built for personal, low-volume, occasional use against your own account. Don't point it at bulk collection, don't redistribute the data, and don't run it on a tight schedule.
aliildan/willhaben-mcp covers more verticals (cars, real estate, jobs) but is anonymous-only and has no price analysis. If you want broad read-only browsing rather than deal hunting on the marketplace, use that one instead.
A port of jnslmk/kleinanzeigen-mcp (Python) to TypeScript, covering kleinanzeigen.de, Germany's largest classifieds site. No account needed.
| Tool | Purpose |
|---|---|
kleinanzeigen_search | Search by keyword, location, radius and price; auto-paginates |
kleinanzeigen_search_by_url | Search from a pasted Kleinanzeigen URL, keeping filters the structured search can't express |
kleinanzeigen_get_listing | Full detail for one ad: description, images, seller, attributes |
kleinanzeigen_get_listings_batch | Full detail for several ids at once — the normal follow-up to a search |
kleinanzeigen_parse_search_url | Explain which filters a URL encodes. Makes no network request |
The intended flow is kleinanzeigen_search → pick interesting ids → kleinanzeigen_get_listings_batch. Search result
ตัดมาแค่ช่วงต้น อ่านต่อใน repo