Skip to main content
Glama

Joomil — Swiss Classifieds MCP

search_classifieds

Read-only

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.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
qNoFull-text search query (searches title and description)
sortNoSort order: recent (newest first, default), price_asc, price_desc, views
limitNoResults per page (1–50, default 20)
cantonNoSwiss 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.
cat_idNoCategory ID filter — includes subcategories automatically. Use get_categories to browse available categories.
offsetNoPagination offset. Use next_offset from previous response to get next page.
locationNoCity name or postal code (NPA) — partial match
price_maxNoMaximum price in CHF (inclusive)
price_minNoMinimum price in CHF (inclusive)

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitYes
totalYes
offsetYes
resultsYes
has_moreYes
next_offsetYes
filtered_outYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedInput schema / properties / canton / description
      Previous value: -"Swiss canton filter. Examples: Geneve, Vaud, Valais, Fribourg, Neuchatel, Berne, Jura"New value: +"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."
    • addedInput schema / properties / canton / enum
      Added value: +[
      +  "Geneve",
      +  "Vaud",
      +  "Valais",
      +  "Fribourg",
      +  "Neuchatel",
      +  "Jura",
      +  "Bern",
      +  "Argovie",
      +  "Zurich",
      +  "Lucerne",
      +  "Bale-Ville",
      +  "Etranger"
      +]
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "filtered_out": {
      +      "type": "number"
      +    },
      +    "has_more": {
      +      "type": "boolean"
      +    },
      +    "limit": {
      +      "type": "number"
      +    },
      +    "next_offset": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "offset": {
      +      "type": "number"
      +    },
      +    "results": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "category": {
      +            "anyOf": [
      +              {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "id": {
      +                    "type": "number"
      +                  },
      +                  "name": {
      +                    "type": "string"
      +                  },
      +                  "url": {
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "id",
      +                  "name",
      +                  "url"
      +                ],
      +                "type": "object"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "created_at": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "description": {
      +            "type": "string"
      +          },
      +          "has_picture": {
      +            "type": "boolean"
      +          },
      +          "id": {
      +            "type": "number"
      +          },
      +          "location": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "canton": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "city": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "country": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "postal_code": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              }
      +            },
      +            "required": [
      +              "city",
      +              "postal_code",
      +              "canton",
      +              "country"
      +            ],
      +            "type": "object"
      +          },
      +          "price": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "amount": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "currency": {
      +                "const": "CHF",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "amount",
      +              "currency"
      +            ],
      +            "type": "object"
      +          },
      +          "seller": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "certified": {
      +                "type": "boolean"
      +              },
      +              "name": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              }
      +            },
      +            "required": [
      +              "name",
      +              "certified"
      +            ],
      +            "type": "object"
      +          },
      +          "title": {
      +            "type": "string"
      +          },
      +          "url": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "title",
      +          "price",
      +          "location",
      +          "category",
      +          "url",
      +          "created_at",
      +          "has_picture",
      +          "seller"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "total": {
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "results",
      +    "total",
      +    "limit",
      +    "offset",
      +    "has_more",
      +    "next_offset",
      +    "filtered_out"
      +  ],
      +  "type": "object"
      +}
  2. First observed

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds valuable context beyond the read-only annotations: it discloses pagination, field truncation (300 chars), and the fact that listings are public. This helps the agent anticipate the response shape and behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded with purpose, and every sentence adds information. It avoids fluff and is appropriately sized for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 9 optional parameters, existing output schema, and annotations, the description covers purpose, usage, return content, and alternatives. It is complete enough for an agent to confidently invoke the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents all parameters with 100% coverage, but the description adds cross-parameter semantics ('All parameters are optional' and 'call with no arguments to browse latest listings'), which is not present in the schema. This justifies a score above the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Search') and resource ('classified ads on Joomil.ch'), and clearly differentiates from siblings by explicitly directing users to get_classified for full details. It also mentions the marketplace context, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states that all parameters are optional and encourages no-argument calls for browsing. It names the sibling tool get_classified as an alternative for fetching full details, providing clear when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.