프로토타입 · 미리 보기: 공식 레지스트리의 모든 서버를 담고 있으며 30분마다 동기화해요. 리뷰와 계정 기능은 다음 단계에서 열려요.
PopNx MCPAI를 쓰는 사람을 위한 MCP 서버 · 쉬운 말로 설명해요

kleinanzeigen-mcp

제작자: taneron버전 0.1.0i★ –i내 컴퓨터에서 실행
레지스트리 이름io.github.taneron/kleinanzeigen

설치

개요

제작자가 쓴 설명(영어 원문)

Search Kleinanzeigen.de, Germany's largest classifieds site, for second-hand listings

PopNx MCP의 세 기둥

이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.

할 수 있는 일

이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.

  • 연결 방식: 내 컴퓨터에서 실행
  • 전송 방식: stdio
  • 카테고리: 검색 및 AI 기억

설치

쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.

설치하기 전에

  • 기본 점검: 1개 중 1개 통과
  • 내 컴퓨터에서 내 사용자 계정의 권한(파일, 네트워크, 앱)으로 실행돼요.
  • 직접 입력할 값: WILLMEHR_MODE, KZ_MIN_INTERVAL_MS, KZ_MAX_PAGE_COUNT, KZ_MAX_BATCH_SIZE, TZ

필요한 것

  • npmNode.js 설치(npx 명령어용)

어떤 앱을 쓰세요?

위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.

Claude Desktop → Settings → Developer → Edit Config를 열고 claude_desktop_config.json에 이 내용을 붙여 넣으세요

{
  "mcpServers": {
    "kleinanzeigen": {
      "command": "npx",
      "args": [
        "-y",
        "kleinanzeigen-mcp"
      ],
      "env": {
        "WILLMEHR_MODE": "your-value",
        "KZ_MIN_INTERVAL_MS": "your-value",
        "KZ_MAX_PAGE_COUNT": "your-value",
        "KZ_MAX_BATCH_SIZE": "your-value",
        "TZ": "your-value"
      }
    }
  }
}

터미널에서 이 명령어를 실행하세요

claude mcp add kleinanzeigen --env WILLMEHR_MODE=your-value --env KZ_MIN_INTERVAL_MS=your-value --env KZ_MAX_PAGE_COUNT=your-value --env KZ_MAX_BATCH_SIZE=your-value --env TZ=your-value -- npx -y kleinanzeigen-mcp

실행하기 전에 빈 값을 채워 주세요.

Cursor에서 열기

또는 설정을 직접 복사하기

프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요

{
  "mcpServers": {
    "kleinanzeigen": {
      "command": "npx",
      "args": [
        "-y",
        "kleinanzeigen-mcp"
      ],
      "env": {
        "WILLMEHR_MODE": "your-value",
        "KZ_MIN_INTERVAL_MS": "your-value",
        "KZ_MAX_PAGE_COUNT": "your-value",
        "KZ_MAX_BATCH_SIZE": "your-value",
        "TZ": "your-value"
      }
    }
  }
}

브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.

VS Code에서 열기

또는 설정을 직접 복사하기

프로젝트의 .vscode/mcp.json에 붙여 넣으세요

{
  "servers": {
    "kleinanzeigen": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "kleinanzeigen-mcp"
      ],
      "env": {
        "WILLMEHR_MODE": "your-value",
        "KZ_MIN_INTERVAL_MS": "your-value",
        "KZ_MAX_PAGE_COUNT": "your-value",
        "KZ_MAX_BATCH_SIZE": "your-value",
        "TZ": "your-value"
      }
    }
  }
}

브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.

이 서버는 내 컴퓨터에서 실행되는데, ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요. 다른 앱을 고르세요.

선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.

직접 입력할 값

  • WILLMEHR_MODE env
    'full' (default) for a local install; 'public' paces requests and lowers the page and batch caps for an instance shared by several people.
  • KZ_MIN_INTERVAL_MS env
    Minimum spacing between requests to kleinanzeigen.de, in milliseconds. Concurrency trips the site's bot detection, so requests are serialised.
  • KZ_MAX_PAGE_COUNT env
    Cap on result pages a single search may fetch, roughly 25 listings each.
  • KZ_MAX_BATCH_SIZE env
    Cap on listing ids per batch detail call.
  • TZ env
    Listing timestamps are printed without a timezone; set Europe/Berlin to interpret them exactly.

이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.

할 수 있는 일

내 컴퓨터에서 실행돼요. 설치하면 AI 앱에 도구 목록이 나타나요.

기본 점검i

누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 7일 점검

  • ✓ 통과

    제작자와 저장소 일치

    레지스트리 이름이 GitHub 계정 taneron 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요

  • … 아직 점검 안 함

    계속 관리되고 있음

    아직 GitHub에서 이 저장소를 읽어 오지 않았어요

  • … 아직 점검 안 함

    라이선스 있음

    아직 GitHub에서 이 저장소를 읽어 오지 않았어요

  • – 해당 없음

    엔드포인트 응답

    내 컴퓨터에서 실행되는 서버라 인터넷 엔드포인트가 없어요

  • – 해당 없음

    OAuth로 로그인

    내 컴퓨터에서 실행되며, 대신 로컬 설정을 사용해요

  • … 아직 점검 안 함

    도구 설명에 숨겨진 지시 없음

    내 컴퓨터에서 실행돼요. 도구 목록은 인터넷 엔드포인트가 있는 서버에서만 읽을 수 있어요

검색 및 AI 기억 카테고리의 다른 서버와 비교i

  • 이 카테고리의 다른 서버 7275개 중 0%보다 스타가 많아요
  • 이 카테고리의 다른 서버 7275개 중 36%보다 최근에 레지스트리에 공개됐어요
  • 기본 점검 결과가 이 카테고리의 다른 서버 7275개 중 100%와 같거나 더 좋아요

레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.

자주 묻는 질문

kleinanzeigen-mcp, 안전한가요?

해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.

어떤 키나 코드가 필요한가요?

레지스트리에 필수 키가 나와 있지 않아요. 다만 처음 쓸 때 로그인을 요구하는 서버도 있어요.

내 컴퓨터에서 실행되나요, 클라우드에서 실행되나요?

내 컴퓨터에서 실행돼요. AI 앱이 필요할 때 실행하고, 데이터는 제작자의 서버를 거치지 않아요(서버 자체가 온라인 서비스를 호출하는 경우는 제외).

아직 관리되고 있나요?

GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(0.1.0)은 2개월 전 레지스트리에 올라왔어요.

어떤 앱에서 쓸 수 있나요?

Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. 내 컴퓨터에 Node.js도 있어야 해요.

대신 쓸 수 있는 건 뭐가 있나요?

같은 카테고리에는: Context7, Codebase Memory, Exa

대안

같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.

카드 보는 법:★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i

Context7

제작자: upstash

Up-to-date docs for AI agents

컴퓨터 또는 클라우드★ 64,224MIT어제 업데이트
설치

Codebase Memory

제작자: DeusData

Codebase knowledge graph for AI agents — 162 languages, sub-ms queries, 99% fewer tokens.

내 컴퓨터에서 실행★ 48,148MIT21일 전 업데이트
설치

Exa

제작자: exa-labs

Connect AI agents to Exa for web search, content fetching, and multi-step research.

클라우드에서 실행★ 5,213MIT지난달 업데이트
설치

제작자의 README

README 열기

제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.

willmehr

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:

ServerSiteEntry point
willmehrwillhaben.at (Austria)dist/index.js
kleinanzeigen-mcpkleinanzeigen.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.

Quick start

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.

Modes

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 toolsregisterednot registered
.env / WILLHABEN_COOKIEloadednever read; ignored with a warning on stderr
willhaben request spacing400 ms900 ms
Kleinanzeigen spacing / pages / batch800 ms / 5 / 201500 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.

willhaben

What it does

Four public tools, no account needed:

ToolPurpose
willhaben_searchSearch the marketplace with structured filters; auto-paginates
willhaben_get_adFull detail for one ad: description, images, seller trust signals
willhaben_find_dealsPrice the market for a query, rank listings below the median
willhaben_discover_filtersResolve willhaben's opaque numeric category/brand ids

Four account tools, requiring a session cookie:

ToolPurpose
willhaben_my_profileYour profile and numeric user id
willhaben_my_watchlistAds saved to your watchlist
willhaben_my_conversationsRecent buyer/seller chats
willhaben_my_alert_countNumber of active saved-search alerts

Install

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=..." } } } }

Authentication

willhaben authenticates through Keycloak with PKCE, so there is no username/password grant to automate. Instead, lift the session from a logged-in browser:

  1. Log in to willhaben.at, then visit your profile or messages so the page loads an authenticated endpoint.
  2. DevTools → Network → export dropdown → "Export HAR (with sensitive data)". The plain download button strips cookies and produces a file this cannot use.
  3. npm run session -- ~/Downloads/www.willhaben.at.har
  4. npm run check:auth

npm 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.

Sessions expire faster than the cookie claims

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.

Environment variables
VariableDefaultPurpose
WILLHABEN_COOKIE—Session cookie for account tools
WILLHABEN_CSRF_TOKENfrom cookieOverride the CSRF token
WILLHABEN_MIN_INTERVAL_MS400 (900 public)Minimum spacing between requests
WILLMEHR_MODEfullfull or public — see Modes

Using it well

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.

Example

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.

How it works

Notes from the HAR analysis, since none of this is documented publicly:

  • `x-wh-client` is required. Every /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.
  • Search needs no cookies at all. Only account routes do.
  • Filters are self-describing. Search responses carry 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.
  • Sort ids are undocumented integers. Verified empirically: 1 newest, 3 price ascending, 4 price descending, 0 relevance.
  • There is no public single-ad JSON endpoint. 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.
  • Every field arrives as a `{name, values[]}` bag. src/normalize.ts flattens it.

Rate limiting and terms

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.

Prior art

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.

Kleinanzeigen

A port of jnslmk/kleinanzeigen-mcp (Python) to TypeScript, covering kleinanzeigen.de, Germany's largest classifieds site. No account needed.

Tools

ToolPurpose
kleinanzeigen_searchSearch by keyword, location, radius and price; auto-paginates
kleinanzeigen_search_by_urlSearch from a pasted Kleinanzeigen URL, keeping filters the structured search can't express
kleinanzeigen_get_listingFull detail for one ad: description, images, seller, attributes
kleinanzeigen_get_listings_batchFull detail for several ids at once — the normal follow-up to a search
kleinanzeigen_parse_search_urlExplain which filters a URL encodes. Makes no network request

The intended flow is kleinanzeigen_search → pick interesting ids → kleinanzeigen_get_listings_batch. Search result

앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요

PopNx에게 묻기