| name | city-research |
| description | Research things to do in a city by performing targeted Google searches for museums, restaurants, tourist attractions, historical sites, street food, bars, markets, cultural experiences, and tech-related places. Use when a user asks to research or find things to do in a city. |
City Research Skill
Research comprehensive information about things to do in a specific city using targeted Google searches and web scraping.
Overview
This skill automates the process of researching a city by:
- Performing multiple Google searches with targeted queries for different activity types
- Leveraging authoritative sources like Lonely Planet and Eater
- Scraping the top results from each search
- Organizing the content by activity category
- Saving everything in a structured format for later use
When to Use
Use this skill when a user:
- Asks to "research things to do in [city name]"
- Wants to "find activities in [city name]"
- Requests information about "what to see in [city name]"
- Needs comprehensive travel information for a specific city
- Wants to know about restaurants, museums, attractions, etc. in a city
Activity Categories
The skill searches for these types of activities:
| Category | Description | Example Searches |
|---|
| Museums | Museums to visit | "best museums in [city]", "lonely planet museums [city]" |
| Restaurants | Good places to eat | "best restaurants in [city]", "eater [city]" |
| Local Food | Food that is local or famous | "famous food in [city]", "[city] local dishes eater" |
| Tourist Attractions | Top tourist spots | "top tourist attractions [city]", "lonely planet things to do in [city]" |
| Tech Places | Interesting tech-related places | "tech museums [city]", "tech hubs [city]" |
| Bars | Top bars and nightlife | "best bars [city]", "top nightlife [city]" |
| Markets | Local markets | "markets in [city]", "[city] local markets" |
| Street Food | Street food spots | "best street food [city]", "[city] street food guide" |
| Historical Sites | Historical landmarks | "historical sites [city]", "[city] historical landmarks" |
| Cultural Experiences | Traditional festivals, events, cultural activities | "cultural experiences [city]", "[city] traditional festivals events" |
Authoritative Sources
The skill prioritizes these trusted sources:
Lonely Planet
- What it is: Renowned travel guide publisher with comprehensive city guides
- Why we use it: High-quality, well-researched content about destinations
- Example query:
lonely planet things to do in Mexico City
Eater
- What it is: Trusted food and restaurant aggregation website
- Why we use it: Expert-curated lists of top restaurants, best dishes, and food guides
- Example query:
eater Mexico City
Usage
Basic Usage
npx tsx .github/skills/city-research/scripts/research-city.ts "Mexico City"
Advanced Usage
npx tsx .github/skills/city-research/scripts/research-city.ts "Paris" 5
npx tsx .github/skills/city-research/scripts/research-city.ts "Tokyo" 3 ./data/destinations/tokyo-research
npx tsx .github/skills/city-research/scripts/research-city.ts "New York" 3 ./data/scraped/nyc museums,restaurants,bars
Command Syntax
npx tsx .github/skills/city-research/scripts/research-city.ts <city-name> [num-results] [output-dir] [categories]
Arguments:
city-name (required): Name of the city to research
num-results (optional): Number of results to scrape per search (default: 3)
output-dir (optional): Output directory (default: ./data/scraped/[city-name-slug]-research)
categories (optional): Comma-separated list of categories to research (default: all)
Available categories:
museums
restaurants
local-food
tourist-attractions
tech
bars
markets
street-food
historical
cultural-experiences
Output Structure
The skill creates a well-organized directory structure:
./data/scraped/[city-name]-research/
โโโ museums/
โ โโโ 1-best-museums-in-mexico-city/
โ โ โโโ content.md
โ โ โโโ images/
โ โ โโโ _attribution.yaml
โ โ โโโ *.jpg
โ โโโ 2-lonely-planet-museums/
โ โ โโโ content.md
โ โโโ 3-national-museum-guide/
โ โโโ content.md
โโโ restaurants/
โ โโโ 1-eater-mexico-city/
โ โ โโโ content.md
โ โ โโโ images/
โ โโโ 2-best-restaurants/
โ โโโ content.md
โโโ local-food/
โ โโโ 1-traditional-mexican-food/
โ โ โโโ content.md
โ โโโ 2-street-tacos-guide/
โ โโโ content.md
โโโ tourist-attractions/
โ โโโ 1-lonely-planet-things-to-do/
โ โ โโโ content.md
โ โโโ 2-top-10-attractions/
โ โโโ content.md
โโโ historical-sites/
โ โโโ 1-aztec-ruins-guide/
โ โโโ content.md
โโโ bars/
โ โโโ 1-best-bars-nightlife/
โ โโโ content.md
โโโ markets/
โ โโโ 1-local-markets-guide/
โ โโโ content.md
โโโ street-food/
โ โโโ 1-street-food-vendors/
โ โโโ content.md
โโโ tech/
โ โโโ 1-tech-museums/
โ โโโ content.md
โโโ cultural-experiences/
โ โโโ 1-traditional-festivals/
โ โโโ content.md
โโโ _research_summary.md # Overview of all research performed
How It Works
Step 1: Query Generation
For each activity category, the skill generates multiple search queries:
Example for "Mexico City":
- Museums:
"best museums in Mexico City", "lonely planet museums Mexico City"
- Restaurants:
"best restaurants in Mexico City", "eater Mexico City"
- Tourist Attractions:
"lonely planet things to do in Mexico City", "top tourist attractions Mexico City"
Step 2: Google Search and Scrape
For each query:
- Performs Google search
- Filters out advertisements
- Scrapes top N organic results
- Extracts content and images
- Saves to category-specific directory
Step 3: Content Organization
- Each category gets its own subdirectory
- Results are numbered and titled
- Images are downloaded with attribution
- All content is converted to clean markdown
Step 4: Summary Generation
Creates a _research_summary.md file containing:
- City name and research date
- List of all categories researched
- Number of results per category
- Quick links to all scraped content
- Statistics about the research
Example Output
_research_summary.md
# City Research: Mexico City
**Research Date:** February 12, 2026
**Categories Researched:** 10
**Total Sources Scraped:** 30
---
## Categories
### ๐๏ธ Museums (3 sources)
1. [Best Museums in Mexico City](./museums/1-best-museums-in-mexico-city/content.md)
2. [Lonely Planet Museums Guide](./museums/2-lonely-planet-museums/content.md)
3. [National Museum of Anthropology](./museums/3-national-museum-guide/content.md)
### ๐ฝ๏ธ Restaurants (3 sources)
1. [Eater Mexico City Guide](./restaurants/1-eater-mexico-city/content.md)
2. [Best Restaurants 2026](./restaurants/2-best-restaurants/content.md)
3. [Fine Dining in Mexico City](./restaurants/3-fine-dining-guide/content.md)
### ๐ฎ Local Food (3 sources)
1. [Traditional Mexican Food](./local-food/1-traditional-mexican-food/content.md)
2. [Street Tacos Guide](./local-food/2-street-tacos-guide/content.md)
3. [Eater Essential Dishes](./local-food/3-essential-dishes/content.md)
[... continues for all categories ...]
---
## Research Statistics
- **Total queries performed:** 20
- **Ads filtered out:** 38
- **Sources scraped:** 30
- **Images downloaded:** 142
2.4 MB
---
๐ Google Search (organic results only)
๐ฐ Lonely Planet (travel expertise)
๐ด Eater (restaurant curation)
Integration with Google Search Scraper
This skill is built on top of the Google Search and Scraper Skill. It:
- Calls the Google search scraper multiple times with different queries
- Organizes results by category
- Provides a higher-level abstraction for city research
- Generates summary documentation
Prerequisites
Same as Google Search Scraper:
npm install
npx playwright install chromium
Configuration
The script includes configurable search templates:
const SEARCH_TEMPLATES = {
museums: [
'best museums in {city}',
'lonely planet museums {city}'
],
restaurants: [
'best restaurants in {city}',
'eater {city}'
],
'local-food': [
'famous food in {city}',
'{city} local dishes eater'
],
};
Customization
Adding New Categories
To add new activity categories, edit the SEARCH_TEMPLATES object in the script:
const SEARCH_TEMPLATES = {
'coffee-shops': [
'best coffee shops in {city}',
'{city} specialty coffee guide'
],
'architecture': [
'architectural landmarks {city}',
'lonely planet architecture {city}'
]
};
Modifying Search Queries
You can customize search queries for existing categories to get different results:
restaurants: [
'best restaurants in {city}',
'eater {city}'
],
restaurants: [
'michelin star restaurants {city}',
'eater essential {city}',
'best cheap eats {city}'
],
Error Handling
The skill handles errors gracefully:
| Error Type | Behavior |
|---|
| City name missing | Shows usage information and exits |
| No search results for category | Logs warning and continues with other categories |
| Scraping failure | Logs error for that result but continues |
| Network issues | Retries once, then skips that query |
Best Practices
- Be respectful: Don't run this for too many cities at once
- Review results: Always review scraped content for quality
- Update regularly: City information changes - re-run periodically
- Organize well: Use the default output structure or customize thoughtfully
- Attribution: Maintain source attribution for all content
- Storage: Archive research results in appropriate data directories
Where to Save Research Data
IMPORTANT: When researching cities, organize the output in the data/ directory based on the scope:
Option 1: Comprehensive City Research
Save to data/destinations/{city-name}-research/ when researching all or most categories:
npx tsx .github/skills/city-research/scripts/research-city.ts "Tokyo" 3 ./data/destinations/tokyo-research
Use when:
- User requests full research of a new city
- Researching multiple categories (museums, restaurants, attractions, etc.)
- Building comprehensive destination guides
Option 2: Specific Category Research
Save to data/scraped/{city-name}-{category}/ when researching specific aspects:
npx tsx .github/skills/city-research/scripts/research-city.ts "Paris" 3 ./data/scraped/paris-restaurants restaurants
Use when:
- User requests specific information (e.g., "find restaurants in Paris")
- Researching one or two categories
- Supplementing existing destination content
Option 3: Default Location
Default saves to ./data/scraped/{city-name}-research/:
npx tsx .github/skills/city-research/scripts/research-city.ts "Mexico City"
Use when:
- Quick research or testing
- Unsure of final organization
- Planning to review and reorganize later
Post-Research Organization
After running the skill:
- Review the
_research_summary.md file
- Verify content quality and relevance
- Move or consolidate content to final locations if needed:
- High-quality content โ
data/destinations/
- Specific topics โ
data/scraped/
- Ensure searchability - Content in
data/ is indexed by KnowledgeService
See data/AGENTS.md for detailed guidance on data organization.
Example: Researching Mexico City
npx tsx .github/skills/city-research/scripts/research-city.ts "Mexico City"
npx tsx .github/skills/city-research/scripts/research-city.ts "Mexico City" 3 ./data/destinations/mexico-city museums,restaurants,historical-sites
npx tsx .github/skills/city-research/scripts/research-city.ts "Mexico City" 2
This will:
- Search for museums, restaurants, local food, attractions, etc.
- Use Lonely Planet and Eater as trusted sources
- Scrape 3 organic results per search query
- Download images with attribution
- Organize everything by category
- Generate a research summary
Use Cases
Planning a Trip
Research a new destination before traveling to understand what to see, where to eat, and what experiences are available.
Building Travel Guides
Create comprehensive travel guides by gathering information from multiple authoritative sources.
Updating Knowledge Base
Regularly update the travel knowledge base with fresh content about destinations.
Comparison Research
Research multiple cities to compare their offerings and help users decide where to go.
Limitations
- Rate limiting: Google may rate-limit if too many searches are performed quickly
- Content quality: Results depend on the quality of Google search results
- Completeness: May not capture every activity type or local spot
- Timeliness: Information may become outdated (restaurants close, museums change hours)
- Local expertise: Cannot replace local knowledge or current visitor experiences
Future Enhancements
Potential improvements:
- Detect and remove duplicate content across sources
- Score content quality and relevance
- Extract structured data (ratings, prices, addresses)
- Support for non-English cities and queries
- Integration with maps APIs for location data
- Sentiment analysis of restaurant reviews
- Date/time information extraction
Troubleshooting
No results for a category
Cause: Search query may not match city or category not applicable
Solution:
- Check if the city name is spelled correctly
- Try customizing search templates for that city
- Some categories may not apply to all cities
Too many ads, not enough organic results
Cause: Certain queries trigger many advertisements
Solution:
- Modify search templates to be more specific
- Use authoritative source names (Lonely Planet, Eater)
- Add modifiers like "guide" or "blog" to queries
Content seems incomplete
Cause: Page may be heavily JavaScript-rendered
Solution:
- Review the scraped content manually
- Consider re-running the search
- Try different search queries for the same category
See Also