grassyknees-mcp
Grassy Knees MCP server
Website: https://grassyknees.com
A small, read-only Model Context Protocol server that lets AI assistants answer questions like "what can I do with my kids in Denver this weekend?" with real listings from Grassy Knees. Grassy Knees is a free directory of kids' and family events, classes and places across 42 US metro areas. Every listing is researched from the organizer's own page and shows the date it was last checked.
Every result includes the listing's grassyknees.com page URL, the organizer's official link and the last-checked date. Each call returns at most 20 listings.
Example prompts
"What can I do with my kids in Denver this weekend?"
"Free things for a 4-year-old in Washington, DC in the next 7 days."
"Any STEM events for a 10-year-old in Seattle on Saturday?"
"Where can we go ice skating near Chicago?"
"Halloween events for kids in Austin."
"Tell me more about https://grassyknees.com/denver/activities/rock-creek-farm-pumpkin-patch-and-corn-maze--listing-69c7739ea9ac9cfaddb69622"
Related MCP server: onthecheap-mcp
Install
Requires Node.js 20 or later. No API key needed.
Claude Desktop
Add this to claude_desktop_config.json (Settings → Developer → Edit Config):
{
"mcpServers": {
"grassyknees": {
"command": "npx",
"args": ["-y", "grassyknees-mcp"]
}
}
}Claude Code
claude mcp add grassyknees -- npx -y grassyknees-mcpCursor
Add this to ~/.cursor/mcp.json (or .cursor/mcp.json in a project):
{
"mcpServers": {
"grassyknees": {
"command": "npx",
"args": ["-y", "grassyknees-mcp"]
}
}
}Any other MCP client that runs stdio servers works the same way: the command is npx -y grassyknees-mcp.
Or with Docker: build the image with docker build -t grassyknees-mcp . and use docker run -i --rm grassyknees-mcp as the command.
Tools
Tool | What it does |
| The 42 metro areas covered, with the id to pass to other tools (for example |
| Search one metro. Filters: |
| Full details for one listing from its grassyknees.com URL or id: schedule, upcoming dates, venue, ages, price, registration link, last-checked date. |
| The Halloween, Christmas (lights and holiday events), ice skating or Easter guide for a metro, or the all-metros overview, as Markdown trimmed to |
Dates are in the metro's local time. this-weekend means Friday to Sunday, the same window as the site's /<metro>/this-weekend page.
Sample transcript
From npm run smoke, run against the live site on 2026-10-28 (trimmed):
tools: list_metros, search_activities, get_activity, seasonal_guide
=== search_activities {"metro":"denver","when":"this-weekend","limit":3}
60 events in Denver for this weekend (2026-10-30 to 2026-11-01); showing the first 3:
1. **[School's Out! Day: Pumpkins & Potions](https://grassyknees.com/denver/activities/school-s-out-day-pumpkins-and-potions--listing-023a33783babb5880fc24e03)**
Fri, Oct 30 · 8:30 AM–3:30 PM · JCC Denver (Staenberg-Loup Jewish Community Center), 350 S. Dahlia St., Denver, CO 80246
Ages 5+ · From $100 (...) · Arts & crafts · last checked 2026-10-14
2. **[Rock Creek Farm Pumpkin Patch and Corn Maze](https://grassyknees.com/denver/activities/rock-creek-farm-pumpkin-patch-and-corn-maze--listing-69c7739ea9ac9cfaddb69622)**
Fri, Oct 30 · 9:30 AM–7:00 PM (also other dates) · Rock Creek Farm, 2005 S 112th St., Broomfield, CO 80020
Farm admission applies to ages 4 & up · From $10 (...) · Outdoors · last checked 2026-10-28
3. **[JTML Hoppy Halloween Storytime](https://grassyknees.com/denver/activities/jtml-hoppy-halloween-storytime--listing-5ee8642f996422fe0023e407)**
Fri, Oct 30 · 10:00 AM–11:00 AM · John Tomay Memorial Library, 605 6th Street, Georgetown, CO 80444
Kids (event category) · Check price · Community · last checked 2026-10-14
More on grassyknees.com: https://grassyknees.com/denver/this-weekend
=== search_activities {"metro":"DC","when":"this-weekend","free_only":true,"limit":3}
20 events, free in Washington, DC for this weekend (2026-10-30 to 2026-11-01); showing the first 3:
1. **[Play Day in the Park at Black Hill Discovery Center](https://grassyknees.com/washington-dc/activities/play-day-in-the-park-at-black-hill-discovery-center--listing-c17ea7ba367fd70feca1648e)**
Fri, Oct 30 · 11:00 AM–12:00 PM (also other dates) · Black Hill Discovery Center, 20926 Lake Ridge Drive, Boyds, MD 20841
Ages 6 mos to 3 yrs · Free ($0.00) · Outdoors · last checked 2026-10-24
...
=== get_activity {"url_or_id":"https://grassyknees.com/denver/activities/school-s-out-day-pumpkins-and-potions--listing-023a33783babb5880fc24e03"}
# School's Out! Day: Pumpkins & Potions
- When: Fri, Oct 30 · 8:30 AM–3:30 PM
- Where: JCC Denver (Staenberg-Loup Jewish Community Center), 350 S. Dahlia St., Denver, CO 80246
- Official page: https://www.jccdenver.org/camps/schools-out-camp/
- Last checked: 2026-10-14
...
=== seasonal_guide {"season":"ice-skating","metro":"denver","max_chars":1500}
# Ice skating with kids in Denver
> 9 ice rinks, public skates, holiday skate nights and learn-to-skate classes for kids in the Denver–Aurora–Centennial area this winter, ...
[Trimmed to 1500 of 6484 characters. Full guide: https://grassyknees.com/denver/ice-skating (Markdown: https://grassyknees.com/denver/ice-skating.md)]How it gets data
Read-only, public endpoints on grassyknees.com, one request at a time:
GET /api/activities?city=<metro>&fields=listfor searches (one metro's current list, filtered and capped locally to 20 results),GET /api/activities?ids=<id>forget_activity,the site's Markdown pages (
/<metro>/<season>.md) forseasonal_guide.
Responses are cached in memory for 10 minutes, so follow-up questions about the same metro don't refetch. Requests send User-Agent: grassyknees-mcp/<version>. Nothing is written to the site and no personal data is sent.
Set GRASSYKNEES_ORIGIN to point the server at another deployment (for testing).
Development
npm install
npm run build
npm run smoke # calls each tool once against the live site (4 requests)
npx @modelcontextprotocol/inspector --cli node dist/index.js --method tools/listCredit
Data: Grassy Knees, grassyknees.com. When you show results, link to the listing's grassyknees.com page and mention its last-checked date. Details can change, so confirm on the organizer's official page before you go.
License
MIT for this server's code. Listing data belongs to Grassy Knees and is provided for lookups, not bulk copying.
Available Tools
4 toolsget_activityGet one listingARead-only
Full details for one Grassy Knees listing: schedule, venue, ages, price, registration and official links, last-checked date. Pass the grassyknees.com listing URL or the listing id (listing-…) from search_activities.
| Name | Required | Description | Default |
|---|---|---|---|
| url_or_id | Yes | A grassyknees.com listing URL such as https://grassyknees.com/denver/activities/<slug>--listing-…, or its id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=true), so the bar is lower; the description still adds value by disclosing that a 'last-checked date' is returned, which signals data freshness, and that official links are included. It omits error behavior for invalid or unmapped ids, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, front-loaded with the outcome before the calling instruction. Nothing could be cut without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so by enumerating the fields returned. For a single-parameter read tool whose annotations already declare the safety profile, nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema itself gives the URL shape and the 'listing-…' id form, so the description's parameter sentence largely restates structured data. The only added meaning is that ids originate from search_activities, which is marginal; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Full details for one Grassy Knees listing') and enumerates the payload (schedule, venue, ages, price, registration, official links, last-checked date), which unambiguously separates it from the plural, discovery-oriented sibling search_activities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It establishes the call sequence by telling the agent to pass an id 'from search_activities', so the relationship between discovery and detail retrieval is clear. It stops short of explicit exclusions (e.g. what to do when the listing is unknown or the id is stale), so it is clear but not fully rule-bearing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_metrosList covered metro areasARead-only
List the 42 US metro areas Grassy Knees covers, with the metro id to pass to the other tools and each metro's page URLs.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false; the description reinforces the closed, fixed nature of the dataset ('the 42 US metro areas Grassy Knees covers'). It adds useful context about return contents without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence covering scope, count, and return fields with no filler. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the burden of describing returns; it names the id and page URLs but leaves the response shape (e.g., a list field name) unspecified. For a trivial no-param list tool this is close to sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is nothing to disambiguate and the baseline is 4. The description sensibly spends no words on inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list the 42 US metro areas) plus exactly what the caller gets back: the metro id and page URLs. The fixed count and scope make it immediately distinguishable from the search/get tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the output as the id to pass to other tools, which tells the agent this is the entry point for metro-scoped calls. It doesn't name search_activities or seasonal_guide as alternatives or state when this is unnecessary, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_activitiesSearch kids' activities in a metroARead-only
Find kids' and family events, classes/programs and places in one Grassy Knees metro area, filtered by date, price, age, category and keywords. Returns at most 20 listings, soonest first, each with its grassyknees.com page URL, the organizer's official link and the last-checked date. Dates are in the metro's local time.
| Name | Required | Description | Default |
|---|---|---|---|
| age | No | Child's age in years; keeps listings whose published age range includes it (listings without an age range are kept). | |
| kind | No | event = dated one-offs (default); program = classes and multi-week series; place = museums, parks, rinks and other places to go; any = all three. | |
| when | No | Date window. Default next-7-days. Ignored when start_date is given. | |
| limit | No | How many listings to return, 1–20 (default 10). | |
| metro | Yes | Metro id from list_metros (e.g. denver, new-york, washington-dc, dallas-fort-worth). Common names like 'NYC' or 'Dallas' also work. | |
| query | No | Keywords matched against title, description, venue, organizer and address (all words must match), e.g. 'pumpkin', 'library storytime', 'Boulder'. | |
| category | No | ||
| end_date | No | End of the custom range, YYYY-MM-DD. Defaults to start_date. | |
| free_only | No | Only free listings. | |
| start_date | No | Start of a custom date range, YYYY-MM-DD (metro local time). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint and openWorldHint already establish the safety profile, and the description adds real context beyond them: result cap of 20, soonest-first ordering, per-listing URL/official-link/last-checked-date payload, and that dates are in metro local time. It stops short of noting pagination absence or any rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, then result shape, then time-zone caveat. Every clause carries information an agent would otherwise have to guess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by describing the return payload and ordering. What remains unexplained is minor: result-count defaults and the start_date-overrides-when interaction, both of which live only in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 90%, so the schema already carries parameter meaning (enums for kind/when/category, age range semantics, limit bounds). The description only re-summarizes the dimensions as a filter list (date, price, age, category, keywords), adding no syntax or interaction detail such as how start_date overrides when.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Find kids' and family events, classes/programs and places') plus the scoping constraint 'in one Grassy Knees metro area'. This contrasts sharply with get_activity (single listing) and list_metros (metro ids), so an agent can separate it from its siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the filter list signals 'search in the metro', but the description never says when to prefer get_activity or seasonal_guide, nor that the metro id typically comes from list_metros. A competent agent can infer the flow, but the routing guidance is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
seasonal_guideSeasonal guideARead-only
Grassy Knees' seasonal guide (Halloween events, Christmas lights and holiday events, ice skating rinks, Easter egg hunts) for one metro, or the national overview when metro is omitted. Returns the page's Markdown (quick answers plus listings with links, ages, prices and last-checked dates), trimmed to max_chars.
| Name | Required | Description | Default |
|---|---|---|---|
| metro | No | Metro id from list_metros. Omit for the all-metros overview. | |
| season | Yes | ||
| max_chars | No | Trim the Markdown to this many characters (default 8000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint and openWorldHint already declared, the description earns credit for disclosing the return payload (Markdown with quick answers, listings, links, ages, prices, last-checked dates) and the trimming behavior governed by max_chars. It says nothing about caching, rate limits, or how the live pages are fetched, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences: scope first, return shape second, with the season examples kept in a parenthetical rather than a list. Dense but front-loaded; no wasted preamble.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so describing the Markdown contents and the character-trimming is exactly the missing piece, and it is supplied. For a three-parameter read-only retrieval tool with annotations, an agent has everything it needs to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the description largely restates what the schema already documents: metro's omission meaning is already in the field description, and max_chars trimming is likewise documented on the property. Only the season-to-content mapping (which holidays/events each season yields) adds meaning the enum alone doesn't convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete resource (Grassy Knees' seasonal guide), enumerates the seasons it covers, and explains the single-metro vs national-overview scope in the same sentence. An agent can distinguish this from get_activity/search_activities by the resource type, though sibling names are not called out.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear selection rule for the metro parameter (omit it to get the national overview) and the season list frames when the tool is appropriate. It stops short of explicitly saying when to prefer this over search_activities for the same events.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.1.0- First observed
get_activity - First observed
list_metros - First observed
search_activities - First observed
seasonal_guide
TDQS
Scored across 4 tools
The tools map to mostly distinct stages: metro coverage, filtered search, detail lookup, and a curated seasonal guide. The only meaningful overlap is seasonal_guide versus search_activities for holiday events, but the guide's curated/national role is reasonably clear from its description.
Three tools follow a clear verb_noun pattern: list_metros, search_activities, get_activity. seasonal_guide is a noun-phrase outlier, but the set remains predictable and readable overall.
Four tools is compact and well-scoped for a family-activity directory: list coverage, search listings, fetch details, and browse seasonal guides. No tool feels redundant or missing at the count level.
The core discovery flow is covered: list metros, search listings, get full activity details, and access seasonal guides. Minor gaps exist, such as no way to enumerate filter categories or browse by venue/organizer, but agents can work around these with keyword search.
Maintenance
Related MCP Connectors
Checked things to do with kids 0–6, city by city, plus free event submissions for review
Find kids' enrichment providers (sports, swim, dance, arts, STEM, camps) in 39 US regions.
Free US local event search. No signup or API key; 90-day lookahead. Paid commercial and bulk access.
Local US events by town, date and kind (trivia, live music, karaoke...), each checked at its source.
Related MCP Servers
- AlicenseAqualityDmaintenanceSearch 8,000+ corporate event venues across 40+ cities. Tools for venue search by capacity/category, pricing guides, expert advice articles, and inquiry handoff. Read-only, PII-redacted, UTM-attributed.710 npmMIT
- AlicenseAqualityAmaintenanceMCP server for the On the Cheap network — local guides to free and cheap things to do across 14 US cities. Provides daily event listings with times, prices and venues, plus a searchable archive of deals and guides.8307 npmMIT
- AlicenseAqualityCmaintenanceEnables live searching of licensed San Francisco preschools and child care centers, computing ELFA subsidy eligibility and net out-of-pocket costs, and generating ranked recommendations with deterministic scoring versus LLM comparisons.71MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to search current public children's activities in Florianópolis, Brazil, read organization profiles and their published groups with schedules and prices, and obtain a canonical link for requesting a visit. All five tools are read-only, publicly accessible over Streamable HTTP with no API key, and never submit a request or confirm a booking.MIT