MCP server for searching Loopnet commercial real estate listings
Three tools with complete input schemas and descriptions. Naming follows verb_noun pattern (search_, get_). Descriptions are adequate (100-200 chars) but lack actionable recovery guidance for errors. Parameters are typed and mostly described, but lack enums for constrained values (property_type, listing_type, price_type). Output schemas are not documented, LLMs cannot predict response structure. Error handling returns generic error dicts without guidance on retry or next steps. No tool annotations (readOnlyHint, idempotentHint). Composition is sound: three distinct, single-purpose tools with clear separation.
Get a market overview with aggregate statistics for commercial real estate in a location. Args: location: City and state (e.g. 'Houston, TX'), state abbreviation ('TX'), or zip code ('77001'). property_type: Property type: office, retail, industrial, multifamily, land. Returns: Market statistics including total listings, average price, price per sqft, and breakdowns by type.
Get full details for a specific Loopnet commercial property listing. Args: url_or_id: Full Loopnet URL (e.g. 'https://www.loopnet.com/Listing/...') or listing ID number. Returns: Comprehensive property information including price, size, year built, description, broker info, and images.
Search Loopnet for commercial real estate listings by location and filters. Args: location: City and state (e.g. 'Houston, TX'), state abbreviation ('TX'), or zip code ('77001'). property_type: Property type: office, retail, industrial, multifamily, land, hospitality, special-purpose, health-care. Synonyms accepted (e.g. 'apartment', 'apartments', 'duplex', 'triplex', 'quadplex', 'multi-family'). listing_type: Either 'for-sale' or 'for-lease'. Defaults to 'for-sale'. price_min: Minimum price filter in dollars. price_max: Maximum price filter in dollars. price_type: Price basis: 'unit' ($/unit), 'sf' ($/sqft), or 'acre' ($/acre). size_min: Minimum size filter in square feet. size_max: Maximum size filter in square feet. page: Page number (1-indexed). Check has_next_page in the response to know if more pages are available. Returns: Search results with matching property listings.
No output schema documentation. LLMs cannot predict response structure (SearchResult, PropertyDetail, MarketOverview fields). Downstream tool chaining and field extraction require guesswork.
Constrained parameters lack enums. property_type accepts 'office, retail, industrial, multifamily, land, hospitality, special-purpose, health-care' but is defined as free-form string. LLMs may hallucinate invalid values. listing_type and price_type similarly unconstrained.
Error responses lack recovery guidance. Both tools return {'error': str(e), ...} with no actionable next steps. Pattern: 'User not found. Try search_users() first.' is absent. LLMs cannot self-correct.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | <=2025-11-25 | v2 |
No tool annotations. Tools are read-only (safe to retry) but lack readOnlyHint. Agents cannot distinguish safe tools from destructive ones without explicit hints.
Parameter descriptions include example values ('Houston, TX', 'https://www.loopnet.com/Listing/...'). LLMs tend to reuse examples literally in real calls, causing failures.