Joomil — Swiss Classifieds MCP
Search Swiss classifieds on Joomil.ch — top marketplace in French-speaking Switzerland since 2007.
我該用這個嗎
品質與安全性
根據工具定義與協定合規性的自動化分析。
上下文成本
這是每次將伺服器的工具載入模型上下文時所消耗的約略 token 數量。數量越高,可用於其他工作的注意力就越少。
安裝
一鍵安裝
將以下內容加入你的 `claude_desktop_config.json` 檔案:
{
"mcpServers": {
"joomil": {
"url": "https://joomil-mcp.snowy-surf-deec.workers.dev/mcp"
}
}
}遠端端點
https://joomil-mcp.snowy-surf-deec.workers.dev/mcpstreamable-http它能做什麼
工具清單
工具(5)
🟢suggest_filters(query)
Infer search_classifieds filters from a natural-language query. Use this before search_classifieds when the user mentions a category, location, canton or price in free text. Returns a ready-to-use filters object, a category confidence score and warnings for uncertain matches.
輸入結構描述
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1,
"description": "Natural-language search request, e.g. 'appartement 3 pièces à Sion' or 'Tesla Model 3 moins de 25000 CHF'."
}
},
"required": [
"query"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}輸出結構描述
{
"type": "object",
"properties": {
"query": {
"type": "string"
},
"filters": {
"type": "object",
"properties": {
"q": {
"type": [
"string",
"null"
]
},
"cat_id": {
"type": [
"number",
"null"
]
},
"canton": {
"anyOf": [
{
"type": "string",
"enum": [
"Geneve",
"Vaud",
"Valais",
"Fribourg",
"Neuchatel",
"Jura",
"Bern",
"Argovie",
"Zurich",
"Lucerne",
"Bale-Ville",
"Etranger"
]
},
{
"type": "null"
}
]
},
"location": {
"type": [
"string",
"null"
]
},
"price_min": {
"type": [
"number",
"null"
]
},
"price_max": {
"type": [
"number",
"null"
]
},
"sort": {
"type": "string",
"enum": [
"recent",
"price_asc",
"price_desc",
"views"
]
},
"limit": {
"type": "number"
}
},
"required": [
"q",
"cat_id",
"canton",
"location",
"price_min",
"price_max",
"sort",
"limit"
],
"additionalProperties": false
},
"category": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "number"
},
"name": {
"type": "string"
},
"url": {
"type": "string"
},
"parent_id": {
"type": "number"
},
"confidence": {
"type": "number"
},
"reason": {
"type": "string"
}
},
"required": [
"id",
"name",
"url",
"parent_id",
"confidence",
"reason"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"confidence": {
"type": "number"
},
"warnings": {
"type": "array",
"items": {
"type": "string"
}
},
"next_step": {
"type": "string"
}
},
"required": [
"query",
"filters",
"category",
"confidence",
"warnings",
"next_step"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢search_classifieds(q, cat_id, canton, location, price_min, ...)
Search classified ads on Joomil.ch — Switzerland's leading French-speaking classifieds marketplace (since 2007). Returns a paginated list of public listings with title, description (truncated to 300 chars), price, location, category and vendor info. All parameters are optional — call with no arguments to browse the latest listings. Use get_classified to fetch full details of a specific listing.
輸入結構描述
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Full-text search query (searches title and description)"
},
"cat_id": {
"type": "integer",
"exclusiveMinimum": 0,
"description": "Category ID filter — includes subcategories automatically. Use get_categories to browse available categories."
},
"canton": {
"type": "string",
"enum": [
"Geneve",
"Vaud",
"Valais",
"Fribourg",
"Neuchatel",
"Jura",
"Bern",
"Argovie",
"Zurich",
"Lucerne",
"Bale-Ville",
"Etranger"
],
"description": "Swiss canton filter — strict enum. Use get_cantons for the official list. WARNING: values are API-specific (e.g. 'Bern' not 'Berne', 'Geneve' not 'Genève'/'Geneva'). Supported: Geneve, Vaud, Valais, Fribourg, Neuchatel, Jura, Bern, Argovie, Zurich, Lucerne, Bale-Ville, Etranger."
},
"location": {
"type": "string",
"description": "City name or postal code (NPA) — partial match"
},
"price_min": {
"type": "number",
"minimum": 0,
"description": "Minimum price in CHF (inclusive)"
},
"price_max": {
"type": "number",
"minimum": 0,
"description": "Maximum price in CHF (inclusive)"
},
"sort": {
"type": "string",
"enum": [
"recent",
"price_asc",
"price_desc",
"views"
],
"description": "Sort order: recent (newest first, default), price_asc, price_desc, views"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"description": "Results per page (1–50, default 20)"
},
"offset": {
"type": "integer",
"minimum": 0,
"description": "Pagination offset. Use next_offset from previous response to get next page."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}輸出結構描述
{
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "number"
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"price": {
"type": "object",
"properties": {
"amount": {
"type": [
"number",
"null"
]
},
"currency": {
"type": "string",
"const": "CHF"
}
},
"required": [
"amount",
"currency"
],
"additionalProperties": false
},
"location": {
"type": "object",
"properties": {
"city": {
"type": [
"string",
"null"
]
},
"postal_code": {
"type": [
"string",
"null"
]
},
"canton": {
"type": [
"string",
"null"
]
},
"country": {
"type": [
"string",
"null"
]
}
},
"required": [
"city",
"postal_code",
"canton",
"country"
],
"additionalProperties": false
},
"category": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "number"
},
"name": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"id",
"name",
"url"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"url": {
"type": "string"
},
"created_at": {
"type": [
"string",
"null"
]
},
"has_picture": {
"type": "boolean"
},
"seller": {
"type": "object",
"properties": {
"name": {
"type": [
"string",
"null"
]
},
"certified": {
"type": "boolean"
}
},
"required": [
"name",
"certified"
],
"additionalProperties": false
}
},
"required": [
"id",
"title",
"price",
"location",
"category",
"url",
"created_at",
"has_picture",
"seller"
],
"additionalProperties": false
}
},
"total": {
"type": "number"
},
"limit": {
"type": "number"
},
"offset": {
"type": "number"
},
"has_more": {
"type": "boolean"
},
"next_offset": {
"type": [
"number",
"null"
]
},
"filtered_out": {
"type": "number"
}
},
"required": [
"results",
"total",
"limit",
"offset",
"has_more",
"next_offset",
"filtered_out"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢get_classified(id)
Get full details of a single classified ad on Joomil.ch by its numeric ID. Returns complete description, all images URLs, category breadcrumb (full_path), vendor info (name, certified status, pro company), expiry date and boost level. Use search_classifieds first to find relevant listing IDs.
輸入結構描述
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"exclusiveMinimum": 0,
"description": "Numeric listing ID — visible in the URL and in search_classifieds results"
}
},
"required": [
"id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}輸出結構描述
{
"type": "object",
"properties": {
"id": {
"type": "number"
},
"title": {
"type": "string"
},
"description": {
"type": [
"string",
"null"
]
},
"price": {
"type": "object",
"properties": {
"amount": {
"type": [
"number",
"null"
]
},
"currency": {
"type": "string",
"const": "CHF"
}
},
"required": [
"amount",
"currency"
],
"additionalProperties": false
},
"location": {
"type": "object",
"properties": {
"city": {
"type": [
"string",
"null"
]
},
"postal_code": {
"type": [
"string",
"null"
]
},
"canton": {
"type": [
"string",
"null"
]
},
"country": {
"type": [
"string",
"null"
]
}
},
"required": [
"city",
"postal_code",
"canton",
"country"
],
"additionalProperties": false
},
"category": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "number"
},
"name": {
"type": "string"
},
"url": {
"type": "string"
},
"path": {
"type": [
"string",
"null"
]
}
},
"required": [
"id",
"name",
"url",
"path"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"url": {
"type": "string"
},
"created_at": {
"type": [
"string",
"null"
]
},
"has_picture": {
"type": "boolean"
},
"seller": {
"type": "object",
"properties": {
"name": {
"type": [
"string",
"null"
]
},
"certified": {
"type": "boolean"
},
"type": {
"type": "string",
"enum": [
"pro",
"private"
]
},
"company": {
"type": [
"string",
"null"
]
}
},
"required": [
"name",
"certified",
"type",
"company"
],
"additionalProperties": false
},
"images": {
"type": "array",
"items": {
"type": "string"
}
},
"expires_at": {
"type": [
"string",
"null"
]
},
"boost": {
"type": [
"number",
"null"
]
}
},
"required": [
"id",
"title",
"description",
"price",
"location",
"category",
"url",
"created_at",
"has_picture",
"seller",
"images",
"expires_at",
"boost"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢get_categories(parent_id)
List active categories of the Joomil.ch marketplace. Returns a flat list with parent_id for hierarchy reconstruction. Omit parent_id for all categories, use parent_id=0 for root categories only, or pass a specific ID to get direct children of that category.
輸入結構描述
{
"type": "object",
"properties": {
"parent_id": {
"type": "integer",
"minimum": 0,
"description": "Filter to direct children of this category ID. Omit for all categories. Use 0 for root categories only."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}輸出結構描述
{
"type": "object",
"properties": {
"categories": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "number"
},
"name": {
"type": "string"
},
"url": {
"type": "string"
},
"parent_id": {
"type": "number"
},
"ad_count": {
"type": "number"
},
"allow_ads": {
"type": "boolean"
}
},
"required": [
"id",
"name",
"url",
"parent_id"
],
"additionalProperties": true
}
},
"total": {
"type": "number"
}
},
"required": [
"categories",
"total"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢get_cantons
List the Swiss cantons supported by Joomil's `canton` filter. Returns the exact `name` value to pass to search_classifieds, plus a readable French label. Call this before filtering by canton — the API values are non-obvious (e.g. 'Bern' not 'Berne', 'Geneve' not 'Genève' or 'Geneva').
輸入結構描述
{
"type": "object",
"properties": {},
"$schema": "http://json-schema.org/draft-07/schema#"
}輸出結構描述
{
"type": "object",
"properties": {
"cantons": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"label_fr": {
"type": "string"
},
"code": {
"type": [
"string",
"null"
]
},
"region": {
"type": "string"
}
},
"required": [
"name",
"label_fr",
"code",
"region"
],
"additionalProperties": false
}
},
"total": {
"type": "number"
}
},
"required": [
"cantons",
"total"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}社群
證據