get_makes_models
Retrieve vehicle makes and models from Turbo.az to filter automotive listings and refine search queries.
Instructions
Fetches list of available makes and models on Turbo.az.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| make | No | Make name (to see its models). Leave empty for all makes. |
Implementation Reference
- src/scraper.py:482-580 (handler)Implementation of get_makes_models in scraper.py which performs the web scraping logic.
async def get_makes_models(self, make: Optional[str] = None) -> dict: """Gets available makes and models.""" url = f"{BASE_URL}/autos" def _scrape(): driver = self._get_driver() try: driver.get(url) WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.CSS_SELECTOR, '.tz-dropdown[data-id="q_make"]')) ) time.sleep(0.5) try: driver.find_element(By.CSS_SELECTOR, '.tz-dropdown[data-id="q_make"] .tz-dropdown__selected').click() time.sleep(0.4) except Exception: pass if make: make_opts = self._parse_tz_dropdown_options(driver, "q_make") make_lower = make.strip().lower() make_id = None for val, label in make_opts: if label.lower() == make_lower or make_lower in label.lower(): make_id = val break if not make_id: return {"success": False, "error": f"Make not found: {make}"} try: make_cont = driver.find_element(By.CSS_SELECTOR, '.tz-dropdown[data-id="q_make"]') make_cont.find_element(By.CSS_SELECTOR, ".tz-dropdown__selected").click() time.sleep(0.3) for el in make_cont.find_elements(By.CSS_SELECTOR, ".tz-dropdown__list .tz-dropdown__option"): if (el.get_attribute("data-val") or "").strip() == make_id: el.click() break time.sleep(0.5) except Exception: pass model_opts = self._parse_tz_dropdown_options(driver, "q_model") models = [label for _, label in model_opts] return {"success": True, "make": make, "models": models} make_opts = self._parse_tz_dropdown_options(driver, "q_make") makes = [label for _, label in make_opts] return {"success": True, "makes": makes} except TimeoutException: return {"success": False, "error": "Page failed to load"} except Exception as e: return {"success": False, "error": str(e)} loop = asyncio.get_event_loop() return await loop.run_in_executor(None, _scrape) async def get_trending(self, category: str = "new", limit: int = 20) -> dict: """Gets newest/popular listings.""" if category == "vip": url = f"{BASE_URL}/autos?q[extras][]=vip" elif category == "popular": url = f"{BASE_URL}/autos?order=view_count" else: # new url = f"{BASE_URL}/autos" # Use search_cars function return await self.search_cars(limit=limit) def __del__(self): """Destructor - closes driver.""" self._close_driver() - src/server.py:147-159 (registration)Tool definition/registration in server.py.
Tool( name="get_makes_models", description="Fetches list of available makes and models on Turbo.az.", inputSchema={ "type": "object", "properties": { "make": { "type": "string", "description": "Make name (to see its models). Leave empty for all makes." } } } ), - src/server.py:231-234 (handler)The handler logic in call_tool that routes to the scraper method.
elif name == "get_makes_models": make = arguments.get("make") results = await scraper.get_makes_models(make) return [TextContent(type="text", text=json.dumps(results, ensure_ascii=False, indent=2))]