
Security News
Happy Birthday, Shai-Hulud
It has been one year since Shai-Hulud made its first appearance on npm.
kanzeigen-mcp
Advanced tools
A read-only, robots-clean MCP server over kleinanzeigen.de, the German classifieds site.
| Tool | What it answers | Requests |
|---|---|---|
search_listings | One page of listings matching a search query. | 1 |
get_listing | One listing in full, by ad id. | 1 |
get_shop | Profile and listings for one commercial seller. | 1 |
find_category | Category ids matching a name. | 0 — bundled dataset |
find_location | Location ids matching a name. | 0 — bundled dataset |
find_shop | Shop slugs for commercial sellers matching a name. | 1 |
Node 22 or newer is required. Four channels install the same build from the same release — they differ only in who does the fetching, and nothing propagates between them.
| Channel | Who it is for | Line |
|---|---|---|
| npm / npx — primary | anyone with an MCP client | npx -y kanzeigen-mcp |
| Claude Code | one line, no JSON | claude mcp add kleinanzeigen -- npx -y kanzeigen-mcp |
| Claude Desktop | no JSON editing at all | download the .mcpb from a release and open it |
| Claude Code plugin | the server and the skill together | /plugin marketplace add IIxauII/kleinanzeigen-mcp |
| run-from-clone | development | Development |
The package is kanzeigen-mcp.
There is no install step and nothing to build. Point your client at npx and let it fetch the package on first run:
{
"mcpServers": {
"kleinanzeigen": {
"command": "npx",
"args": ["-y", "kanzeigen-mcp"]
}
}
}
That block goes in your client's config file — claude_desktop_config.json for Claude Desktop, .mcp.json for Claude Code, the equivalent for anything else. Restart the client afterwards.
To verify by hand, without a client:
npx -y kanzeigen-mcp
claude mcp add kleinanzeigen -- npx -y kanzeigen-mcp
Any environment assignment goes before the --. Everything after the -- is the command Claude Code runs, so a variable placed there becomes an argument to npx rather than an environment variable:
claude mcp add kleinanzeigen -e KLEINANZEIGEN_MCP_RATE_LIMIT_MS=3000 -- npx -y kanzeigen-mcp
Download kanzeigen-mcp-<version>.mcpb from the latest release and open it. Claude Desktop installs it and offers the one knob below as a form field, so nothing here needs a config file.
Two things are worth knowing before you pick it. The bundle ships unsigned, so the install dialog warns — self-signing fails its own verification, and a real certificate is a purchase nobody has made. And the format has no update mechanism: an installed .mcpb is as current as the day it was downloaded, and nothing will ever prompt you.
/plugin marketplace add IIxauII/kleinanzeigen-mcp
/plugin install kanzeigen@kanzeigen
KLEINANZEIGEN_MCP_RATE_LIMIT_MS — the minimum gap between requests, in milliseconds.
{
"mcpServers": {
"kleinanzeigen": {
"command": "npx",
"args": ["-y", "kanzeigen-mcp"],
"env": { "KLEINANZEIGEN_MCP_RATE_LIMIT_MS": "3000" }
}
}
}
Run from a clone. This is the development path rather than an install channel — it is the only one that yields a tree the drift check and the fixture-capture scripts can run in.
git clone git@github.com:IIxauII/kleinanzeigen-mcp.git
cd kleinanzeigen-mcp
npm install
npm run build
npm run build produces a single-file ESM bundle at dist/index.js plus two sidecar datasets beside it. Point a client at it by absolute path:
{
"mcpServers": {
"kleinanzeigen": {
"command": "node",
"args": ["/absolute/path/to/kleinanzeigen-mcp/dist/index.js"]
}
}
}
npm test # the whole suite
npm run typecheck # tsc --noEmit, which is the real typecheck
npm run build # tsup, into dist/
Parser tests run against committed fixtures: hand-captured out of band by a dev-time script — never by the server — minimised to the DOM the parser actually reads, and redacted. The redaction rule is everything personal or identifying in the captured markup, including attributes the parser never reads: a pass aimed only at the fields the parser touches is how partner-ad ids and shop names once survived in tracking attributes. A test pins the rule.
Maintainer procedure — regenerating the two bundled datasets, running the drift check, and cutting a release — lives in docs/maintenance.md, because it addresses someone standing in a clone rather than someone who installed this.
Further reading: SPEC.md for the full contract, CONTEXT.md for the vocabulary every name in the codebase uses, and docs/adr/ for the decisions behind the posture.
FAQs
A read-only, robots-clean MCP server over kleinanzeigen.de
The npm package kanzeigen-mcp receives a total of 25 weekly downloads. As such, kanzeigen-mcp popularity was classified as not popular.
We found that kanzeigen-mcp demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Security News
It has been one year since Shai-Hulud made its first appearance on npm.

Research
/Security News
Operators behind PolinRider used a compromised GitHub account to plant malware in four development versions of a Packagist package with 700,000+ downloads.

Security News
GitHub Actions now supports cache-mode, a least-privilege control on the Actions cache aimed at the cache poisoning technique behind recent compromises.