Preference-aware events discovery MCP server. Knows what you like, surfaces what you'd actually want to do.
touch-grass-mcp
Preference-aware events discovery MCP server. Surfaces what you'd actually want to do — not what's loudest.
touch-grass-mcp is a Model Context Protocol server that aggregates events, restaurants, museums, music, and trending venues across multiple sources, then re-ranks results against your taste profile so you stop scrolling generic event listings and start finding things you'd actually go to.
Self-hosted by design. Zero telemetry. All data stays on your machine.
What you get
Core (works in any US city):
- Concerts (Ticketmaster, Resident Advisor, Dice)
- Restaurants + bars (Yelp)
- Local groups + meetups (Meetup, Eventbrite)
- Theater (TodayTix)
- Breweries (Open Brewery DB)
- Weather (NWS)
- Editorial picks (Eater, Gothamist, Time Out, Hyperallergic, Artforum)
NYC pack (activates when your profile city is New York):
- Public libraries (NYPL, BPL, QPL)
- Museums (MoMA, Met, Whitney, Frick, Carnegie Hall, 92Y, Park Avenue Armory, MoMA PS1)
- Venues (Lincoln Center, Brooklyn Steel, Metrograph, Village Vanguard, Village Jazz)
- NYC Open Data (city-permitted events)
- Audubon (birding walks)
- Curated community calendars
The taste engine — what makes this different from a flat aggregator:
- Profile-driven scoring: your interests, dislikes, vibe preferences, neighborhoods
- City pulse: live trend tracker (Reddit + Google Trends + RSS) that surfaces what's rising
Install
pip install touch-grass-mcp
# or with optional pulse + NLP support:
pip install "touch-grass-mcp[pulse,nlp]"
First-run setup
# One unified onboarding wizard: profile + city pack + API keys
touch-grass setup
# Fast launch for a known city (auto-fills state + pulse defaults):
touch-grass setup --city "san francisco"
# See available city starter packs:
touch-grass list-cities
# Already configured profile? Just (re)do API keys:
touch-grass setup --keys-only
# Sanity check:
touch-grass doctor
City starter packs auto-fill subreddits, RSS feeds, and Google Trends geo when your profile city matches. Currently bundled: NYC (deep coverage), SF, LA, Chicago, Austin, Boston, Seattle, DC. PRs welcome to add more.
Wire it into Claude Desktop / Claude Code
Add to your MCP config (~/Library/Application Support/Claude/claude_desktop_config.json or ~/.claude.json):
{
"mcpServers": {
"touch-grass": {
"command": "touch-grass",
"args": ["serve"]
}
}
}
Tools exposed
23 MCP tools across 5 categories:
Event search: search_events, search_concerts, discover_niche_events, trending_events, get_event_details, search_community_calendars, search_ra_events, get_ra_event_details
Dining + venues: search_restaurants, search_breweries, get_restaurant_details
Arts + culture: search_broadway_shows, get_broadway_showtimes, get_museum_exhibitions, search_met_collection, get_editorial_picks, get_editorial_feed
Profile + recommendation: get_user_profile, update_user_preferences, get_recommendation_keywords
Calibration + utility: weekend_weather, log_flag_feedback, get_calibration_stats
Configuration
- Profile:
~/.config/touch-grass/config.json(runtouch-grass initto bootstrap) - API keys:
~/.config/touch-grass/.env(or shell env) - Cache + state:
~/.local/share/touch-grass/(XDG paths)
See CONFIG.md for the full profile schema.
Privacy
Read PRIVACY.md before installing. Short version: zero telemetry, no analytics, no phone-home, all data local.
Architecture
taste/— pure-Python preference engine: load profile, score events, rank by relevance. Zero MCP dependencies; importable from any context.pulse/— cultural trend tracker that re-ranks against current Reddit / Trends / RSS signal.packs.py— city-pack registry. NYC pack bundled. Adding a new city is a documented contribution.server.py— FastMCP server that wires it all together.
Cities other than NYC
The core pack works anywhere in the US. NYC is the bundled deep-coverage city. Adding a new city = drop scrapers in clients/<city>/, register a CityPack in packs.py, supply pulse defaults. PRs welcome.
License
MIT.
Status
v0.1 — alpha. Stable enough for personal use; expect breakage in fragile scrapers (museums, RSS).