MCP server for searching and extracting Chinese housing listings from multiple real estate websites
Two tools with complete input schemas and descriptions, but significant gaps in output documentation and error handling. search_housing has well-structured Pydantic models (SearchRequest, SearchResponse, Listing) with field descriptions in Chinese, but output schema is not explicitly documented in tool registration. get_listing_detail lacks output schema documentation entirely. Both tools accept reasonable parameters with types and defaults, but error recovery guidance is minimal. No tool annotations (readOnlyHint, destructiveHint) despite both being read-only operations.
Fetch and parse detailed information from a housing listing URL. Extracts structured data from JSON-LD, Next.js data, and HTML meta tags.
Search for housing listings based on city, district, keywords, price range, and other filters. Returns a list of candidate listings with basic information.
Output schemas not documented in tool definitions. search_housing and get_listing_detail return Pydantic models (SearchResponse, DetailResponse, Listing) but these are not exposed in the MCP tool schema. LLMs cannot predict response structure.
No error handling guidance. Tools call external APIs (DuckDuckGo, housing sites) with no documented error recovery paths. Captcha detection exists in code (_detect_blocked) but is not surfaced to LLM. No guidance on retryability or user-fixable errors.
Tool annotations missing. Both tools are read-only (risk: READ_ONLY declared) but lack readOnlyHint in schema. Agents cannot infer safety from tool metadata.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 53 | 2026-07-28+ | v2 |
get_listing_detail description is vague (60 chars). States 'Fetch and parse detailed information' but does not explain when to call it vs search_housing, what fields it extracts, or what formats it handles (JSON-LD, Next.js, HTML meta).
search_housing limit parameter lacks bounds. Default 10, suggested 5-20, but no min/max enforced. Unbounded limit could cause excessive API calls or context window overflow.