Skip to main content
Glama
cvele

Polovnjak MCP

by cvele

Polovnjak MCP

Un servidor MCP multi-proveedor para mercados de vehículos usados. Los agentes obtienen una superficie de herramientas unificada: búsqueda, detalles de anuncios, estadísticas de precios, historial de precios y alertas de búsqueda guardadas por usuario, respaldada por adaptadores de mercado conectables. Adaptadores incluidos: polovniautomobili.com (id de fuente pa) y mojauto.rs (id de fuente ma), ambos de Serbia.

Los usuarios inician sesión con Google mediante el flujo estándar MCP OAuth 2.1; las alertas son privadas por usuario. Cada anuncio que el hub observa (de las búsquedas de cualquier usuario, muestreo de estadísticas o comprobaciones de alertas) se registra en una "memoria de mercado" compartida en Postgres que alimenta consultas de historial de precios y tendencias que ningún mercado individual ofrece.

Arquitectura

  • Adaptadores (src/adapters/) implementan una interfaz común SourceAdapter: search, getListing, getMakesModels, además de indicadores de capacidades. Cada adaptador traduce los filtros canónicos a la consulta de su proveedor y mapea los resultados de vuelta a un modelo de anuncio canónico. Los anuncios llevan ids compuestos como pa:12345678 o ma:3554254. Los nombres de marca se resuelven por alias por fuente ("VW" y "Volkswagen" funcionan en todas partes); los filtros que una fuente no puede expresar se informan como warnings por fuente en los resultados.

  • Herramientas (src/tools/) se distribuyen entre los adaptadores y fusionan los resultados, etiquetando todo con su fuente. Las categorías cubren coches, motocicletas, furgonetas, camiones ligeros/pesados, autobuses, remolques, caravanas, maquinaria, tractores, barcos y bicicletas.

  • Grabador (src/recorder.ts) inserta o actualiza cada anuncio observado en listings y añade una fila en price_observations en la primera aparición o cambio de precio.

  • Autenticación (src/auth/) es un servidor de autorización OAuth 2.1 autoalojado (registro dinámico de clientes, PKCE, tokens de refresco) con Google OIDC como capa de identidad. Los tokens se almacenan con hash en Postgres.

  • Almacenamiento es Postgres mediante Drizzle ORM; las migraciones se ejecutan automáticamente al inicio.

Related MCP server: Vehicle Database MCP Server

Inicio rápido (Docker Compose)

  1. Crea un cliente OAuth de Google en Google Cloud Console (tipo "Aplicación web") con URI de redirección autorizada <PUBLIC_URL>/auth/google/callback (por ejemplo, http://localhost:8321/auth/google/callback para uso local).

  2. Configura el entorno:

cp .env.example .env
# set GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET (and PUBLIC_URL for non-local deployments)
  1. Inicia todo (servidor MCP + Postgres + FlareSolverr):

docker compose up -d --build
  1. Apunta tu cliente MCP a http://localhost:8321/mcp. El cliente descubrirá los metadatos OAuth, se registrará y abrirá una ventana del navegador para iniciar sesión con Google. Todo lo demás es por usuario.

Para una prueba local rápida sin credenciales de Google, establece AUTH_MODE=none — el servidor omite la autenticación y usa un único usuario de desarrollo local.

Herramientas

Herramienta

Propósito

list_sources

Fuentes de mercado registradas con cobertura y indicadores de capacidades. Los ids de fuente se usan en el parámetro sources de otras herramientas y en los ids compuestos de anuncios.

search_listings

Una página de anuncios normalizados por fuente, fusionados y etiquetados por fuente. Filtros: categoría, marca/modelos, rangos de precio/año/kilometraje/potencia, combustible, carrocería, caja de cambios, región/ciudad, indicadores de estado. Los anuncios incluyen previousPrice cuando la fuente muestra un descuento; los warnings por fuente explican cualquier filtro que una fuente no pudo aplicar de forma nativa.

get_listing

Detalle completo de un anuncio por id compuesto (pa:12345678, ma:3554254), URL o id simple: especificaciones, equipamiento, descripción, fotos, contacto del vendedor.

get_makes_and_models

Taxonomía por fuente: marcas, modelos de una marca, regiones, valores de filtro aceptados, resolución de nombres de ciudad.

get_price_stats

Instantánea del mercado en vivo: min/p25/mediana/promedio/p75/max + desglose por año, por fuente y combinado, muestreado de hasta maxPages páginas de resultados por fuente.

get_price_history

Respondido a partir de las observaciones registradas por el propio hub: la línea de tiempo de precios de un anuncio individual (detección de cambios de precio) o una tendencia mes a mes para un segmento (marca/modelo/año). La cobertura crece con el uso.

create_watch / list_watches / delete_watch / check_watches

Búsquedas guardadas por usuario en una o más fuentes. check_watches devuelve solo los anuncios que aparecieron desde la última comprobación, ideal para una consulta diaria programada.

Habilidad de agente

El repositorio incluye una habilidad de agente en .cursor/skills/car-market-hub/SKILL.md que enseña a los agentes LLM cómo usar este servidor de manera efectiva (flujos de trabajo de herramientas, trampas), con guías de conexión por cliente para OpenAI, Claude, LibreChat y Cursor en clients.md. Cursor la recoge automáticamente; para otras plataformas, copia el directorio de la habilidad en la ubicación de habilidades de esa plataforma (por ejemplo, .claude/skills/) o pega su contenido en las instrucciones del agente.

Flujo de alertas

  1. create_watch con un nombre y filtros (opcionalmente restringido a sources específicas): las coincidencias actuales se convierten en la línea base.

  2. Más tarde (por ejemplo, una consulta programada: "revisa mis alertas de coches"), check_watches devuelve solo los anuncios que aparecieron desde entonces, por alerta y por fuente.

Añadir un nuevo adaptador de mercado

  1. Crea src/adapters/<name>/ e implementa la interfaz SourceAdapter de src/adapters/types.ts: elige un id corto y estable (usado en los ids compuestos de anuncios), traduce los filtros canónicos de SearchQuery a la consulta de tu proveedor y mapea los resultados brutos a las formas canónicas ListingSummary / ListingDetail de src/domain/listing.ts.

  2. Regístralo en src/server.ts con registerAdapter(...).

La distribución de búsquedas, las alertas, el grabado y el historial de precios recogen la nueva fuente automáticamente.

Variables de entorno

Variable

Valor por defecto

Significado

PORT

8080

Puerto de escucha HTTP.

PUBLIC_URL

http://localhost:<PORT>

URL base pública; emisor OAuth y host de devolución de llamada de Google.

DATABASE_URL

postgres://carhub:carhub@localhost:5432/carhub

Cadena de conexión a Postgres.

AUTH_MODE

oauth

oauth (OAuth 2.1 respaldado por Google) o none (un único usuario de desarrollo local, sin autenticación).

GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET

Credenciales OAuth de Google (requeridas en modo oauth).

FLARESOLVERR_URL

Instancia opcional de FlareSolverr para el respaldo ante desafíos de Cloudflare.

CACHE_TTL_MS

600000

TTL de caché de respuestas ascendentes.

FETCH_CONCURRENCY

5

Máximo de solicitudes ascendentes concurrentes por adaptador.

REQUEST_TIMEOUT_MS

25000

Tiempo de espera de solicitud ascendente.

Desarrollo local

npm install
docker compose up -d postgres        # or point DATABASE_URL at your own Postgres
AUTH_MODE=none npm run dev           # server on http://localhost:8080/mcp

Cambios de esquema: edita src/db/schema.ts y luego ejecuta npm run db:generate para generar una nueva migración en drizzle/ (se aplica automáticamente al inicio).

Notas y límites

  • polovniautomobili.com no tiene API pública; el adaptador lee los endpoints de datos Next.js del sitio usando suplantación de TLS de Chrome (impit), con FlareSolverr como respaldo ante desafíos de Cloudflare. Úsalo de manera responsable y respeta los términos de servicio del sitio.

  • Los precios por debajo de 100 EUR se tratan como "precio bajo petición" y se excluyen de estadísticas y observaciones.

  • Las comprobaciones de alertas escanean las dos primeras páginas de resultados (~50 anuncios más recientes) por fuente.

  • get_price_history refleja solo los anuncios observados a través de este hub: es una muestra creciente, no el mercado completo.

  • La implementación anterior de un solo proveedor se mantiene como referencia en old/ (no forma parte de la compilación).

F
license - not found
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    C
    quality
    D
    maintenance
    Enables access to comprehensive vehicle information including VIN decoding, license plate OCR, vehicle history checks (theft, title, salvage records), market valuations, specifications, and warranty data for vehicles across North America and Europe.
    6
    61
    1
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to decode VINs, check stolen vehicle databases, and retrieve market valuations through natural language.
    1
  • A
    license
    A
    quality
    B
    maintenance
    Enables turning photos and observed facts into a ready-to-publish Leboncoin ad, with comparable search, asking-price statistics, category lookup, local drafts, and browser form automation that stops one click short of publishing until approved.
    23
    MIT

View all related MCP servers

Related MCP Connectors

  • Vehicle data for AI: VIN decoder, automotive specs, stolen checks, valuation and way more.

  • VIN decoding and European vehicle data for automotive workflows.

  • SERPRO RADAR: Vehicle, official-source lookup. Platform-hosted, pay per query with prepaid credit.

View all MCP Connectors

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/cvele/polovnjak-mcp'

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