MCP server for querying StayHub — a Vietnamese homestay booking platform. Lets Claude Code (and other MCP clients) query listings, bookings, and stats via natural language.
Five tools with clear verb-noun naming (list_, get_, search_, top_) and comprehensive parameter schemas using Zod. All tools have descriptions (194 - 250 chars, within baseline 34 - 392 range). Input parameters are well-typed with enums, ranges, and descriptions. However, output schemas are not explicitly documented in the source, only inferred from Prisma queries. Error handling is minimal (try-catch wraps but no recovery guidance). No tool annotations (readOnlyHint, destructiveHint). All tools are READ_ONLY, which is safe, but the lack of explicit error messages and output documentation prevents a higher score.
Aggregate booking statistics for StayHub: total bookings, total revenue (VND), total nights, and a per-status breakdown. Optionally filter by city and a check-in date range.
Get full detail of one StayHub listing by ID. Returns all listing fields (with amenities + images parsed from JSON), host info (name, email, phone, avatar), and the 5 most recent reviews with guest name and rating.
List StayHub homestay listings, optionally filtered by city and price range. Returns id, title, city, pricePerNight, rating, reviewCount.
Find StayHub listings available for a given date range (no overlapping PENDING/CONFIRMED booking). Optionally filter by city and minimum guest capacity.
Rank StayHub cities by a chosen metric. Returns each city with its listingCount, bookingCount, and revenue (VND, excluding CANCELLED), sorted by the requested metric.
Output schemas not documented. Tool descriptions state what is returned (e.g., 'Returns id, title, city, pricePerNight, rating, reviewCount') but no formal schema definition is visible in code. LLMs cannot reliably extract fields or plan downstream calls without explicit output structure.
Error handling lacks recovery guidance. All tools wrap logic in try-catch but return generic errors without actionable next steps. E.g., if get_listing_detail fails, the LLM receives no hint to try search_available_rooms or list_listings first.
No tool annotations. All tools are READ_ONLY but lack explicit readOnlyHint annotations in the schema. This forces LLMs to infer safety from descriptions rather than machine-readable metadata.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
Parameter descriptions lack format/constraint details. E.g., 'checkIn' and 'checkOut' state 'ISO' format but do not specify that checkOut must be after checkIn, or what happens if dates are in the past. Undocumented dependencies invite invalid input.
No pagination metadata in list tools. list_listings and search_available_rooms accept 'limit' but do not return total count or next_cursor. Large result sets could exhaust context without clear indication of truncation.