izakaya-search
npx skills add https://github.com/danishi/claude-code-config --skill izakaya-search
Agent 安装分布
Skill 文档
Izakaya Search – Japanese Restaurant Recommendation Skill
Interactively find the best izakaya and restaurants by hearing the user’s requirements and searching gourmet sites and Google Maps.
Workflow
Step 1: Interview the user
Ask the user the following questions using the AskUserQuestion tool.
Gather all required information before searching. If any additional context
is provided by the user (e.g., “quiet atmosphere”, “private rooms”,
“all-you-can-drink”), incorporate it into the search.
Required information
| Item | Question example | Notes |
|---|---|---|
| Area / location | “Which area or station are you looking for?” | Accept station names, city names, or landmarks |
| Party size | “How many people?” | Important for seat/room availability |
| Budget per person | “What is your budget per person?” | Accept ranges like “3,000-5,000 yen” |
Optional information (ask if not already provided)
| Item | Question example | Notes |
|---|---|---|
| Date and time | “When are you planning to go?” | Affects availability and course options |
| Cuisine preferences | “Any preferred cuisine type?” | e.g., Japanese, seafood, yakitori, Korean, etc. |
| Must-have features | “Any requirements?” | e.g., private rooms, smoking/non-smoking, all-you-can-drink, accessibility |
| Occasion | “What is the occasion?” | e.g., casual drinks, welcome/farewell party, date, business dinner |
Step 2: Search for restaurants
Use WebSearch to search across multiple gourmet platforms. Execute
multiple searches in parallel when possible for efficiency.
Search queries to execute
Build search queries combining the user’s requirements. Always search at least these sources:
-
Tabelog (é£ã¹ãã°)
"é£ã¹ãã° {area} å± é å± {cuisine} {features}" -
Hot Pepper Gourmet (ããããããã¼ã°ã«ã¡)
"ããããããã¼ {area} å± é å± {party_size}å {budget}" -
Gurunavi (ãããªã³)
"ãããªã³ {area} å± é å± {features} {cuisine}" -
Google Maps
"Google Maps {area} å± é å± {cuisine} å£ã³ã"
Search strategy
- Run 3-5 parallel
WebSearchcalls with different query variations - Include budget and party size keywords in queries
- Add optional preferences (private room, all-you-can-drink, etc.)
- Search for specific course/plan information when budget is specified
- If initial results are insufficient, refine queries and search again
- Prefer extracting information from
WebSearchsnippets when possible, especially for sites known to blockWebFetch(see Step 3)
Step 3: Gather detailed information
Use WebFetch to visit the top candidate restaurant pages and collect:
- Restaurant name and address
- Business hours and regular holidays
- Review ratings from each source
- Course menus and pricing
- Seat count and room types (counter, table, private room, tatami)
- Reservation availability
- Direct reservation page URLs
- Notable features (all-you-can-drink plans, smoking policy, etc.)
WebFetch resilience strategy
Batch size control (critical):
Parallel WebFetch calls share a failure boundary â if one call returns
an error (403, 404, timeout), all sibling calls in the same batch are
cancelled. To mitigate this:
- Limit parallel batches to 2-3 calls maximum (never 5+)
- Group by reliability tier â put sites that are likely to succeed together, and isolate risky sites into their own batch or run them sequentially
- Prioritize high-value fetches â fetch the most important pages first so that even if later batches fail, you already have usable data
Site reliability tiers:
| Tier | Sites | Strategy |
|---|---|---|
| Tier 1 (reliable) | Google Maps, aumo, ãããµã©, ãããã¤, TripAdvisor | Safe to batch together (2-3 per batch) |
| Tier 2 (sometimes blocked) | ãããªã³ (r.gnavi.co.jp) |
Fetch individually or with Tier 1 sites |
| Tier 3 (frequently blocked) | é£ã¹ãã° (tabelog.com), ããããããã¼ (hotpepper.jp), RETRIP (rtrp.jp) |
Fetch individually; expect 403 errors |
| Tier 4 (not fetchable) | JS-rendered SPAs (colmo, etc.) | Skip WebFetch; rely on WebSearch snippets only |
Fallback strategy when WebFetch fails:
- Extract as much information as possible from
WebSearchresult snippets (ratings, addresses, phone numbers often appear in snippets) - Try alternative URLs for the same restaurant on a different platform
- Use Google Maps search results, which tend to be the most accessible
- If a specific restaurant page is critical, try the Google cached
version via
WebSearch:"cache:{url}"or"{restaurant_name} site:{domain}"
Step 4: Calculate composite review ratings
Compute a weighted composite score from available review sources:
| Source | Weight | Score range | Notes |
|---|---|---|---|
| Google Maps | 45% | 1.0 – 5.0 | Largest review volume; highest weight |
| Tabelog | 35% | 1.0 – 5.0 | Most trusted for food quality in Japan |
| Hot Pepper / Gurunavi | 20% | 1.0 – 5.0 | Useful for atmosphere and service |
Composite score formula:
composite = (google * 0.45) + (tabelog * 0.35) + (hotpepper_or_gurunavi * 0.20)
- If a source is unavailable, redistribute its weight proportionally to the remaining sources
- Example: If only Google (4.2) and Tabelog (3.8) are available:
- Google weight: 0.45 / (0.45 + 0.35) = 0.5625
- Tabelog weight: 0.35 / (0.45 + 0.35) = 0.4375
- Composite: (4.2 * 0.5625) + (3.8 * 0.4375) = 4.025
- Display scores rounded to 2 decimal places
- Include the number of reviews from each source when available
Google Maps fake review (sakura) detection
Google Maps reviews are susceptible to fake positive reviews (ãµã¯ã©). When gathering Google Maps data, always check for the following red flags and apply a penalty to the Google Maps score if detected:
| Red flag | How to detect | Penalty |
|---|---|---|
| Suspiciously high ratio of 5-star reviews | >80% of reviews are 5-star with very few 3-4 star | -0.3 from Google score |
| Generic/short praise comments | Many reviews are only 1-2 sentences like “ç¾å³ããã£ãï¼” with no detail | -0.2 from Google score |
| Reviewer profiles with only 1 review | Multiple reviewers who have only ever reviewed this one restaurant | -0.3 from Google score |
| Review spike pattern | Large number of reviews posted within a short time period | -0.3 from Google score |
| Score gap vs. Tabelog | Google score is â¥1.0 higher than Tabelog score for the same restaurant | -0.2 from Google score |
Detection process:
- When using
WebFetchon the Google Maps page, scan the visible review comments (at least 5-10 recent reviews) - Check if most comments are generic one-liners without specific dish or experience details
- Look at reviewer info: are they “Local Guide” with many reviews, or single-review accounts?
- Compare the Google Maps score against the Tabelog score; a gap of â¥1.0 is a strong signal of inflated reviews
- Apply cumulative penalties (cap at -0.8 total) and note the adjustment in the output as “adjusted score“
- If fake reviews are suspected, add a warning emoji and note:
â Google Maps score adjusted ({original} â {adjusted}): suspected fake reviews detected
Step 5: Format and present results
Present 3 to 5 recommended restaurants directly in Markdown format as follows:
Recommendation output format
For each restaurant, present:
## {rank}. {restaurant_name}
**Composite Rating: {composite_score}/5.00** ({total_reviews} reviews)
| Source | Rating | Reviews |
|---|---|---|
| Tabelog | {score}/5.0 | {count} reviews |
| Google Maps | {score}/5.0 | {count} reviews |
| Hot Pepper | {score}/5.0 | {count} reviews |
- **Genre:** {cuisine_type}
- **Area:** {area} ({nearest_station}, {walk_minutes} min walk)
- **Budget:** {budget_range} per person
- **Hours:** {business_hours}
- **Regular holiday:** {holidays}
- **Seats:** {seat_count} seats ({room_types})
- **Features:** {features}
### Recommended courses
| Course name | Price | Duration | Includes |
|---|---|---|---|
| {course_name} | {price} | {duration} | {description} |
### Quick links
- [Tabelog page]({tabelog_url})
- [Hot Pepper page]({hotpepper_url})
- [Google Maps]({google_maps_url})
- [Reserve on Tabelog]({tabelog_reservation_url})
- [Reserve on Hot Pepper]({hotpepper_reservation_url})
- [Call to reserve](tel:{phone_number})
Step 6: Assist with reservation
After presenting results, ask the user:
- “Would you like more details about any of these restaurants?”
- “Shall I search for more options with different criteria?”
- “Would you like help narrowing down the choice?”
If the user selects a restaurant, provide:
- Direct reservation page links (one-click access)
- Phone number for telephone reservations
- Google Maps link for directions
- Recommended course based on their budget and party size
Tips for Effective Searching
- Area specificity matters: “æ°å®¿é§ æ±å£” yields better results than “æ°å®¿”
- Include occasion context: Searching “æéè¿ä¼” or “女åä¼” gives targeted results
- Budget keywords help: Include “3000å” or “é£²ã¿æ¾é¡ä»ã” to filter results
- Verify recency: Check that business hours and holiday info are current
- Cross-reference ratings: A restaurant with high ratings on both Tabelog and Google Maps is more reliably good than one with a high score on only one platform
See references/search-guide.md for a comprehensive search strategy reference.
Error Handling
Search-level issues
| Issue | Solution |
|---|---|
| No results found for area | Broaden the area (e.g., “æ°å®¿” instead of “æ°å®¿ä¸ä¸ç®”) |
| Budget too restrictive | Suggest adjusting budget range or removing course requirement |
| No reviews available | Note this to the user; rely on other available sources |
| Outdated information suspected | Warn the user and suggest calling to confirm |
| All-you-can-drink not available | Suggest alternative plans or nearby options that offer it |
WebFetch access errors
| Error | Affected sites | Solution |
|---|---|---|
| HTTP 403 Forbidden | é£ã¹ãã°, ããããããã¼, RETRIP | Bot protection is active. Do NOT retry. Use WebSearch snippets for ratings/info, or fetch the same restaurant from a Tier 1 site instead |
| HTTP 404 Not Found | ããããããã¼ (store pages) | URL may have changed. Search for the restaurant name + “ããããããã¼” via WebSearch to find the current URL |
| Sibling call cancelled | Any site in a failed batch | A different call in the same parallel batch failed. Re-fetch the cancelled URLs in a new, smaller batch (1-2 calls) |
| Empty/JS-only content | colmo, some SPA-based review sites | Site requires JavaScript rendering. Skip WebFetch and rely on WebSearch snippets only |
| Timeout | Any site under heavy load | Retry once individually (not in a batch). If still failing, fall back to WebSearch snippets |
Recovery priority
When multiple fetches fail, prioritize recovery in this order:
- Google Maps pages â highest weight in composite score (45%)
- Tabelog search result pages â often accessible even when individual store pages are blocked
- ãããªã³ store pages â moderate success rate
- ããããããã¼ â lowest priority due to frequent blocks; use
WebSearchsnippets for course/coupon info