Skip to main content
Glama
googlarz

Vinted MCP and CLI Server

search_items

Search Vinted second-hand listings across 19 countries with rich filters for price, brand, category, size, color, and condition. Returns paginated results with item details.

Instructions

Search Vinted second-hand listings with rich filters across 19 country sites. Returns a paginated list of items — each with title, price, currency, brand, size, condition, photo URL, item URL, favourite count, and seller info. Use get_categories to discover valid categoryId values and search_brands to resolve brand names to IDs. For comprehensive multi-page results use search_all_items instead.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
queryYesSearch keywords, e.g. "Nike Air Max 90" or "levi 501 jeans"
countryNoVinted country site to search (fr, de, uk, pl, es, nl, be, it, pt, cz, sk, hu, ro, lt, lv, ee, fi, at, se)fr
priceMinNoMinimum price in the local currency of the selected country
priceMaxNoMaximum price in the local currency of the selected country
brandIdsNoNumeric Vinted brand IDs from search_brands. Prefer the brand[] parameter for name-based lookup.
brandNoBrand names to filter by, e.g. ["Nike", "Adidas"]. Automatically resolved to IDs via search_brands.
categoryIdNoCategory ID from get_categories (e.g. 4 = women's clothing, 5 = men's clothing, 1231 = women's shoes)
sizeIdsNoSize IDs to filter by. Discover valid IDs by inspecting results from a previous search in the same category, or use get_size_groups to browse all size groups.
colorIdsNoColor IDs to filter by (e.g. [1] for black, [3] for white). Use get_colors to discover all available color IDs and their names.
conditionNoItem condition filter; multiple values are OR-ed together
sortByNoSort order for results. Defaults to relevance.
perPageNoResults per page, 1–96. Defaults to 20.
pageNoPage number starting at 1
dateFromNoReturn items listed on or after this date. ISO-8601 format, e.g. "2024-01-01"
dateToNoReturn items listed on or before this date. ISO-8601 format, e.g. "2024-12-31"

Implementation Reference

  • opSearch: The handler function for the 'search_items' tool. Validates query is present, then delegates to searchItems (from endpoints.ts).
    export async function opSearch(client: VintedClient, p: SearchParams): Promise<SearchResult> {
      if (!p.query?.trim()) throw new Error('query is required');
      return searchItems(client, p);
    }
  • searchItems: Core implementation that builds the Vinted catalog API path, makes the HTTP request via VintedClient.apiGet, maps the raw response items into structured Item objects, and returns SearchResult.
    export async function searchItems(client: VintedClient, p: SearchParams): Promise<SearchResult> {
      const country = p.country ?? 'fr';
      const data = await client.apiGet<{
        items: any[];
        pagination?: { total_entries?: number };
      }>(country, buildSearchPath(p));
    
      const items: Item[] = (data.items ?? []).map((i) => ({
        id: Number(i.id),
        title: String(i.title ?? ''),
        price: String(i.price?.amount ?? i.price ?? ''),
        currency: String(i.price?.currency_code ?? i.currency ?? ''),
        brand: i.brand_title ?? i.brand,
        size: i.size_title ?? i.size,
        condition: i.status,
        url: i.url ?? `https://${DOMAIN[country]}/items/${i.id}`,
        favouriteCount: i.favourite_count,
        photoUrl: i.photo?.url ?? i.photos?.[0]?.url,
        seller: {
          id: Number(i.user?.id ?? 0),
          username: String(i.user?.login ?? i.user?.username ?? ''),
        },
      }));
    
      return {
        totalCount: data.pagination?.total_entries ?? items.length,
        page: p.page ?? 1,
        items,
      };
    }
  • SearchParams: Defines all input parameters accepted by searchItems (query, country, priceMin/Max, brandIds, categoryId, sizeIds, colorIds, condition, sortBy, perPage, page, dateFrom, dateTo).
    export interface SearchParams {
      query: string;
      country?: Country;
      priceMin?: number;
      priceMax?: number;
      brandIds?: number[];
      categoryId?: number;
      sizeIds?: number[];
      colorIds?: number[];
      condition?: Condition[];
      sortBy?: SortBy;
      perPage?: number;
      page?: number;
      dateFrom?: string;  // ISO date e.g. "2024-01-01"
      dateTo?: string;
    }
  • SearchResult: Defines the return type (totalCount, page, items array of Item objects).
    export interface SearchResult {
      totalCount: number;
      page: number;
      items: Item[];
    }
  • src/mcp.ts:20-45 (registration)
    Registration of the 'search_items' tool in the MCP TOOLS array with its name, description, and inputSchema defining all accepted parameters.
    const TOOLS = [
      {
        name: 'search_items',
        description: 'Search Vinted second-hand listings with rich filters across 19 country sites. Returns a paginated list of items — each with title, price, currency, brand, size, condition, photo URL, item URL, favourite count, and seller info. Use get_categories to discover valid categoryId values and search_brands to resolve brand names to IDs. For comprehensive multi-page results use search_all_items instead.',
        inputSchema: {
          type: 'object',
          properties: {
            query: { type: 'string', description: 'Search keywords, e.g. "Nike Air Max 90" or "levi 501 jeans"' },
            country: { type: 'string', enum: COUNTRIES, default: 'fr', description: 'Vinted country site to search (fr, de, uk, pl, es, nl, be, it, pt, cz, sk, hu, ro, lt, lv, ee, fi, at, se)' },
            priceMin: { type: 'number', description: 'Minimum price in the local currency of the selected country' },
            priceMax: { type: 'number', description: 'Maximum price in the local currency of the selected country' },
            brandIds: { type: 'array', items: { type: 'integer' }, description: 'Numeric Vinted brand IDs from search_brands. Prefer the brand[] parameter for name-based lookup.' },
            brand: { type: 'array', items: { type: 'string' }, description: 'Brand names to filter by, e.g. ["Nike", "Adidas"]. Automatically resolved to IDs via search_brands.' },
            categoryId: { type: 'integer', description: 'Category ID from get_categories (e.g. 4 = women\'s clothing, 5 = men\'s clothing, 1231 = women\'s shoes)' },
            sizeIds: { type: 'array', items: { type: 'integer' }, description: 'Size IDs to filter by. Discover valid IDs by inspecting results from a previous search in the same category, or use get_size_groups to browse all size groups.' },
            colorIds: { type: 'array', items: { type: 'integer' }, description: 'Color IDs to filter by (e.g. [1] for black, [3] for white). Use get_colors to discover all available color IDs and their names.' },
            condition: { type: 'array', items: { type: 'string', enum: ['new_with_tags', 'new_without_tags', 'very_good', 'good', 'satisfactory'] }, description: 'Item condition filter; multiple values are OR-ed together' },
            sortBy: { type: 'string', enum: ['relevance', 'price_low_to_high', 'price_high_to_low', 'newest_first'], description: 'Sort order for results. Defaults to relevance.' },
            perPage: { type: 'integer', description: 'Results per page, 1–96. Defaults to 20.' },
            page: { type: 'integer', description: 'Page number starting at 1' },
            dateFrom: { type: 'string', description: 'Return items listed on or after this date. ISO-8601 format, e.g. "2024-01-01"' },
            dateTo: { type: 'string', description: 'Return items listed on or before this date. ISO-8601 format, e.g. "2024-12-31"' },
          },
          required: ['query'],
        },
      },
Behavior4/5

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

No annotations provided, so description carries full burden. It details the return fields (title, price, etc.) and mentions pagination and 19 country sites. Could improve by noting authentication or rate limits, but overall sufficiently transparent.

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?

Three sentences: first states purpose, second details return fields, third provides usage guidance. Front-loaded and no unnecessary words.

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

Completeness4/5

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

With 15 params and no output schema or annotations, description covers core behavior, return structure, and related tools. Missing mention of authentication, but sufficient for agent decision-making.

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?

Schema coverage is 100% (baseline 3). Description adds value by explaining how to get category IDs (get_categories), brand resolution (search_brands), and size IDs (get_size_groups), going beyond schema descriptions.

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 clearly states 'Search Vinted second-hand listings with rich filters across 19 country sites', specifying the verb 'search' and resource 'listings'. It distinguishes itself from sibling tools like search_all_items and get_item.

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?

Explicitly advises using get_categories for category IDs and search_brands for brand IDs, and directly says to use search_all_items for comprehensive multi-page results, providing clear when-to-use and alternatives.

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

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/googlarz/vinted-mcp-cli'

If you have feedback or need assistance with the MCP directory API, please join our Discord server