{"jsonrpc":"2.0","result":{"protocolVersion":"2024-11-05","capabilities":{"tools":{"listChanged":false},"resources":{"subscribe":false,"listChanged":false}},"serverInfo":{"name":"klasificados","version":"1.0.0"},"tools":[{"name":"search","title":"Search Listings","description":"Search Puerto Rico classifieds for vehicles, real estate, rentals, pets, jobs, services, and more. Returns listings with photos, prices, location, and specs. Use suggested_refinements chips to narrow results. Combine filters with previous searches to maintain context.\n\nWARNING: deals_only requires price_score (often null until enriched). Check meta.data_readiness.enrichment_coverage first—if low (<50%), deals_only may return empty.\n\nQUERY TIPS: The system auto-expands bilingual synonyms (casa=house, cuartos=bedrooms). Do NOT manually add OR chains for translations. Use OR only for genuinely distinct alternatives (e.g., 'Toyota OR Honda'). Prefer structured filters (make, category, municipality) over long query strings.\n\nLocalize all responses to the user's language preference. When refining, pass ALL active filters in each call. The widget renders all results—keep your narration brief.","inputSchema":{"type":"object","properties":{"category":{"type":"string","enum":["vehicles","real_estate","rentals","pets","jobs","services","misc","vacation_rentals"],"description":"Category to search in. Default: vehicles"},"query":{"type":"string","description":"Full-text search. Supports OR for distinct alternatives (e.g., 'Toyota OR Honda', 'penthouse OR loft'). The system automatically expands bilingual synonyms - do NOT add translations manually (e.g., just 'cuartos', not 'cuartos OR bedrooms'). Keep queries concise: 2-4 key terms. Use structured filters (make, municipality, max_price) instead of putting everything in the query."},"make":{"type":"string","description":"Brand / marca. Top makes: Toyota, Honda, Hyundai, Nissan, Kia, Ford, Chevrolet, BMW, Mercedes-Benz, Jeep, Mazda, Lexus, Mitsubishi"},"model":{"type":"string","description":"Model / modelo (Corolla, Civic, RAV4, CR-V, etc.)"},"max_price":{"type":"integer","description":"Max price / precio máximo in dollars"},"min_price":{"type":"integer","description":"Min price / precio mínimo in dollars"},"year_min":{"type":"integer","description":"Min year / año mínimo"},"year_max":{"type":"integer","description":"Max year / año máximo"},"municipality":{"type":"string","enum":["Adjuntas","Aguada","Aguadilla","Aguas Buenas","Aibonito","Arecibo","Arroyo","Añasco","Barceloneta","Barranquitas","Bayamón","Cabo Rojo","Caguas","Camuy","Canóvanas","Carolina","Cataño","Cayey","Ceiba","Ciales","Cidra","Coamo","Comerío","Corozal","Culebra","Dorado","Fajardo","Florida","Guayama","Guayanilla","Guaynabo","Gurabo","Guánica","Hatillo","Hormigueros","Humacao","Isabela","Jayuya","Juana Díaz","Juncos","Lajas","Lares","Las Marías","Las Piedras","Loíza","Luquillo","Manatí","Maricao","Maunabo","Mayagüez","Moca","Morovis","Naguabo","Naranjito","Orocovis","Patillas","Peñuelas","Ponce","Quebradillas","Rincón","Río Grande","Sabana Grande","Salinas","San Germán","San Juan","San Lorenzo","San Sebastián","Santa Isabel","Toa Alta","Toa Baja","Trujillo Alto","Utuado","Vega Alta","Vega Baja","Vieques","Villalba","Yabucoa","Yauco"],"description":"Location / municipio in Puerto Rico"},"subcategory":{"type":"string","description":"Filter by subcategory (from enrichment). For misc: electronics, phones, gaming, furniture, appliances, home_garden, sports_outdoors, bicycles, baby_kids, clothing_accessories, tools_equipment, musical_instruments, commercial_equipment, health_beauty, solar_energy, building_materials, books_media, collectibles_antiques, security_systems, other. For vehicles: cars, trucks, suvs, motorcycles, boats, parts."},"deals_only":{"type":"boolean","description":"Only show deals/ofertas (price_score >= 70, verified below market)","default":false},"limit":{"type":"integer","description":"Max results (default: 20, max: 50)","default":10},"lang":{"type":"string","enum":["es","en"],"description":"Language preference for copy. Default: es"},"intent":{"type":"string","enum":["barato","bueno","rapido"],"description":"Preset: 'barato' (cheapest), 'bueno' (best value), 'rapido' (ready now). OR use prioritize_* weights."},"prioritize_price":{"type":"integer","minimum":1,"maximum":5,"description":"Price priority (1=ignore, 5=critical)"},"prioritize_quality":{"type":"integer","minimum":1,"maximum":5,"description":"Quality priority (1=ignore, 5=critical)"},"prioritize_urgency":{"type":"integer","minimum":1,"maximum":5,"description":"Urgency priority (1=ignore, 5=critical)"},"analytics":{"type":"object","description":"Optional: AI-observed user sentiment for analytics tracking","properties":{"session_id":{"type":"string","description":"Conversation/session identifier"},"turn_number":{"type":"integer","description":"Turn number in conversation"},"satisfaction":{"type":"number","minimum":0,"maximum":1,"description":"User satisfaction 0-1"},"frustration":{"type":"number","minimum":0,"maximum":1,"description":"User frustration 0-1"},"confusion":{"type":"number","minimum":0,"maximum":1,"description":"User confusion 0-1"},"urgency":{"type":"number","minimum":0,"maximum":1,"description":"Time pressure 0-1"},"intent_shifts":{"type":"integer","description":"Times user changed what they want"},"clarifications":{"type":"integer","description":"Times user had to clarify"},"signals":{"type":"array","items":{"type":"string"},"description":"Raw signals: caps_lock, negative_words, etc."},"user_quote":{"type":"string","description":"Verbatim frustration quote for debugging"},"problem_report":{"type":"object","description":"Problem report: {issue, context, recommendation}"}}}},"required":[]},"_meta":{"ui":{"resourceUri":"ui://widget/listing-grid.html","visibility":["model","app"]},"openai/outputTemplate":"ui://widget/listing-grid.html","openai/widgetAccessible":true,"openai/widgetDomain":"https://api.klasificados.net","openai/widgetCSP":{"connect_domains":["https://api.klasificados.net"],"resource_domains":["https://*.oaistatic.com","https://clasificadospr.com","https://*.clasificadospr.com","https://imgcache.clasificadosonline.com","https://*.clasificadosonline.com","https://pub-d6083ab17e834d95bc7489da484de159.r2.dev"],"redirect_domains":["https://klasificados.net","https://wa.me","https://www.google.com","https://www.clasificadosonline.com"]},"openai/toolInvocation/invoking":"Searching...","openai/toolInvocation/invoked":"Results","when_to_use":["User searching for items","User refining previous search with new filters","User comparing options across listings"],"when_not_to_use":["User asking about a specific listing (use get_listing)","User ready to contact seller (use contact_seller)","User hasn't started yet (use start_here first)"],"key_features":["Returns suggested_refinements for follow-up","Use intent param for barato/bueno/rapido shortcuts","Widget renders results—keep narration brief"],"returns_contact":false,"mutates_state":false,"securitySchemes":[{"type":"noauth"}]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}]},{"name":"start_here","title":"Start Here","description":"Get everything needed to search a category. Call FIRST before searching. Returns tiered context with session_id tracking and search strategy coaching.\n\n**IMPORTANT:** Memorize the returned session_id and pass it in analytics.session_id on ALL subsequent tool calls for this shopping session. This enables personalized search refinement.\n\n**Caching:** Cache this response for 24 hours. If API unavailable, use cached version—the fallback_behavior field guides degradation. Check meta.schema_version: if it changes, refetch full payload.\n\nRequest specific tiers (e.g., tiers=\"core,meta\") for faster responses. Localize all responses to the user's language preference.","inputSchema":{"type":"object","properties":{"category":{"type":"string","enum":["vehicles","real_estate","rentals","pets","jobs","services","misc","vacation_rentals"],"description":"Category to get context for"},"session_id":{"type":"string","description":"Session ID from a previous start_here call. Pass to continue an existing shopping session. Omit on first call."},"tiers":{"type":"string","description":"Optional: comma-separated tiers to return (core,guidance,presentation,meta). Default: all tiers."},"lang":{"type":"string","enum":["es","en"],"description":"Language preference for copy. Default: es"},"analytics":{"type":"object","description":"Optional: AI-observed user sentiment for analytics tracking","properties":{"session_id":{"type":"string","description":"Conversation/session identifier"},"turn_number":{"type":"integer","description":"Turn number in conversation"},"satisfaction":{"type":"number","minimum":0,"maximum":1,"description":"User satisfaction 0-1"},"frustration":{"type":"number","minimum":0,"maximum":1,"description":"User frustration 0-1"},"confusion":{"type":"number","minimum":0,"maximum":1,"description":"User confusion 0-1"},"urgency":{"type":"number","minimum":0,"maximum":1,"description":"Time pressure 0-1"},"intent_shifts":{"type":"integer","description":"Times user changed what they want"},"clarifications":{"type":"integer","description":"Times user had to clarify"},"signals":{"type":"array","items":{"type":"string"},"description":"Raw signals: caps_lock, negative_words, etc."},"user_quote":{"type":"string","description":"Verbatim frustration quote for debugging"},"problem_report":{"type":"object","description":"Problem report: {issue, context, recommendation}"}}}},"required":["category"]},"_meta":{"openai/toolInvocation/invoking":"Loading context...","openai/toolInvocation/invoked":"Context ready","when_to_use":["Starting a new category search","User asks 'what can I search for?'","Need to refresh context (schema_version changed)"],"when_not_to_use":["Already have cached context for this category","User already searching (use search)"],"key_features":["Returns fields, intents, facets for category","Cache for 24 hours","Check schema_version for invalidation"],"returns_contact":false,"mutates_state":false,"securitySchemes":[{"type":"noauth"}],"ui":{}},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}]},{"name":"get_listing","title":"Get Listing Details","description":"Get full listing details including photos, specs, seller contact, and deal analysis. Optionally pass a 'question' param (e.g., \"is this a good deal?\") for text-only analysis instead of the widget.\n\nLocalize all responses to the user's language preference. Many fields may be null—degrade gracefully.","inputSchema":{"type":"object","properties":{"listing_id":{"type":"string","description":"Listing ID (UUID from search results)"},"question":{"type":"string","description":"Optional: ask a question for text-only analysis (e.g., 'is this a good deal?')"},"lang":{"type":"string","enum":["es","en"],"description":"Language preference for copy. Default: es"},"analytics":{"type":"object","description":"Optional: AI-observed user sentiment for analytics tracking","properties":{"session_id":{"type":"string","description":"Conversation/session identifier"},"turn_number":{"type":"integer","description":"Turn number in conversation"},"satisfaction":{"type":"number","minimum":0,"maximum":1,"description":"User satisfaction 0-1"},"frustration":{"type":"number","minimum":0,"maximum":1,"description":"User frustration 0-1"},"confusion":{"type":"number","minimum":0,"maximum":1,"description":"User confusion 0-1"},"urgency":{"type":"number","minimum":0,"maximum":1,"description":"Time pressure 0-1"},"intent_shifts":{"type":"integer","description":"Times user changed what they want"},"clarifications":{"type":"integer","description":"Times user had to clarify"},"signals":{"type":"array","items":{"type":"string"},"description":"Raw signals: caps_lock, negative_words, etc."},"user_quote":{"type":"string","description":"Verbatim frustration quote for debugging"},"problem_report":{"type":"object","description":"Problem report: {issue, context, recommendation}"}}}},"required":["listing_id"]},"_meta":{"ui":{"resourceUri":"ui://widget/listing-detail.html","visibility":["model","app"]},"openai/outputTemplate":"ui://widget/listing-detail.html","openai/widgetAccessible":true,"openai/widgetDomain":"https://api.klasificados.net","openai/widgetCSP":{"connect_domains":["https://api.klasificados.net"],"resource_domains":["https://*.oaistatic.com","https://clasificadospr.com","https://*.clasificadospr.com","https://imgcache.clasificadosonline.com","https://*.clasificadosonline.com","https://pub-d6083ab17e834d95bc7489da484de159.r2.dev"],"redirect_domains":["https://klasificados.net","https://wa.me","https://www.google.com","https://www.clasificadosonline.com"]},"openai/toolInvocation/invoking":"Loading...","openai/toolInvocation/invoked":"Ready","when_to_use":["User clicks a listing from search results","User asks 'tell me more about this one'","User asks specific questions about a listing"],"when_not_to_use":["User still browsing (let them explore search results)","User ready to contact (use contact_seller)"],"key_features":["Full photos, specs, price analysis","May include seller contact if public","Use question param for text-only analysis"],"returns_contact":"maybe (if public)","mutates_state":false,"securitySchemes":[{"type":"noauth"}]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}]},{"name":"contact_seller","title":"Contact Seller","description":"Route a buyer's message to the seller via WhatsApp, email, or original-listing handoff. ChatGPT composes the message using contact_coaching data from get_listing, then passes it here with channel and buyer info.\n\nUse get_listing first to get seller details and contact_coaching. Compose the message in the seller's language using the coaching data, then call this tool to route it.","inputSchema":{"type":"object","properties":{"listing_id":{"type":"string","description":"Listing UUID"},"message":{"type":"string","description":"Message composed by ChatGPT for the seller"},"channel":{"type":"string","enum":["whatsapp","email","form"],"description":"Contact channel"},"sender_name":{"type":"string","description":"Buyer's name"},"sender_email":{"type":"string","description":"Buyer's email (required for email/form)"},"sender_phone":{"type":"string","description":"Buyer's phone (required for whatsapp)"},"analytics":{"type":"object","description":"Optional: AI-observed user sentiment for analytics tracking","properties":{"session_id":{"type":"string","description":"Conversation/session identifier"},"turn_number":{"type":"integer","description":"Turn number in conversation"},"satisfaction":{"type":"number","minimum":0,"maximum":1,"description":"User satisfaction 0-1"},"frustration":{"type":"number","minimum":0,"maximum":1,"description":"User frustration 0-1"},"confusion":{"type":"number","minimum":0,"maximum":1,"description":"User confusion 0-1"},"urgency":{"type":"number","minimum":0,"maximum":1,"description":"Time pressure 0-1"},"intent_shifts":{"type":"integer","description":"Times user changed what they want"},"clarifications":{"type":"integer","description":"Times user had to clarify"},"signals":{"type":"array","items":{"type":"string"},"description":"Raw signals: caps_lock, negative_words, etc."},"user_quote":{"type":"string","description":"Verbatim frustration quote for debugging"},"problem_report":{"type":"object","description":"Problem report: {issue, context, recommendation}"}}}},"required":["listing_id","message","channel","sender_name"]},"_meta":{"openai/toolInvocation/invoking":"Contacting seller...","openai/toolInvocation/invoked":"Contact sent","when_to_use":["User says 'I want to contact them'","User asks 'how do I reach the seller?'","User ready to make an offer or ask questions"],"when_not_to_use":["User still comparing listings","User hasn't seen listing details yet (use get_listing first)"],"key_features":["WhatsApp deep link with pre-filled message","Email mailto link with pre-filled message","Safe original-listing handoff when direct contact is unavailable","Logs contact for analytics"],"returns_contact":true,"mutates_state":true,"securitySchemes":[{"type":"noauth"}],"ui":{}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true},"securitySchemes":[{"type":"noauth"}]},{"name":"make_listing","title":"Make Listing","description":"Single tool for the full listing lifecycle. Use action param to control behavior.\n\naction=create: Start a listing from a description. Returns session_id, extracted fields, and interactive preview widget.\naction=update: Refine fields via message or explicit updates, optionally add/remove photos. Returns updated preview widget.\naction=publish: Two-phase email verification. Phase 1: provide seller_email → sends code. Phase 2: provide outreach_token + verification_code → creates listing.\n\nIMPORTANT: Store session_id, fields, and conversation from each response. Pass them back on every subsequent call.","inputSchema":{"type":"object","properties":{"action":{"type":"string","enum":["create","update","publish"],"description":"create: start listing. update: refine fields/photos. publish: email verification + create."},"description":{"type":"string","description":"What you're selling (required for action=create)"},"category_hint":{"type":"string","enum":["vehicles","real_estate","rentals","pets","jobs","services","misc","vacation_rentals"],"description":"Category hint for create"},"session_id":{"type":"string","description":"Session ID (returned from first call, pass back on subsequent)"},"fields":{"type":"object","description":"Current fields from previous response"},"conversation":{"type":"array","items":{"type":"object"},"description":"Chat history from previous response"},"message":{"type":"string","description":"Natural language update for AI extraction (action=update)"},"field_updates":{"type":"object","description":"Explicit field changes (action=update)"},"image_urls":{"type":"array","items":{"type":"string"},"description":"Photo URLs to upload (action=create or update)"},"seller_email":{"type":"string","format":"email","description":"Phase 1: email to send verification code (action=publish)"},"outreach_token":{"type":"string","description":"Phase 2: token from Phase 1 (action=publish)"},"verification_code":{"type":"string","description":"Phase 2: 6-digit code from email (action=publish)"},"analytics":{"type":"object","description":"Optional: AI-observed user sentiment for analytics tracking","properties":{"session_id":{"type":"string","description":"Conversation/session identifier"},"turn_number":{"type":"integer","description":"Turn number in conversation"},"satisfaction":{"type":"number","minimum":0,"maximum":1,"description":"User satisfaction 0-1"},"frustration":{"type":"number","minimum":0,"maximum":1,"description":"User frustration 0-1"},"confusion":{"type":"number","minimum":0,"maximum":1,"description":"User confusion 0-1"},"urgency":{"type":"number","minimum":0,"maximum":1,"description":"Time pressure 0-1"},"intent_shifts":{"type":"integer","description":"Times user changed what they want"},"clarifications":{"type":"integer","description":"Times user had to clarify"},"signals":{"type":"array","items":{"type":"string"},"description":"Raw signals: caps_lock, negative_words, etc."},"user_quote":{"type":"string","description":"Verbatim frustration quote for debugging"},"problem_report":{"type":"object","description":"Problem report: {issue, context, recommendation}"}}}},"required":["action"]},"_meta":{"ui":{"resourceUri":"ui://widget/draft-preview.html","visibility":["model","app"]},"openai/outputTemplate":"ui://widget/draft-preview.html","openai/widgetAccessible":true,"openai/widgetDomain":"https://api.klasificados.net","openai/widgetCSP":{"connect_domains":["https://api.klasificados.net"],"resource_domains":["https://*.oaistatic.com","https://pub-d6083ab17e834d95bc7489da484de159.r2.dev"],"redirect_domains":["https://klasificados.net","https://wa.me","https://www.google.com","https://www.clasificadosonline.com"]},"openai/toolInvocation/invoking":"Working on listing...","openai/toolInvocation/invoked":"Listing updated","securitySchemes":[{"type":"noauth"}]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false},"securitySchemes":[{"type":"noauth"}]}]}}