OLX India
OLX India helps users find marketplace listings in India through ChatGPT. The app can resolve listing locations and categories, inspect category-specific filters, search listings with structured constraints, show results in an embedded catalogue widget, and open listing details for a selected item.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- General Classifieds Marketplaces
- Secondary Subcategories
- None listed
- Brand
- OLX
- Access
- No account required
- First tracked
- 2026-06-26
- Tool count
- 10
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is visible.
ChatGPT Plugin Discoverability Score
ChatGPT organic discovery is not live yet
OLX India is tracked in the ChatGPT Plugin registry. Public organic-discovery measurement is not live for ChatGPT yet, so there is no score to publish today.
Get notified when your score goes live
Enter your work email and we’ll notify you when ChatGPT Plugin organic discovery scoring launches.
No spam. Unsubscribe any time.
Competing in ChatGPT General Classifieds Marketplaces
View CategoryHow the Discoverability Score works
Organic discovery scoring for OLX India on ChatGPT is not live yet. The score will use measured agent conversations when it launches.
Organic discovery scoring is pending. Your Plugin score will appear on this scale when measurement goes live.
FoundDiagnostic
Whether Claude found your Plugin in connector search. It must be Found before it can reach the picker, but the score counts picker appearances—not search results.
PickedMain score
How often your Plugin appeared in the picker, or Claude invoked it directly, across contested conversations. This percentage is the Discoverability Score; the headline number is rounded.
PositionedDiagnostic
What position your Plugin appeared in when it was shown in the picker. This shows prominence, but it does not affect the score.
10 tools agents can invoke
Open one OLX India listing in full detail (BXP item API). Use only when you already have a listing id from search results. <usage> You are an intelligent search assistant for OLX India. Infer location, category, and category-related filter intent from the user, then call tools in the exact order below. Data is OLX India (olx.in). Downstream calls use resolved location ids, category ids, and only category-allowed filter keys and values (from get_category_filters) as structured inputs-never ad-hoc filter keys. </usage> <geographic_handling> This MCP serves OLX India listings only (Indian locations, INR where applicable). - "Location" is the place named in the user's search (e.g. city where listings should be found), not device GPS. - If the user asks for another country or region as the primary market, say clearly that results are India-only and proceed only if they want Indian listings (e.g. city in India). - Do not use web search to substitute other marketplaces for non-India intent. </geographic_handling> <workflow> 1. Location (always first) - Extract location text (e.g. Mumbai, Delhi, Bangalore, Hyderabad, Chennai, Kolkata, Pune, Ahmedabad, Jaipur, Noida, Gurgaon, Kochi, Indore, Lucknow). - ALWAYS call search_location first with that text. - If search_location fails or is weak: get_locations and pick an id, or get_location_id for an exact name match. - If still unresolved, use default India location id: 1000001. - Store the chosen location id for search_with_filters (parameter name: location). 2. Category (required after location is resolved) - Extract category intent (e.g. cars, bikes, Electronics & Appliances, furniture, Jobs, mobiles / phones, scooters, fashion, home decor, services - use a short phrase for search_categories: "car", "bike", "electronics", "furniture", "job", "mobile", "scooter", ...). - Call search_categories with that text. - If weak: get_categories and pick category_id manually. - If category match is weak: retry with a clearer category phrase, then use get_categories and pick the closest category_id manually. - Do not intentionally skip category resolution for discovery requests; ask a clarifying category question only if no reliable category can be selected. 3. Category filters (required once category_id exists) - Call get_category_filters(category_id). - get_category_filters returns: - category_id: resolved category id for downstream search. - search_filters: all filters available for this category; each filter has key and possible_values as objects with "value" (API token) and "name" (human-readable); send only value to search_with_filters. - nested_filter_options: make<->model mapping helper (vehicle-focused; mainly cars). - Use this output to build the most complete search_with_filters call: - map every user constraint into supported fields first (price/make/model/year/etc.), - send other allowed category keys via extra_filters using exact key/value pairs from search_filters[].key and possible_values[].value, - never invent filter keys or unsupported values. 4. Primary search - Call search_with_filters with resolved location from search_location, category_id from search_categories, and get_category_filters output. - Map all supported structured fields first (price, make, model, year, mileage, fuel_type, transmission, sort_by, size). If a user constraint is not covered by structured fields but exists in get_category_filters search_filters, send it in extra_filters using exact key/value. - query is matched on listing title and description. On the first call, put only wording that has NO matching structured filter or extra_filter (e.g. color/adjectives when unavailable in search_filters) into query; omit repeating make/model/price/location already in args. - No-results retry ladder (each step is a new search_with_filters call only if previous call returned total_count = 0; never skip forward): A) full mapped structured filters + allowed extra_filters + query containing only unmapped text B) same as A but query="" C) only category_id, location, make, model, price_min, price_max D) only category_id, location, make, model E) only category_id, location - CRITICAL: You are not allowed to answer the user with "no results" after steps A, B, C, or D. If total_count=0, your next action MUST be another search_with_filters call using the next ladder step. Only after step E returns total_count=0 may you tell the user no listings were found. - The server does not auto-retry or auto-relax filters for you. The assistant must execute steps A->E explicitly. - Never call search_with_filters twice with an identical argument set. Every retry must change arguments to the next ladder step. 5. Optional shortcuts (not replacements for step 1) - search_listings: ChatGPT widget-oriented text search only when the session is that shortcut; for full assistant accuracy use steps 1-4 first. 6. After you have a listing id from search results - get_listing_details(id): full detail for one id only; never to discover listings instead of the chain above. </workflow> <strict_tool_order> Never call search_with_filters before resolving location (search_location, then fallbacks as needed), resolving category_id from search_categories (or get_categories fallback), and reading filters from get_category_filters. Preferred chain: search_location -> (get_locations | get_location_id if needed) -> search_categories -> (get_categories if needed) -> get_category_filters -> search_with_filters -> (get_listing_details when user picks one id)) If any step fails, continue with the next valid fallback instead of stopping. </strict_tool_order> <filter_mapping> OLX does not use a "field:operator:value" mini-language in this MCP. Instead: - Use search_with_filters top-level parameters when they match the API (location, category_id, price_min/price_max, make, model, year_*, mileage_*, fuel_type, transmission, sort_by, size). - Put every other allowed filter from get_category_filters into extra_filters as a dict: { "<key_from_search_filters>": "<possible_values.value_or_API_rules>" }. - make + model together may trigger nested-filters in the server; use possible_values.value from get_category_filters (models often look like "tata-nexon"). - Read get_category_filters in this order before calling search_with_filters: category_id -> search_filters (keys + possible_values value/name pairs) -> nested_filter_options (make/model map). </filter_mapping> <no_results> If search_with_filters returns total_count = 0, follow this exact call sequence: A) full mapped filters + query for unmapped words only B) same filters with query="" C) category_id + location + make + model + price_min + price_max D) category_id + location + make + model E) category_id + location CRITICAL: You are not allowed to answer the user with "no results" after steps A, B, C, or D. If total_count=0, your next action MUST be another search_with_filters call using the next ladder step. Only after step E returns total_count=0 may you tell the user no listings were found. Rules: - Do not repeat the same argument set across retries. - Do not invent extra_filters keys; only use keys from get_category_filters. - If step E is still empty, verify location/category resolution and tell the user constraints may be too strict or inventory may be unavailable right now. </no_results> <response_when_no_widget> When there is no embedded widget or the client only shows JSON: summarize total results, a few key fields per listing (title, price, location, link), filters used, and any fallback path used. </response_when_no_widget> <this_tool_role> Call get_listing_details only after you have a listing id string from search_with_filters, search_listings, or catalogue results. Never use this tool to start discovery or replace the location -> category -> search chain. </this_tool_role> <CRITICAL_RESPONSE_RULE> When this tool is used in a client that renders the OLX listings widget (cards with images, price, and links), keep your assistant message to about 2-5 short sentences: acknowledge results, offer to refine filters, or ask a follow-up. Do not list every listing title or full specs in prose- the widget already shows them. Avoid emoji-heavy dumps of item details. </CRITICAL_RESPONSE_RULE> <inputs> - id (required): listing id string exactly as returned in search_with_filters `data`, search_listings `listings`, or widget rows — never invent ids. </inputs> <output> GetListingDetailsOutput JSON: `listing` (id, title, price, location, image, images, description, created, category) when found; otherwise `listing` null and `error` set. </output> <examples> After search_with_filters returns data[0].id == "123456": get_listing_details(id="123456") to fetch gallery + long description for the chat or widget detail view. </examples>
mcp-discovery___get_listing_details
ChatGPT / MCP App: quick text search for the embedded OLX listings widget (query + optional INR price bounds). <usage> You are an intelligent search assistant for OLX India. Infer location, category, and category-related filter intent from the user, then call tools in the exact order below. Data is OLX India (olx.in). Downstream calls use resolved location ids, category ids, and only category-allowed filter keys and values (from get_category_filters) as structured inputs-never ad-hoc filter keys. </usage> <geographic_handling> This MCP serves OLX India listings only (Indian locations, INR where applicable). - "Location" is the place named in the user's search (e.g. city where listings should be found), not device GPS. - If the user asks for another country or region as the primary market, say clearly that results are India-only and proceed only if they want Indian listings (e.g. city in India). - Do not use web search to substitute other marketplaces for non-India intent. </geographic_handling> <workflow> 1. Location (always first) - Extract location text (e.g. Mumbai, Delhi, Bangalore, Hyderabad, Chennai, Kolkata, Pune, Ahmedabad, Jaipur, Noida, Gurgaon, Kochi, Indore, Lucknow). - ALWAYS call search_location first with that text. - If search_location fails or is weak: get_locations and pick an id, or get_location_id for an exact name match. - If still unresolved, use default India location id: 1000001. - Store the chosen location id for search_with_filters (parameter name: location). 2. Category (required after location is resolved) - Extract category intent (e.g. cars, bikes, Electronics & Appliances, furniture, Jobs, mobiles / phones, scooters, fashion, home decor, services - use a short phrase for search_categories: "car", "bike", "electronics", "furniture", "job", "mobile", "scooter", ...). - Call search_categories with that text. - If weak: get_categories and pick category_id manually. - If category match is weak: retry with a clearer category phrase, then use get_categories and pick the closest category_id manually. - Do not intentionally skip category resolution for discovery requests; ask a clarifying category question only if no reliable category can be selected. 3. Category filters (required once category_id exists) - Call get_category_filters(category_id). - get_category_filters returns: - category_id: resolved category id for downstream search. - search_filters: all filters available for this category; each filter has key and possible_values as objects with "value" (API token) and "name" (human-readable); send only value to search_with_filters. - nested_filter_options: make<->model mapping helper (vehicle-focused; mainly cars). - Use this output to build the most complete search_with_filters call: - map every user constraint into supported fields first (price/make/model/year/etc.), - send other allowed category keys via extra_filters using exact key/value pairs from search_filters[].key and possible_values[].value, - never invent filter keys or unsupported values. 4. Primary search - Call search_with_filters with resolved location from search_location, category_id from search_categories, and get_category_filters output. - Map all supported structured fields first (price, make, model, year, mileage, fuel_type, transmission, sort_by, size). If a user constraint is not covered by structured fields but exists in get_category_filters search_filters, send it in extra_filters using exact key/value. - query is matched on listing title and description. On the first call, put only wording that has NO matching structured filter or extra_filter (e.g. color/adjectives when unavailable in search_filters) into query; omit repeating make/model/price/location already in args. - No-results retry ladder (each step is a new search_with_filters call only if previous call returned total_count = 0; never skip forward): A) full mapped structured filters + allowed extra_filters + query containing only unmapped text B) same as A but query="" C) only category_id, location, make, model, price_min, price_max D) only category_id, location, make, model E) only category_id, location - CRITICAL: You are not allowed to answer the user with "no results" after steps A, B, C, or D. If total_count=0, your next action MUST be another search_with_filters call using the next ladder step. Only after step E returns total_count=0 may you tell the user no listings were found. - The server does not auto-retry or auto-relax filters for you. The assistant must execute steps A->E explicitly. - Never call search_with_filters twice with an identical argument set. Every retry must change arguments to the next ladder step. 5. Optional shortcuts (not replacements for step 1) - search_listings: ChatGPT widget-oriented text search only when the session is that shortcut; for full assistant accuracy use steps 1-4 first. 6. After you have a listing id from search results - get_listing_details(id): full detail for one id only; never to discover listings instead of the chain above. </workflow> <strict_tool_order> Never call search_with_filters before resolving location (search_location, then fallbacks as needed), resolving category_id from search_categories (or get_categories fallback), and reading filters from get_category_filters. Preferred chain: search_location -> (get_locations | get_location_id if needed) -> search_categories -> (get_categories if needed) -> get_category_filters -> search_with_filters -> (get_listing_details when user picks one id)) If any step fails, continue with the next valid fallback instead of stopping. </strict_tool_order> <filter_mapping> OLX does not use a "field:operator:value" mini-language in this MCP. Instead: - Use search_with_filters top-level parameters when they match the API (location, category_id, price_min/price_max, make, model, year_*, mileage_*, fuel_type, transmission, sort_by, size). - Put every other allowed filter from get_category_filters into extra_filters as a dict: { "<key_from_search_filters>": "<possible_values.value_or_API_rules>" }. - make + model together may trigger nested-filters in the server; use possible_values.value from get_category_filters (models often look like "tata-nexon"). - Read get_category_filters in this order before calling search_with_filters: category_id -> search_filters (keys + possible_values value/name pairs) -> nested_filter_options (make/model map). </filter_mapping> <no_results> If search_with_filters returns total_count = 0, follow this exact call sequence: A) full mapped filters + query for unmapped words only B) same filters with query="" C) category_id + location + make + model + price_min + price_max D) category_id + location + make + model E) category_id + location CRITICAL: You are not allowed to answer the user with "no results" after steps A, B, C, or D. If total_count=0, your next action MUST be another search_with_filters call using the next ladder step. Only after step E returns total_count=0 may you tell the user no listings were found. Rules: - Do not repeat the same argument set across retries. - Do not invent extra_filters keys; only use keys from get_category_filters. - If step E is still empty, verify location/category resolution and tell the user constraints may be too strict or inventory may be unavailable right now. </no_results> <response_when_no_widget> When there is no embedded widget or the client only shows JSON: summarize total results, a few key fields per listing (title, price, location, link), filters used, and any fallback path used. </response_when_no_widget> <this_tool_in_workflow> Shortcut path for the widget catalogue only. Does NOT call search_location — location and category are not resolved for you. For accurate India geo + category + filters, use search_location → search_categories → get_category_filters → search_with_filters first. Use search_listings when the host session is explicitly the MCP App widget or a one-shot catalogue search; never as a drop-in replacement for the full discovery chain. </this_tool_in_workflow> <CRITICAL_RESPONSE_RULE> When this tool is used in a client that renders the OLX listings widget (cards with images, price, and links), keep your assistant message to about 2-5 short sentences: acknowledge results, offer to refine filters, or ask a follow-up. Do not list every listing title or full specs in prose- the widget already shows them. Avoid emoji-heavy dumps of item details. </CRITICAL_RESPONSE_RULE> <usage> Populate the widget with simplified cards from the same relevance API as search_with_filters, without running the location/category pipeline. Best for global or exploratory text queries inside the embedded app. </usage> <inputs> - query (required): free text; empty after trim returns error in output - minPrice (optional): integer INR lower bound - maxPrice (optional): integer INR upper bound </inputs> <output> SearchListingsOutput: - query: string searched - listings: [{ id, title, price, location, image }, ...] simplified rows for the widget - error: string when query missing or HTTP failure; null on success </output> <examples> Widget-only: search_listings(query="used iphone 13", minPrice=20000, maxPrice=45000) → widget renders cards; assistant gives a brief acknowledgment per CRITICAL_RESPONSE_RULE. </examples> <no_results> If listings empty but no error: widen price or simplify query; for precise city results switch to search_location + search_with_filters instead of this shortcut. </no_results>
mcp-discovery___search_listings
Fallback: fetch the full OLX India category tree (and optional subcategories). <usage> You are an intelligent search assistant for OLX India. Infer location, category, and category-related filter intent from the user, then call tools in the exact order below. Data is OLX India (olx.in). Downstream calls use resolved location ids, category ids, and only category-allowed filter keys and values (from get_category_filters) as structured inputs-never ad-hoc filter keys. </usage> <geographic_handling> This MCP serves OLX India listings only (Indian locations, INR where applicable). - "Location" is the place named in the user's search (e.g. city where listings should be found), not device GPS. - If the user asks for another country or region as the primary market, say clearly that results are India-only and proceed only if they want Indian listings (e.g. city in India). - Do not use web search to substitute other marketplaces for non-India intent. </geographic_handling> <workflow> 1. Location (always first) - Extract location text (e.g. Mumbai, Delhi, Bangalore, Hyderabad, Chennai, Kolkata, Pune, Ahmedabad, Jaipur, Noida, Gurgaon, Kochi, Indore, Lucknow). - ALWAYS call search_location first with that text. - If search_location fails or is weak: get_locations and pick an id, or get_location_id for an exact name match. - If still unresolved, use default India location id: 1000001. - Store the chosen location id for search_with_filters (parameter name: location). 2. Category (required after location is resolved) - Extract category intent (e.g. cars, bikes, Electronics & Appliances, furniture, Jobs, mobiles / phones, scooters, fashion, home decor, services - use a short phrase for search_categories: "car", "bike", "electronics", "furniture", "job", "mobile", "scooter", ...). - Call search_categories with that text. - If weak: get_categories and pick category_id manually. - If category match is weak: retry with a clearer category phrase, then use get_categories and pick the closest category_id manually. - Do not intentionally skip category resolution for discovery requests; ask a clarifying category question only if no reliable category can be selected. 3. Category filters (required once category_id exists) - Call get_category_filters(category_id). - get_category_filters returns: - category_id: resolved category id for downstream search. - search_filters: all filters available for this category; each filter has key and possible_values as objects with "value" (API token) and "name" (human-readable); send only value to search_with_filters. - nested_filter_options: make<->model mapping helper (vehicle-focused; mainly cars). - Use this output to build the most complete search_with_filters call: - map every user constraint into supported fields first (price/make/model/year/etc.), - send other allowed category keys via extra_filters using exact key/value pairs from search_filters[].key and possible_values[].value, - never invent filter keys or unsupported values. 4. Primary search - Call search_with_filters with resolved location from search_location, category_id from search_categories, and get_category_filters output. - Map all supported structured fields first (price, make, model, year, mileage, fuel_type, transmission, sort_by, size). If a user constraint is not covered by structured fields but exists in get_category_filters search_filters, send it in extra_filters using exact key/value. - query is matched on listing title and description. On the first call, put only wording that has NO matching structured filter or extra_filter (e.g. color/adjectives when unavailable in search_filters) into query; omit repeating make/model/price/location already in args. - No-results retry ladder (each step is a new search_with_filters call only if previous call returned total_count = 0; never skip forward): A) full mapped structured filters + allowed extra_filters + query containing only unmapped text B) same as A but query="" C) only category_id, location, make, model, price_min, price_max D) only category_id, location, make, model E) only category_id, location - CRITICAL: You are not allowed to answer the user with "no results" after steps A, B, C, or D. If total_count=0, your next action MUST be another search_with_filters call using the next ladder step. Only after step E returns total_count=0 may you tell the user no listings were found. - The server does not auto-retry or auto-relax filters for you. The assistant must execute steps A->E explicitly. - Never call search_with_filters twice with an identical argument set. Every retry must change arguments to the next ladder step. 5. Optional shortcuts (not replacements for step 1) - search_listings: ChatGPT widget-oriented text search only when the session is that shortcut; for full assistant accuracy use steps 1-4 first. 6. After you have a listing id from search results - get_listing_details(id): full detail for one id only; never to discover listings instead of the chain above. </workflow> <strict_tool_order> Never call search_with_filters before resolving location (search_location, then fallbacks as needed), resolving category_id from search_categories (or get_categories fallback), and reading filters from get_category_filters. Preferred chain: search_location -> (get_locations | get_location_id if needed) -> search_categories -> (get_categories if needed) -> get_category_filters -> search_with_filters -> (get_listing_details when user picks one id)) If any step fails, continue with the next valid fallback instead of stopping. </strict_tool_order> <filter_mapping> OLX does not use a "field:operator:value" mini-language in this MCP. Instead: - Use search_with_filters top-level parameters when they match the API (location, category_id, price_min/price_max, make, model, year_*, mileage_*, fuel_type, transmission, sort_by, size). - Put every other allowed filter from get_category_filters into extra_filters as a dict: { "<key_from_search_filters>": "<possible_values.value_or_API_rules>" }. - make + model together may trigger nested-filters in the server; use possible_values.value from get_category_filters (models often look like "tata-nexon"). - Read get_category_filters in this order before calling search_with_filters: category_id -> search_filters (keys + possible_values value/name pairs) -> nested_filter_options (make/model map). </filter_mapping> <no_results> If search_with_filters returns total_count = 0, follow this exact call sequence: A) full mapped filters + query for unmapped words only B) same filters with query="" C) category_id + location + make + model + price_min + price_max D) category_id + location + make + model E) category_id + location CRITICAL: You are not allowed to answer the user with "no results" after steps A, B, C, or D. If total_count=0, your next action MUST be another search_with_filters call using the next ladder step. Only after step E returns total_count=0 may you tell the user no listings were found. Rules: - Do not repeat the same argument set across retries. - Do not invent extra_filters keys; only use keys from get_category_filters. - If step E is still empty, verify location/category resolution and tell the user constraints may be too strict or inventory may be unavailable right now. </no_results> <response_when_no_widget> When there is no embedded widget or the client only shows JSON: summarize total results, a few key fields per listing (title, price, location, link), filters used, and any fallback path used. </response_when_no_widget> <this_tool_in_workflow> Step 2 fallback only. After location is resolved: use when search_categories fails; manually choose category_id, then get_category_filters if applicable. Never the first category resolution call. </this_tool_in_workflow> <usage> Manual browsing of categories when text search (search_categories) does not return a good id. </usage> <inputs> - include_subcategories (optional, default true): include flattened subcategories with parent_id/name </inputs> <output> - categories: [{ id, key, name, search_allowed }, ...] - subcategories: (if enabled) rows with parent_id, parent_name - metadata, total_categories, total_subcategories </output> <examples> - search_categories("mobile") / search_categories("electronics") returned nothing: get_categories(true), open Electronics & Appliances or Mobiles in the tree and pick the best subcategory id. - search_categories("job") weak: browse Jobs or Services under get_categories and choose category_id. - search_categories("furniture") weak: pick Furniture or Home & Garden manually from the tree. </examples>
PRIMARY: load filter schema and allowed values for a resolved category_id. <usage> You are an intelligent search assistant for OLX India. Infer location, category, and category-related filter intent from the user, then call tools in the exact order below. Data is OLX India (olx.in). Downstream calls use resolved location ids, category ids, and only category-allowed filter keys and values (from get_category_filters) as structured inputs-never ad-hoc filter keys. </usage> <geographic_handling> This MCP serves OLX India listings only (Indian locations, INR where applicable). - "Location" is the place named in the user's search (e.g. city where listings should be found), not device GPS. - If the user asks for another country or region as the primary market, say clearly that results are India-only and proceed only if they want Indian listings (e.g. city in India). - Do not use web search to substitute other marketplaces for non-India intent. </geographic_handling> <workflow> 1. Location (always first) - Extract location text (e.g. Mumbai, Delhi, Bangalore, Hyderabad, Chennai, Kolkata, Pune, Ahmedabad, Jaipur, Noida, Gurgaon, Kochi, Indore, Lucknow). - ALWAYS call search_location first with that text. - If search_location fails or is weak: get_locations and pick an id, or get_location_id for an exact name match. - If still unresolved, use default India location id: 1000001. - Store the chosen location id for search_with_filters (parameter name: location). 2. Category (required after location is resolved) - Extract category intent (e.g. cars, bikes, Electronics & Appliances, furniture, Jobs, mobiles / phones, scooters, fashion, home decor, services - use a short phrase for search_categories: "car", "bike", "electronics", "furniture", "job", "mobile", "scooter", ...). - Call search_categories with that text. - If weak: get_categories and pick category_id manually. - If category match is weak: retry with a clearer category phrase, then use get_categories and pick the closest category_id manually. - Do not intentionally skip category resolution for discovery requests; ask a clarifying category question only if no reliable category can be selected. 3. Category filters (required once category_id exists) - Call get_category_filters(category_id). - get_category_filters returns: - category_id: resolved category id for downstream search. - search_filters: all filters available for this category; each filter has key and possible_values as objects with "value" (API token) and "name" (human-readable); send only value to search_with_filters. - nested_filter_options: make<->model mapping helper (vehicle-focused; mainly cars). - Use this output to build the most complete search_with_filters call: - map every user constraint into supported fields first (price/make/model/year/etc.), - send other allowed category keys via extra_filters using exact key/value pairs from search_filters[].key and possible_values[].value, - never invent filter keys or unsupported values. 4. Primary search - Call search_with_filters with resolved location from search_location, category_id from search_categories, and get_category_filters output. - Map all supported structured fields first (price, make, model, year, mileage, fuel_type, transmission, sort_by, size). If a user constraint is not covered by structured fields but exists in get_category_filters search_filters, send it in extra_filters using exact key/value. - query is matched on listing title and description. On the first call, put only wording that has NO matching structured filter or extra_filter (e.g. color/adjectives when unavailable in search_filters) into query; omit repeating make/model/price/location already in args. - No-results retry ladder (each step is a new search_with_filters call only if previous call returned total_count = 0; never skip forward): A) full mapped structured filters + allowed extra_filters + query containing only unmapped text B) same as A but query="" C) only category_id, location, make, model, price_min, price_max D) only category_id, location, make, model E) only category_id, location - CRITICAL: You are not allowed to answer the user with "no results" after steps A, B, C, or D. If total_count=0, your next action MUST be another search_with_filters call using the next ladder step. Only after step E returns total_count=0 may you tell the user no listings were found. - The server does not auto-retry or auto-relax filters for you. The assistant must execute steps A->E explicitly. - Never call search_with_filters twice with an identical argument set. Every retry must change arguments to the next ladder step. 5. Optional shortcuts (not replacements for step 1) - search_listings: ChatGPT widget-oriented text search only when the session is that shortcut; for full assistant accuracy use steps 1-4 first. 6. After you have a listing id from search results - get_listing_details(id): full detail for one id only; never to discover listings instead of the chain above. </workflow> <strict_tool_order> Never call search_with_filters before resolving location (search_location, then fallbacks as needed), resolving category_id from search_categories (or get_categories fallback), and reading filters from get_category_filters. Preferred chain: search_location -> (get_locations | get_location_id if needed) -> search_categories -> (get_categories if needed) -> get_category_filters -> search_with_filters -> (get_listing_details when user picks one id)) If any step fails, continue with the next valid fallback instead of stopping. </strict_tool_order> <filter_mapping> OLX does not use a "field:operator:value" mini-language in this MCP. Instead: - Use search_with_filters top-level parameters when they match the API (location, category_id, price_min/price_max, make, model, year_*, mileage_*, fuel_type, transmission, sort_by, size). - Put every other allowed filter from get_category_filters into extra_filters as a dict: { "<key_from_search_filters>": "<possible_values.value_or_API_rules>" }. - make + model together may trigger nested-filters in the server; use possible_values.value from get_category_filters (models often look like "tata-nexon"). - Read get_category_filters in this order before calling search_with_filters: category_id -> search_filters (keys + possible_values value/name pairs) -> nested_filter_options (make/model map). </filter_mapping> <no_results> If search_with_filters returns total_count = 0, follow this exact call sequence: A) full mapped filters + query for unmapped words only B) same filters with query="" C) category_id + location + make + model + price_min + price_max D) category_id + location + make + model E) category_id + location CRITICAL: You are not allowed to answer the user with "no results" after steps A, B, C, or D. If total_count=0, your next action MUST be another search_with_filters call using the next ladder step. Only after step E returns total_count=0 may you tell the user no listings were found. Rules: - Do not repeat the same argument set across retries. - Do not invent extra_filters keys; only use keys from get_category_filters. - If step E is still empty, verify location/category resolution and tell the user constraints may be too strict or inventory may be unavailable right now. </no_results> <response_when_no_widget> When there is no embedded widget or the client only shows JSON: summarize total results, a few key fields per listing (title, price, location, link), filters used, and any fallback path used. </response_when_no_widget> <this_tool_in_workflow> Step 3 — only after location (step 1) and category_id from search_categories or get_categories. If there is no category_id, skip this tool and call search_with_filters with location (and query / filters as needed) only. Output drives search_with_filters and extra_filters: only keys from search_filters and API tokens from each option's possible_values.value (each entry is {value, name}; use value in search_with_filters, never the display name alone). </this_tool_in_workflow> <usage> Authoritative filter dictionary for a category. Use this response to prepare an efficient search_with_filters call: map every user constraint to supported filter keys/values first, then send only remaining allowed keys via extra_filters. Never invent keys or values. </usage> <inputs> - category_id (required): string id from search_categories / get_categories (e.g. "84" often cars; bikes/scooters, Electronics & Appliances, furniture, Jobs, mobiles each have their own ids from the tree) </inputs> <output> - category_id: resolved category id to send as search_with_filters.category_id - search_filters: [{ key, name, label, possible_values: [{ value, name }, ...] }, ...] allowed API tokens are possible_values[].value (name is human-readable only); pass those value strings to search_with_filters structured args and extra_filters - nested_filter_options: when make/model exist, includes full make_model_map and a sampled nested_filters_example (+ nested_filters_example_meta) for nested-filters shape guidance </output> <examples> Cars: category_id "84" → get_category_filters("84"), map make/model/fuel/transmission using possible_values[].value into search_with_filters + extra_filters (use value, not name). Bikes: resolve id via search_categories("bike") → get_category_filters(<id>), map bike-specific keys. Mobiles / Electronics: search_categories("mobile") or ("electronics") → get_category_filters(<id>), use keys like type, brand, condition from search_filters into extra_filters only when listed. Jobs / Furniture: same pattern — always take keys and values from this response only. General mapping order: category_id -> search_filters(key + possible_values.value/name) -> nested_filter_options (if make/model exists) -> search_with_filters. </examples>
Fallback: resolve listing-search place name (from user query, not device GPS) to location id(s) by exact match against the full OLX hierarchy. <usage> You are an intelligent search assistant for OLX India. Infer location, category, and category-related filter intent from the user, then call tools in the exact order below. Data is OLX India (olx.in). Downstream calls use resolved location ids, category ids, and only category-allowed filter keys and values (from get_category_filters) as structured inputs-never ad-hoc filter keys. </usage> <geographic_handling> This MCP serves OLX India listings only (Indian locations, INR where applicable). - "Location" is the place named in the user's search (e.g. city where listings should be found), not device GPS. - If the user asks for another country or region as the primary market, say clearly that results are India-only and proceed only if they want Indian listings (e.g. city in India). - Do not use web search to substitute other marketplaces for non-India intent. </geographic_handling> <workflow> 1. Location (always first) - Extract location text (e.g. Mumbai, Delhi, Bangalore, Hyderabad, Chennai, Kolkata, Pune, Ahmedabad, Jaipur, Noida, Gurgaon, Kochi, Indore, Lucknow). - ALWAYS call search_location first with that text. - If search_location fails or is weak: get_locations and pick an id, or get_location_id for an exact name match. - If still unresolved, use default India location id: 1000001. - Store the chosen location id for search_with_filters (parameter name: location). 2. Category (required after location is resolved) - Extract category intent (e.g. cars, bikes, Electronics & Appliances, furniture, Jobs, mobiles / phones, scooters, fashion, home decor, services - use a short phrase for search_categories: "car", "bike", "electronics", "furniture", "job", "mobile", "scooter", ...). - Call search_categories with that text. - If weak: get_categories and pick category_id manually. - If category match is weak: retry with a clearer category phrase, then use get_categories and pick the closest category_id manually. - Do not intentionally skip category resolution for discovery requests; ask a clarifying category question only if no reliable category can be selected. 3. Category filters (required once category_id exists) - Call get_category_filters(category_id). - get_category_filters returns: - category_id: resolved category id for downstream search. - search_filters: all filters available for this category; each filter has key and possible_values as objects with "value" (API token) and "name" (human-readable); send only value to search_with_filters. - nested_filter_options: make<->model mapping helper (vehicle-focused; mainly cars). - Use this output to build the most complete search_with_filters call: - map every user constraint into supported fields first (price/make/model/year/etc.), - send other allowed category keys via extra_filters using exact key/value pairs from search_filters[].key and possible_values[].value, - never invent filter keys or unsupported values. 4. Primary search - Call search_with_filters with resolved location from search_location, category_id from search_categories, and get_category_filters output. - Map all supported structured fields first (price, make, model, year, mileage, fuel_type, transmission, sort_by, size). If a user constraint is not covered by structured fields but exists in get_category_filters search_filters, send it in extra_filters using exact key/value. - query is matched on listing title and description. On the first call, put only wording that has NO matching structured filter or extra_filter (e.g. color/adjectives when unavailable in search_filters) into query; omit repeating make/model/price/location already in args. - No-results retry ladder (each step is a new search_with_filters call only if previous call returned total_count = 0; never skip forward): A) full mapped structured filters + allowed extra_filters + query containing only unmapped text B) same as A but query="" C) only category_id, location, make, model, price_min, price_max D) only category_id, location, make, model E) only category_id, location - CRITICAL: You are not allowed to answer the user with "no results" after steps A, B, C, or D. If total_count=0, your next action MUST be another search_with_filters call using the next ladder step. Only after step E returns total_count=0 may you tell the user no listings were found. - The server does not auto-retry or auto-relax filters for you. The assistant must execute steps A->E explicitly. - Never call search_with_filters twice with an identical argument set. Every retry must change arguments to the next ladder step. 5. Optional shortcuts (not replacements for step 1) - search_listings: ChatGPT widget-oriented text search only when the session is that shortcut; for full assistant accuracy use steps 1-4 first. 6. After you have a listing id from search results - get_listing_details(id): full detail for one id only; never to discover listings instead of the chain above. </workflow> <strict_tool_order> Never call search_with_filters before resolving location (search_location, then fallbacks as needed), resolving category_id from search_categories (or get_categories fallback), and reading filters from get_category_filters. Preferred chain: search_location -> (get_locations | get_location_id if needed) -> search_categories -> (get_categories if needed) -> get_category_filters -> search_with_filters -> (get_listing_details when user picks one id)) If any step fails, continue with the next valid fallback instead of stopping. </strict_tool_order> <filter_mapping> OLX does not use a "field:operator:value" mini-language in this MCP. Instead: - Use search_with_filters top-level parameters when they match the API (location, category_id, price_min/price_max, make, model, year_*, mileage_*, fuel_type, transmission, sort_by, size). - Put every other allowed filter from get_category_filters into extra_filters as a dict: { "<key_from_search_filters>": "<possible_values.value_or_API_rules>" }. - make + model together may trigger nested-filters in the server; use possible_values.value from get_category_filters (models often look like "tata-nexon"). - Read get_category_filters in this order before calling search_with_filters: category_id -> search_filters (keys + possible_values value/name pairs) -> nested_filter_options (make/model map). </filter_mapping> <no_results> If search_with_filters returns total_count = 0, follow this exact call sequence: A) full mapped filters + query for unmapped words only B) same filters with query="" C) category_id + location + make + model + price_min + price_max D) category_id + location + make + model E) category_id + location CRITICAL: You are not allowed to answer the user with "no results" after steps A, B, C, or D. If total_count=0, your next action MUST be another search_with_filters call using the next ladder step. Only after step E returns total_count=0 may you tell the user no listings were found. Rules: - Do not repeat the same argument set across retries. - Do not invent extra_filters keys; only use keys from get_category_filters. - If step E is still empty, verify location/category resolution and tell the user constraints may be too strict or inventory may be unavailable right now. </no_results> <response_when_no_widget> When there is no embedded widget or the client only shows JSON: summarize total results, a few key fields per listing (title, price, location, link), filters used, and any fallback path used. </response_when_no_widget> <this_tool_in_workflow> Step 1 optional fallback. Use when search_location is weak and you need an exact string match on the place from the user's search (listing geography, not device GPS; e.g. ambiguous spelling). Often used after get_locations. Prefer search_location first for free text. Then search_categories. </this_tool_in_workflow> <usage> Find nodes whose name equals location_name (case-insensitive) and return ids for search_with_filters.location. Pass the place named in the user's search (e.g. city for listings), not device GPS. </usage> <inputs> - location_name (required): place from the user's search query, e.g. "Delhi", "Mumbai", "Maharashtra", "India" - location_type (optional): "country" | "state" | "city" — narrows which level is matched </inputs> <output> - matches: [{ id, name, type, ... parent fields }, ...] sorted city-first - total_matches: int - recommended_id: best id when multiple (most specific match first) - message: human-readable summary of the lookup </output> <examples> search_location("gurgaon") returned wrong suburb: get_location_id("Gurugram", "city") and use recommended_id. </examples>
Fallback: load the full OLX India location tree (countries, states, cities) for listing-search geography, not device GPS. <usage> You are an intelligent search assistant for OLX India. Infer location, category, and category-related filter intent from the user, then call tools in the exact order below. Data is OLX India (olx.in). Downstream calls use resolved location ids, category ids, and only category-allowed filter keys and values (from get_category_filters) as structured inputs-never ad-hoc filter keys. </usage> <geographic_handling> This MCP serves OLX India listings only (Indian locations, INR where applicable). - "Location" is the place named in the user's search (e.g. city where listings should be found), not device GPS. - If the user asks for another country or region as the primary market, say clearly that results are India-only and proceed only if they want Indian listings (e.g. city in India). - Do not use web search to substitute other marketplaces for non-India intent. </geographic_handling> <workflow> 1. Location (always first) - Extract location text (e.g. Mumbai, Delhi, Bangalore, Hyderabad, Chennai, Kolkata, Pune, Ahmedabad, Jaipur, Noida, Gurgaon, Kochi, Indore, Lucknow). - ALWAYS call search_location first with that text. - If search_location fails or is weak: get_locations and pick an id, or get_location_id for an exact name match. - If still unresolved, use default India location id: 1000001. - Store the chosen location id for search_with_filters (parameter name: location). 2. Category (required after location is resolved) - Extract category intent (e.g. cars, bikes, Electronics & Appliances, furniture, Jobs, mobiles / phones, scooters, fashion, home decor, services - use a short phrase for search_categories: "car", "bike", "electronics", "furniture", "job", "mobile", "scooter", ...). - Call search_categories with that text. - If weak: get_categories and pick category_id manually. - If category match is weak: retry with a clearer category phrase, then use get_categories and pick the closest category_id manually. - Do not intentionally skip category resolution for discovery requests; ask a clarifying category question only if no reliable category can be selected. 3. Category filters (required once category_id exists) - Call get_category_filters(category_id). - get_category_filters returns: - category_id: resolved category id for downstream search. - search_filters: all filters available for this category; each filter has key and possible_values as objects with "value" (API token) and "name" (human-readable); send only value to search_with_filters. - nested_filter_options: make<->model mapping helper (vehicle-focused; mainly cars). - Use this output to build the most complete search_with_filters call: - map every user constraint into supported fields first (price/make/model/year/etc.), - send other allowed category keys via extra_filters using exact key/value pairs from search_filters[].key and possible_values[].value, - never invent filter keys or unsupported values. 4. Primary search - Call search_with_filters with resolved location from search_location, category_id from search_categories, and get_category_filters output. - Map all supported structured fields first (price, make, model, year, mileage, fuel_type, transmission, sort_by, size). If a user constraint is not covered by structured fields but exists in get_category_filters search_filters, send it in extra_filters using exact key/value. - query is matched on listing title and description. On the first call, put only wording that has NO matching structured filter or extra_filter (e.g. color/adjectives when unavailable in search_filters) into query; omit repeating make/model/price/location already in args. - No-results retry ladder (each step is a new search_with_filters call only if previous call returned total_count = 0; never skip forward): A) full mapped structured filters + allowed extra_filters + query containing only unmapped text B) same as A but query="" C) only category_id, location, make, model, price_min, price_max D) only category_id, location, make, model E) only category_id, location - CRITICAL: You are not allowed to answer the user with "no results" after steps A, B, C, or D. If total_count=0, your next action MUST be another search_with_filters call using the next ladder step. Only after step E returns total_count=0 may you tell the user no listings were found. - The server does not auto-retry or auto-relax filters for you. The assistant must execute steps A->E explicitly. - Never call search_with_filters twice with an identical argument set. Every retry must change arguments to the next ladder step. 5. Optional shortcuts (not replacements for step 1) - search_listings: ChatGPT widget-oriented text search only when the session is that shortcut; for full assistant accuracy use steps 1-4 first. 6. After you have a listing id from search results - get_listing_details(id): full detail for one id only; never to discover listings instead of the chain above. </workflow> <strict_tool_order> Never call search_with_filters before resolving location (search_location, then fallbacks as needed), resolving category_id from search_categories (or get_categories fallback), and reading filters from get_category_filters. Preferred chain: search_location -> (get_locations | get_location_id if needed) -> search_categories -> (get_categories if needed) -> get_category_filters -> search_with_filters -> (get_listing_details when user picks one id)) If any step fails, continue with the next valid fallback instead of stopping. </strict_tool_order> <filter_mapping> OLX does not use a "field:operator:value" mini-language in this MCP. Instead: - Use search_with_filters top-level parameters when they match the API (location, category_id, price_min/price_max, make, model, year_*, mileage_*, fuel_type, transmission, sort_by, size). - Put every other allowed filter from get_category_filters into extra_filters as a dict: { "<key_from_search_filters>": "<possible_values.value_or_API_rules>" }. - make + model together may trigger nested-filters in the server; use possible_values.value from get_category_filters (models often look like "tata-nexon"). - Read get_category_filters in this order before calling search_with_filters: category_id -> search_filters (keys + possible_values value/name pairs) -> nested_filter_options (make/model map). </filter_mapping> <no_results> If search_with_filters returns total_count = 0, follow this exact call sequence: A) full mapped filters + query for unmapped words only B) same filters with query="" C) category_id + location + make + model + price_min + price_max D) category_id + location + make + model E) category_id + location CRITICAL: You are not allowed to answer the user with "no results" after steps A, B, C, or D. If total_count=0, your next action MUST be another search_with_filters call using the next ladder step. Only after step E returns total_count=0 may you tell the user no listings were found. Rules: - Do not repeat the same argument set across retries. - Do not invent extra_filters keys; only use keys from get_category_filters. - If step E is still empty, verify location/category resolution and tell the user constraints may be too strict or inventory may be unavailable right now. </no_results> <response_when_no_widget> When there is no embedded widget or the client only shows JSON: summarize total results, a few key fields per listing (title, price, location, link), filters used, and any fallback path used. </response_when_no_widget> <this_tool_in_workflow> Step 1 fallback only. Use when search_location fails, errors, or returns no usable id; pick a location id from the tree, then call search_categories. Never the first tool in a normal user search. </this_tool_in_workflow> <usage> Browse or manually resolve a location id when autocomplete (search_location) is insufficient. Use for listing search geography (where ads should be found), not device GPS. </usage> <inputs> - include_states (optional, default true): If true, response includes states and cities with parent pointers; if false, mainly country-level nodes. </inputs> <output> Object with: - countries: [{ id, name, type, longitude, latitude }, ...] - states: (if include_states) [{ id, name, type, parent_country_id, parent_country_name, ... }, ...] - cites: (if include_states) city rows with parent_state_* and parent_country_* - metadata, total_countries, total_states, total_cites </output> <examples> User said "some remote tehsil" and autocomplete failed: call get_locations(include_states=true), scan cites[] for the closest match, use that id as location in search_with_filters. </examples>
Optional: OLX search query suggestions (autocomplete-style hints). <usage> You are an intelligent search assistant for OLX India. Infer location, category, and category-related filter intent from the user, then call tools in the exact order below. Data is OLX India (olx.in). Downstream calls use resolved location ids, category ids, and only category-allowed filter keys and values (from get_category_filters) as structured inputs-never ad-hoc filter keys. </usage> <geographic_handling> This MCP serves OLX India listings only (Indian locations, INR where applicable). - "Location" is the place named in the user's search (e.g. city where listings should be found), not device GPS. - If the user asks for another country or region as the primary market, say clearly that results are India-only and proceed only if they want Indian listings (e.g. city in India). - Do not use web search to substitute other marketplaces for non-India intent. </geographic_handling> <workflow> 1. Location (always first) - Extract location text (e.g. Mumbai, Delhi, Bangalore, Hyderabad, Chennai, Kolkata, Pune, Ahmedabad, Jaipur, Noida, Gurgaon, Kochi, Indore, Lucknow). - ALWAYS call search_location first with that text. - If search_location fails or is weak: get_locations and pick an id, or get_location_id for an exact name match. - If still unresolved, use default India location id: 1000001. - Store the chosen location id for search_with_filters (parameter name: location). 2. Category (required after location is resolved) - Extract category intent (e.g. cars, bikes, Electronics & Appliances, furniture, Jobs, mobiles / phones, scooters, fashion, home decor, services - use a short phrase for search_categories: "car", "bike", "electronics", "furniture", "job", "mobile", "scooter", ...). - Call search_categories with that text. - If weak: get_categories and pick category_id manually. - If category match is weak: retry with a clearer category phrase, then use get_categories and pick the closest category_id manually. - Do not intentionally skip category resolution for discovery requests; ask a clarifying category question only if no reliable category can be selected. 3. Category filters (required once category_id exists) - Call get_category_filters(category_id). - get_category_filters returns: - category_id: resolved category id for downstream search. - search_filters: all filters available for this category; each filter has key and possible_values as objects with "value" (API token) and "name" (human-readable); send only value to search_with_filters. - nested_filter_options: make<->model mapping helper (vehicle-focused; mainly cars). - Use this output to build the most complete search_with_filters call: - map every user constraint into supported fields first (price/make/model/year/etc.), - send other allowed category keys via extra_filters using exact key/value pairs from search_filters[].key and possible_values[].value, - never invent filter keys or unsupported values. 4. Primary search - Call search_with_filters with resolved location from search_location, category_id from search_categories, and get_category_filters output. - Map all supported structured fields first (price, make, model, year, mileage, fuel_type, transmission, sort_by, size). If a user constraint is not covered by structured fields but exists in get_category_filters search_filters, send it in extra_filters using exact key/value. - query is matched on listing title and description. On the first call, put only wording that has NO matching structured filter or extra_filter (e.g. color/adjectives when unavailable in search_filters) into query; omit repeating make/model/price/location already in args. - No-results retry ladder (each step is a new search_with_filters call only if previous call returned total_count = 0; never skip forward): A) full mapped structured filters + allowed extra_filters + query containing only unmapped text B) same as A but query="" C) only category_id, location, make, model, price_min, price_max D) only category_id, location, make, model E) only category_id, location - CRITICAL: You are not allowed to answer the user with "no results" after steps A, B, C, or D. If total_count=0, your next action MUST be another search_with_filters call using the next ladder step. Only after step E returns total_count=0 may you tell the user no listings were found. - The server does not auto-retry or auto-relax filters for you. The assistant must execute steps A->E explicitly. - Never call search_with_filters twice with an identical argument set. Every retry must change arguments to the next ladder step. 5. Optional shortcuts (not replacements for step 1) - search_listings: ChatGPT widget-oriented text search only when the session is that shortcut; for full assistant accuracy use steps 1-4 first. 6. After you have a listing id from search results - get_listing_details(id): full detail for one id only; never to discover listings instead of the chain above. </workflow> <strict_tool_order> Never call search_with_filters before resolving location (search_location, then fallbacks as needed), resolving category_id from search_categories (or get_categories fallback), and reading filters from get_category_filters. Preferred chain: search_location -> (get_locations | get_location_id if needed) -> search_categories -> (get_categories if needed) -> get_category_filters -> search_with_filters -> (get_listing_details when user picks one id)) If any step fails, continue with the next valid fallback instead of stopping. </strict_tool_order> <filter_mapping> OLX does not use a "field:operator:value" mini-language in this MCP. Instead: - Use search_with_filters top-level parameters when they match the API (location, category_id, price_min/price_max, make, model, year_*, mileage_*, fuel_type, transmission, sort_by, size). - Put every other allowed filter from get_category_filters into extra_filters as a dict: { "<key_from_search_filters>": "<possible_values.value_or_API_rules>" }. - make + model together may trigger nested-filters in the server; use possible_values.value from get_category_filters (models often look like "tata-nexon"). - Read get_category_filters in this order before calling search_with_filters: category_id -> search_filters (keys + possible_values value/name pairs) -> nested_filter_options (make/model map). </filter_mapping> <no_results> If search_with_filters returns total_count = 0, follow this exact call sequence: A) full mapped filters + query for unmapped words only B) same filters with query="" C) category_id + location + make + model + price_min + price_max D) category_id + location + make + model E) category_id + location CRITICAL: You are not allowed to answer the user with "no results" after steps A, B, C, or D. If total_count=0, your next action MUST be another search_with_filters call using the next ladder step. Only after step E returns total_count=0 may you tell the user no listings were found. Rules: - Do not repeat the same argument set across retries. - Do not invent extra_filters keys; only use keys from get_category_filters. - If step E is still empty, verify location/category resolution and tell the user constraints may be too strict or inventory may be unavailable right now. </no_results> <response_when_no_widget> When there is no embedded widget or the client only shows JSON: summarize total results, a few key fields per listing (title, price, location, link), filters used, and any fallback path used. </response_when_no_widget> <this_tool_in_workflow> Supplementary only. Never replaces search_location. Use mid-flow to refine free-text keywords before search_with_filters if helpful; still respect full location → category → filters order. </this_tool_in_workflow> <usage> Fetch OLX /suggestions for typing assistance. Does not resolve locations or categories. </usage> <inputs> - query (required): partial user search text - category_id (optional): limits suggestions to a category context when known </inputs> <output> API JSON (e.g. suggestions list, query echo). On transport error, returns suggestions: [], error string. </output> <examples> User typed long rambling request: shorten product phrase, call get_search_suggestions(query="tata nexon") then feed refined keywords into search_with_filters.query if still needed after filters. </examples>
PRIMARY: resolve category keywords to category_id rows (cars, bikes, Electronics & Appliances, furniture, Jobs, mobiles, …). <usage> You are an intelligent search assistant for OLX India. Infer location, category, and category-related filter intent from the user, then call tools in the exact order below. Data is OLX India (olx.in). Downstream calls use resolved location ids, category ids, and only category-allowed filter keys and values (from get_category_filters) as structured inputs-never ad-hoc filter keys. </usage> <geographic_handling> This MCP serves OLX India listings only (Indian locations, INR where applicable). - "Location" is the place named in the user's search (e.g. city where listings should be found), not device GPS. - If the user asks for another country or region as the primary market, say clearly that results are India-only and proceed only if they want Indian listings (e.g. city in India). - Do not use web search to substitute other marketplaces for non-India intent. </geographic_handling> <workflow> 1. Location (always first) - Extract location text (e.g. Mumbai, Delhi, Bangalore, Hyderabad, Chennai, Kolkata, Pune, Ahmedabad, Jaipur, Noida, Gurgaon, Kochi, Indore, Lucknow). - ALWAYS call search_location first with that text. - If search_location fails or is weak: get_locations and pick an id, or get_location_id for an exact name match. - If still unresolved, use default India location id: 1000001. - Store the chosen location id for search_with_filters (parameter name: location). 2. Category (required after location is resolved) - Extract category intent (e.g. cars, bikes, Electronics & Appliances, furniture, Jobs, mobiles / phones, scooters, fashion, home decor, services - use a short phrase for search_categories: "car", "bike", "electronics", "furniture", "job", "mobile", "scooter", ...). - Call search_categories with that text. - If weak: get_categories and pick category_id manually. - If category match is weak: retry with a clearer category phrase, then use get_categories and pick the closest category_id manually. - Do not intentionally skip category resolution for discovery requests; ask a clarifying category question only if no reliable category can be selected. 3. Category filters (required once category_id exists) - Call get_category_filters(category_id). - get_category_filters returns: - category_id: resolved category id for downstream search. - search_filters: all filters available for this category; each filter has key and possible_values as objects with "value" (API token) and "name" (human-readable); send only value to search_with_filters. - nested_filter_options: make<->model mapping helper (vehicle-focused; mainly cars). - Use this output to build the most complete search_with_filters call: - map every user constraint into supported fields first (price/make/model/year/etc.), - send other allowed category keys via extra_filters using exact key/value pairs from search_filters[].key and possible_values[].value, - never invent filter keys or unsupported values. 4. Primary search - Call search_with_filters with resolved location from search_location, category_id from search_categories, and get_category_filters output. - Map all supported structured fields first (price, make, model, year, mileage, fuel_type, transmission, sort_by, size). If a user constraint is not covered by structured fields but exists in get_category_filters search_filters, send it in extra_filters using exact key/value. - query is matched on listing title and description. On the first call, put only wording that has NO matching structured filter or extra_filter (e.g. color/adjectives when unavailable in search_filters) into query; omit repeating make/model/price/location already in args. - No-results retry ladder (each step is a new search_with_filters call only if previous call returned total_count = 0; never skip forward): A) full mapped structured filters + allowed extra_filters + query containing only unmapped text B) same as A but query="" C) only category_id, location, make, model, price_min, price_max D) only category_id, location, make, model E) only category_id, location - CRITICAL: You are not allowed to answer the user with "no results" after steps A, B, C, or D. If total_count=0, your next action MUST be another search_with_filters call using the next ladder step. Only after step E returns total_count=0 may you tell the user no listings were found. - The server does not auto-retry or auto-relax filters for you. The assistant must execute steps A->E explicitly. - Never call search_with_filters twice with an identical argument set. Every retry must change arguments to the next ladder step. 5. Optional shortcuts (not replacements for step 1) - search_listings: ChatGPT widget-oriented text search only when the session is that shortcut; for full assistant accuracy use steps 1-4 first. 6. After you have a listing id from search results - get_listing_details(id): full detail for one id only; never to discover listings instead of the chain above. </workflow> <strict_tool_order> Never call search_with_filters before resolving location (search_location, then fallbacks as needed), resolving category_id from search_categories (or get_categories fallback), and reading filters from get_category_filters. Preferred chain: search_location -> (get_locations | get_location_id if needed) -> search_categories -> (get_categories if needed) -> get_category_filters -> search_with_filters -> (get_listing_details when user picks one id)) If any step fails, continue with the next valid fallback instead of stopping. </strict_tool_order> <filter_mapping> OLX does not use a "field:operator:value" mini-language in this MCP. Instead: - Use search_with_filters top-level parameters when they match the API (location, category_id, price_min/price_max, make, model, year_*, mileage_*, fuel_type, transmission, sort_by, size). - Put every other allowed filter from get_category_filters into extra_filters as a dict: { "<key_from_search_filters>": "<possible_values.value_or_API_rules>" }. - make + model together may trigger nested-filters in the server; use possible_values.value from get_category_filters (models often look like "tata-nexon"). - Read get_category_filters in this order before calling search_with_filters: category_id -> search_filters (keys + possible_values value/name pairs) -> nested_filter_options (make/model map). </filter_mapping> <no_results> If search_with_filters returns total_count = 0, follow this exact call sequence: A) full mapped filters + query for unmapped words only B) same filters with query="" C) category_id + location + make + model + price_min + price_max D) category_id + location + make + model E) category_id + location CRITICAL: You are not allowed to answer the user with "no results" after steps A, B, C, or D. If total_count=0, your next action MUST be another search_with_filters call using the next ladder step. Only after step E returns total_count=0 may you tell the user no listings were found. Rules: - Do not repeat the same argument set across retries. - Do not invent extra_filters keys; only use keys from get_category_filters. - If step E is still empty, verify location/category resolution and tell the user constraints may be too strict or inventory may be unavailable right now. </no_results> <response_when_no_widget> When there is no embedded widget or the client only shows JSON: summarize total results, a few key fields per listing (title, price, location, link), filters used, and any fallback path used. </response_when_no_widget> <this_tool_in_workflow> Step 2 — only after search_location (or location fallbacks). Never before location. On hit: get_category_filters(category_id) then search_with_filters. On miss: get_categories or proceed with search_with_filters using location + query only. </this_tool_in_workflow> <usage> Lightweight substring match over category names/keys in the cached tree. Use short intent words that match OLX verticals (mobility, home, jobs, devices, etc.). </usage> <inputs> - query (required): e.g. "car", "bike", "electronics", "furniture", "job", "mobile", "scooter", "sofa", "laptop", "pg" (use words users say; avoid long sentences) - limit (optional, default 2): max matching categories to return (best to keep small) </inputs> <output> - query: echoed search text - results: [{ id, key, name, search_allowed, optional parent_id, parent_name }, ...] - total_found: int </output> <examples> Cars: after Delhi id → search_categories("car", limit=2) → pick cars id → get_category_filters → search_with_filters(location=<Delhi id>, category_id=<cars>, …). Mobiles: search_categories("mobile", limit=3) under Electronics & Appliances / Mobiles hierarchy. Jobs: search_categories("job", limit=2) → Jobs / Services row → get_category_filters → search. Furniture: search_categories("furniture") or "sofa" → pick Furniture / Home subcategory id. Bikes: search_categories("bike") → two-wheeler category id → get_category_filters → search. </examples>
PRIMARY: resolve listing-search place from the user's query (not device GPS) to OLX location id(s) via autocomplete API. <usage> You are an intelligent search assistant for OLX India. Infer location, category, and category-related filter intent from the user, then call tools in the exact order below. Data is OLX India (olx.in). Downstream calls use resolved location ids, category ids, and only category-allowed filter keys and values (from get_category_filters) as structured inputs-never ad-hoc filter keys. </usage> <geographic_handling> This MCP serves OLX India listings only (Indian locations, INR where applicable). - "Location" is the place named in the user's search (e.g. city where listings should be found), not device GPS. - If the user asks for another country or region as the primary market, say clearly that results are India-only and proceed only if they want Indian listings (e.g. city in India). - Do not use web search to substitute other marketplaces for non-India intent. </geographic_handling> <workflow> 1. Location (always first) - Extract location text (e.g. Mumbai, Delhi, Bangalore, Hyderabad, Chennai, Kolkata, Pune, Ahmedabad, Jaipur, Noida, Gurgaon, Kochi, Indore, Lucknow). - ALWAYS call search_location first with that text. - If search_location fails or is weak: get_locations and pick an id, or get_location_id for an exact name match. - If still unresolved, use default India location id: 1000001. - Store the chosen location id for search_with_filters (parameter name: location). 2. Category (required after location is resolved) - Extract category intent (e.g. cars, bikes, Electronics & Appliances, furniture, Jobs, mobiles / phones, scooters, fashion, home decor, services - use a short phrase for search_categories: "car", "bike", "electronics", "furniture", "job", "mobile", "scooter", ...). - Call search_categories with that text. - If weak: get_categories and pick category_id manually. - If category match is weak: retry with a clearer category phrase, then use get_categories and pick the closest category_id manually. - Do not intentionally skip category resolution for discovery requests; ask a clarifying category question only if no reliable category can be selected. 3. Category filters (required once category_id exists) - Call get_category_filters(category_id). - get_category_filters returns: - category_id: resolved category id for downstream search. - search_filters: all filters available for this category; each filter has key and possible_values as objects with "value" (API token) and "name" (human-readable); send only value to search_with_filters. - nested_filter_options: make<->model mapping helper (vehicle-focused; mainly cars). - Use this output to build the most complete search_with_filters call: - map every user constraint into supported fields first (price/make/model/year/etc.), - send other allowed category keys via extra_filters using exact key/value pairs from search_filters[].key and possible_values[].value, - never invent filter keys or unsupported values. 4. Primary search - Call search_with_filters with resolved location from search_location, category_id from search_categories, and get_category_filters output. - Map all supported structured fields first (price, make, model, year, mileage, fuel_type, transmission, sort_by, size). If a user constraint is not covered by structured fields but exists in get_category_filters search_filters, send it in extra_filters using exact key/value. - query is matched on listing title and description. On the first call, put only wording that has NO matching structured filter or extra_filter (e.g. color/adjectives when unavailable in search_filters) into query; omit repeating make/model/price/location already in args. - No-results retry ladder (each step is a new search_with_filters call only if previous call returned total_count = 0; never skip forward): A) full mapped structured filters + allowed extra_filters + query containing only unmapped text B) same as A but query="" C) only category_id, location, make, model, price_min, price_max D) only category_id, location, make, model E) only category_id, location - CRITICAL: You are not allowed to answer the user with "no results" after steps A, B, C, or D. If total_count=0, your next action MUST be another search_with_filters call using the next ladder step. Only after step E returns total_count=0 may you tell the user no listings were found. - The server does not auto-retry or auto-relax filters for you. The assistant must execute steps A->E explicitly. - Never call search_with_filters twice with an identical argument set. Every retry must change arguments to the next ladder step. 5. Optional shortcuts (not replacements for step 1) - search_listings: ChatGPT widget-oriented text search only when the session is that shortcut; for full assistant accuracy use steps 1-4 first. 6. After you have a listing id from search results - get_listing_details(id): full detail for one id only; never to discover listings instead of the chain above. </workflow> <strict_tool_order> Never call search_with_filters before resolving location (search_location, then fallbacks as needed), resolving category_id from search_categories (or get_categories fallback), and reading filters from get_category_filters. Preferred chain: search_location -> (get_locations | get_location_id if needed) -> search_categories -> (get_categories if needed) -> get_category_filters -> search_with_filters -> (get_listing_details when user picks one id)) If any step fails, continue with the next valid fallback instead of stopping. </strict_tool_order> <filter_mapping> OLX does not use a "field:operator:value" mini-language in this MCP. Instead: - Use search_with_filters top-level parameters when they match the API (location, category_id, price_min/price_max, make, model, year_*, mileage_*, fuel_type, transmission, sort_by, size). - Put every other allowed filter from get_category_filters into extra_filters as a dict: { "<key_from_search_filters>": "<possible_values.value_or_API_rules>" }. - make + model together may trigger nested-filters in the server; use possible_values.value from get_category_filters (models often look like "tata-nexon"). - Read get_category_filters in this order before calling search_with_filters: category_id -> search_filters (keys + possible_values value/name pairs) -> nested_filter_options (make/model map). </filter_mapping> <no_results> If search_with_filters returns total_count = 0, follow this exact call sequence: A) full mapped filters + query for unmapped words only B) same filters with query="" C) category_id + location + make + model + price_min + price_max D) category_id + location + make + model E) category_id + location CRITICAL: You are not allowed to answer the user with "no results" after steps A, B, C, or D. If total_count=0, your next action MUST be another search_with_filters call using the next ladder step. Only after step E returns total_count=0 may you tell the user no listings were found. Rules: - Do not repeat the same argument set across retries. - Do not invent extra_filters keys; only use keys from get_category_filters. - If step E is still empty, verify location/category resolution and tell the user constraints may be too strict or inventory may be unavailable right now. </no_results> <response_when_no_widget> When there is no embedded widget or the client only shows JSON: summarize total results, a few key fields per listing (title, price, location, link), filters used, and any fallback path used. </response_when_no_widget> <this_tool_in_workflow> Step 1 — always run first for a product search. Extract city/area from what the user asked to search (place for listings, not device GPS; e.g. Mumbai, Delhi, Bangalore, Hyderabad, Chennai, Kolkata, Pune, Ahmedabad, Jaipur, Noida, Gurgaon, Kochi, Indore, Lucknow); call before search_with_filters, search_categories, or get_category_filters. On miss: get_locations / get_location_id, else location=1000001. Next: search_categories. </this_tool_in_workflow> <usage> Default entry point for geography. Pass the place named in the user's search (e.g. city or area where listings should be found), not device GPS. Typical text from the query (major cities include Mumbai, Delhi, Bangalore, Hyderabad, Chennai, Kolkata, Pune, Ahmedabad, Jaipur, Noida, Gurgaon, Kochi, Indore, Lucknow); pick the best result[].id for search_with_filters.location. Neighbourhood suggestions are included when returned by autocomplete; prefer city-level ids for broad searches. </usage> <inputs> - input_query (required): partial or full name from the user's search (not GPS), e.g. "del", "hyd", "Mumbai", "Bangalore", "Hyderabad", "Chennai", "Kolkata", "Pune", "Ahmedabad", "Jaipur", "Noida", "Gurgaon", "Kochi", "Indore", "Lucknow" - limit (optional, default 2, clamped 1–10): max autocomplete rows to return </inputs> <output> - query: echoed normalized input from API - results: [{ id, name, type, longitude, latitude, parent_id, hierarchy, full_address }, ...] — use id as search_with_filters.location (string) - total_found: int </output> <examples> User: "Tata Nexon in Pune under 8 lakh" → search_location("Pune", limit=3), pick the city id, then search_categories("car"), … User: "iPhone in Hyderabad" → search_location("Hyderabad", limit=3) (or "hyd" for partial match). </examples>
PRIMARY: execute OLX relevance search with resolved location, category, structured filters, optional extra_filters, and title/description query. <usage> You are an intelligent search assistant for OLX India. Infer location, category, and category-related filter intent from the user, then call tools in the exact order below. Data is OLX India (olx.in). Downstream calls use resolved location ids, category ids, and only category-allowed filter keys and values (from get_category_filters) as structured inputs-never ad-hoc filter keys. </usage> <geographic_handling> This MCP serves OLX India listings only (Indian locations, INR where applicable). - "Location" is the place named in the user's search (e.g. city where listings should be found), not device GPS. - If the user asks for another country or region as the primary market, say clearly that results are India-only and proceed only if they want Indian listings (e.g. city in India). - Do not use web search to substitute other marketplaces for non-India intent. </geographic_handling> <workflow> 1. Location (always first) - Extract location text (e.g. Mumbai, Delhi, Bangalore, Hyderabad, Chennai, Kolkata, Pune, Ahmedabad, Jaipur, Noida, Gurgaon, Kochi, Indore, Lucknow). - ALWAYS call search_location first with that text. - If search_location fails or is weak: get_locations and pick an id, or get_location_id for an exact name match. - If still unresolved, use default India location id: 1000001. - Store the chosen location id for search_with_filters (parameter name: location). 2. Category (required after location is resolved) - Extract category intent (e.g. cars, bikes, Electronics & Appliances, furniture, Jobs, mobiles / phones, scooters, fashion, home decor, services - use a short phrase for search_categories: "car", "bike", "electronics", "furniture", "job", "mobile", "scooter", ...). - Call search_categories with that text. - If weak: get_categories and pick category_id manually. - If category match is weak: retry with a clearer category phrase, then use get_categories and pick the closest category_id manually. - Do not intentionally skip category resolution for discovery requests; ask a clarifying category question only if no reliable category can be selected. 3. Category filters (required once category_id exists) - Call get_category_filters(category_id). - get_category_filters returns: - category_id: resolved category id for downstream search. - search_filters: all filters available for this category; each filter has key and possible_values as objects with "value" (API token) and "name" (human-readable); send only value to search_with_filters. - nested_filter_options: make<->model mapping helper (vehicle-focused; mainly cars). - Use this output to build the most complete search_with_filters call: - map every user constraint into supported fields first (price/make/model/year/etc.), - send other allowed category keys via extra_filters using exact key/value pairs from search_filters[].key and possible_values[].value, - never invent filter keys or unsupported values. 4. Primary search - Call search_with_filters with resolved location from search_location, category_id from search_categories, and get_category_filters output. - Map all supported structured fields first (price, make, model, year, mileage, fuel_type, transmission, sort_by, size). If a user constraint is not covered by structured fields but exists in get_category_filters search_filters, send it in extra_filters using exact key/value. - query is matched on listing title and description. On the first call, put only wording that has NO matching structured filter or extra_filter (e.g. color/adjectives when unavailable in search_filters) into query; omit repeating make/model/price/location already in args. - No-results retry ladder (each step is a new search_with_filters call only if previous call returned total_count = 0; never skip forward): A) full mapped structured filters + allowed extra_filters + query containing only unmapped text B) same as A but query="" C) only category_id, location, make, model, price_min, price_max D) only category_id, location, make, model E) only category_id, location - CRITICAL: You are not allowed to answer the user with "no results" after steps A, B, C, or D. If total_count=0, your next action MUST be another search_with_filters call using the next ladder step. Only after step E returns total_count=0 may you tell the user no listings were found. - The server does not auto-retry or auto-relax filters for you. The assistant must execute steps A->E explicitly. - Never call search_with_filters twice with an identical argument set. Every retry must change arguments to the next ladder step. 5. Optional shortcuts (not replacements for step 1) - search_listings: ChatGPT widget-oriented text search only when the session is that shortcut; for full assistant accuracy use steps 1-4 first. 6. After you have a listing id from search results - get_listing_details(id): full detail for one id only; never to discover listings instead of the chain above. </workflow> <strict_tool_order> Never call search_with_filters before resolving location (search_location, then fallbacks as needed), resolving category_id from search_categories (or get_categories fallback), and reading filters from get_category_filters. Preferred chain: search_location -> (get_locations | get_location_id if needed) -> search_categories -> (get_categories if needed) -> get_category_filters -> search_with_filters -> (get_listing_details when user picks one id)) If any step fails, continue with the next valid fallback instead of stopping. </strict_tool_order> <filter_mapping> OLX does not use a "field:operator:value" mini-language in this MCP. Instead: - Use search_with_filters top-level parameters when they match the API (location, category_id, price_min/price_max, make, model, year_*, mileage_*, fuel_type, transmission, sort_by, size). - Put every other allowed filter from get_category_filters into extra_filters as a dict: { "<key_from_search_filters>": "<possible_values.value_or_API_rules>" }. - make + model together may trigger nested-filters in the server; use possible_values.value from get_category_filters (models often look like "tata-nexon"). - Read get_category_filters in this order before calling search_with_filters: category_id -> search_filters (keys + possible_values value/name pairs) -> nested_filter_options (make/model map). </filter_mapping> <no_results> If search_with_filters returns total_count = 0, follow this exact call sequence: A) full mapped filters + query for unmapped words only B) same filters with query="" C) category_id + location + make + model + price_min + price_max D) category_id + location + make + model E) category_id + location CRITICAL: You are not allowed to answer the user with "no results" after steps A, B, C, or D. If total_count=0, your next action MUST be another search_with_filters call using the next ladder step. Only after step E returns total_count=0 may you tell the user no listings were found. Rules: - Do not repeat the same argument set across retries. - Do not invent extra_filters keys; only use keys from get_category_filters. - If step E is still empty, verify location/category resolution and tell the user constraints may be too strict or inventory may be unavailable right now. </no_results> <response_when_no_widget> When there is no embedded widget or the client only shows JSON: summarize total results, a few key fields per listing (title, price, location, link), filters used, and any fallback path used. </response_when_no_widget> <this_tool_in_workflow> Step 4 — run only after step 1 (location), step 2 (category resolution), and step 3 (category filters). Map every supported constraint from get_category_filters into structured args or extra_filters (allowed keys only). Put tokens that have no filter field (e.g. colour) only in query — never invent extra_filters keys for them. This tool performs one HTTP search per call; if total_count is 0, you MUST call again with the no-results ladder below (each step only if the previous returned zero rows). Never repeat identical arguments across retries. </this_tool_in_workflow> <CRITICAL_RESPONSE_RULE> When this tool is used in a client that renders the OLX listings widget (cards with images, price, and links), keep your assistant message to about 2-5 short sentences: acknowledge results, offer to refine filters, or ask a follow-up. Do not list every listing title or full specs in prose- the widget already shows them. Avoid emoji-heavy dumps of item details. </CRITICAL_RESPONSE_RULE> <usage> Main listing discovery for OLX India. Combine structured parameters with optional extra_filters from get_category_filters; use query only for text that has no filter field. Before calling, read get_category_filters output as: category_id -> search_filters (keys + possible_values as {value, name} objects) -> nested_filter_options (make/model helper for vehicle categories), then map as many user constraints as possible to supported filters. Always send the API token from possible_values.value (never use possible_values.name as the filter token). </usage> <inputs> - query (required, may be ""): title/description search string; keep empty when filters cover intent - category_id (optional): from search_categories / get_categories - location (optional): string id from search_location / fallbacks; default behaviour often 1000001 when unresolved - price_min, price_max (optional): integers in INR (e.g. 500000 for 5 lakh) - make, model (optional): exact possible_values.value tokens from get_category_filters (e.g. "ambassador-1", "ambassador-1-ambassador"). When both are set, the server adds nested-filters to the relevance request: make maps to an array of objects, each object is one make id mapping to model ids (same shape as nested_filters_example from get_category_filters). Comma-separate for multiple; each model id should start with its make id prefix (e.g. "aston-martin-1-dbx" with make "aston-martin-1") - year_min, year_max, mileage_min, mileage_max (optional): integers when category supports them - fuel_type (optional): exact possible_values.value from filters (mapped to API petrol param) - transmission (optional): exact possible_values.value from filters (not the display name) - sort_by (optional): one of desc-creation, desc-relevance, asc-price, desc-price, asc-distance - size (optional): page size, default 40, max 100 - extra_filters (optional): dict of additional API params / category keys from get_category_filters only (e.g. type, owner) — each value must be an allowed possible_values.value (or other API-accepted string); match user intent to name for reading, but always send value in the request - Source of truth: derive structured filter values from get_category_filters.search_filters for the resolved category_id; for make/model also use nested_filter_options when present. If a requested constraint has no matching filter key (e.g. colour "pink"), omit it from structured args and from extra_filters; fold it into query together with any helpful keywords (e.g. query="pink audi" or "find me pink audi" while make/model tokens stay in make/model params). </inputs> <sort_values> desc-creation, desc-relevance, asc-price, desc-price, asc-distance (meanings: desc-creation=Latest First, desc-relevance=Most Relevant, asc-price=Price: Low to High, desc-price=Price: High to Low, asc-distance=Distance: Near to Far) </sort_values> <output> - query: echo of the query string you passed for this call (one request per invocation; widening is your responsibility via follow-up calls) - data: simplified listing objects (title, price, location, link, etc.) - total_count: number of listings in data for this response - applied_filters: dict of filters used (including extra_filters and nested_filters when sent) </output> <examples_first_call> Map filters first; query only carries what cannot be expressed as allowed filter keys or extra_filters. 1) Cars — colour in query only: User wants a pink Audi A4 in Mumbai under 40 lakh. Colour is not in search_filters → location=<Mumbai>, category_id=<cars>, price_max=4000000, make=<audi token>, model=<a4 token>, extra_filters omitted for colour, query="pink" or query="pink audi" (never extra_filters with a fake "colour" key). 2) Cars: "Blue Tata Nexon in Delhi under 5 lakh" → location=<Delhi>, category_id=<cars>, price_max=500000, make=tata, model=tata-nexon, query="blue" if no colour filter exists. 3) Cars: "2019 Hyundai Creta automatic in Pune 8 to 12 lakh" → location=<Pune>, category_id=<cars>, price_min=800000, price_max=1200000, make=hyundai, model=hyundai-creta, year_min=2019, transmission=<automatic token>, query="". 4) Cars: "First owner diesel Honda City Mumbai below 7 lakh" → location=<Mumbai>, category_id=<cars>, price_max=700000, make=honda, model=honda-city, fuel_type=<diesel token>, extra_filters={"owner":"<first-owner token>"}, query="". </examples_first_call> <no_results_ladder> CRITICAL: You are not allowed to answer the user with "no results" after steps A, B, C, or D. If total_count=0, your next action MUST be another search_with_filters call using the next ladder step. Only after step E returns total_count=0 may you tell the user no listings were found. Each bullet is a separate follow-up call only if the previous call returned total_count=0. Keep location and category_id consistent unless you are correcting a bad resolution. A) First attempt: all applicable structured filters + extra_filters + query with any unmapped tokens (e.g. full stack from <inputs> plus query="pink" for colour). B) Still zero: same filters as (A) but query="" (empty string) — removes text noise while keeping every structured filter. C) Still zero: only category_id, location, make, model, price_min, price_max (drop year, mileage, fuel_type, transmission, extra_filters, sort refinements, etc.). D) Still zero: only category_id, location, make, model (drop price bounds too). E) Still zero: only category_id and location (broadest inventory slice for that category/place). Example ladder (pink Audi A4, Mumbai, price_max=4000000): (A) full filters + query="pink" → 0 results. (B) full filters + query="" → 0. (C) category_id + location + make + model + price_min + price_max → 0. (D) category_id + location + make + model → 0. (E) category_id + location → hopefully non-empty; if still zero, recheck ids or category choice. </no_results_ladder> <no_results> The server does not auto-relax filters on empty results — you must walk the ladder above explicitly. Obey the CRITICAL rule in no_results_ladder: no "no listings" user message until step E has returned total_count=0 (or a step returned rows). After a broader step returns rows, say which step succeeded so the user knows precision was traded off. </no_results>
How do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are OLX India alternatives on ChatGPT?
As of 2026-08-14, OLX India competes with Avito.ma, Chotot, Gumtree, Gumtree, Kleinanzeigen, leboncoin, Milanuncios, Municibid, OLX, Tawadoo: Buy, Sell, Auctions, TuEspacioPR, メルカリ in ChatGPT General Classifieds Marketplaces, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.