Philly Events MCP Server
Integrates with Eventbrite as an event source, allowing AI agents to search Philadelphia Eventbrite listings for ticketed events, workshops, and professional networking events with filters for text, category, neighborhood, date range, and price.
Provides a tool to export Philadelphia events in Google Calendar-compatible format, enabling users to import or add events to Google Calendar.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Philly Events MCP ServerWhat's happening in Fishtown this weekend?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
๐๏ธ Philly Events MCP Server
An MCP (Model Context Protocol) server that enables AI assistants to discover and search Philadelphia events from multiple sources. This project demonstrates modern AI infrastructure patterns including tool-based agents, semantic search, and structured data aggregation.
๐ฏ Project Overview
This MCP server aggregates events from Philadelphia's top event sources:
Do215 - Local indie events, arts, music, nightlife
Visit Philly - Tourism-focused events, major attractions
Eventbrite - Ticketed events, workshops, professional networking
It provides a unified API that AI agents can use to help users discover things to do in Philadelphia.
Related MCP server: better_luma
๐ Features
Tools Available
Tool | Description |
| Search events across all sources with powerful filters |
| Search a specific event source |
| Export events to Google Calendar format |
| List all event categories |
| List Philadelphia neighborhoods |
| Generate a curated weekly event digest |
Search Capabilities
Text search - Match against titles, descriptions, locations
Category filters - Music, food/drink, arts, sports, nightlife, comedy, etc.
Neighborhood filters - Fishtown, Center City, Rittenhouse, and 20+ more
Date range - Find events for specific time periods
Price filters - Free events or max price limits
Pagination - Handle large result sets efficiently
๐ฆ Installation
# Clone the repository
git clone https://github.com/anewt225/philly-events-mcp-server.git
cd philly-events-mcp-server
# Install dependencies
npm install
# Build the TypeScript
npm run build๐ง Usage
Running with stdio (Local Development)
npm startRunning with HTTP (Production)
TRANSPORT=http PORT=3000 npm startAdding it to Claude
First clone, npm install and npm run build (see Installation) so that dist/index.js exists. Then use the absolute path to that file below.
Claude Code (one command):
claude mcp add philly-events -- node /absolute/path/to/philly-events-mcp-server/dist/index.jsClaude Desktop: open Settings โ Developer โ Edit Config, or edit claude_desktop_config.json directly:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"philly-events": {
"command": "node",
"args": ["/absolute/path/to/philly-events-mcp-server/dist/index.js"]
}
}
}On Windows, use forward slashes or escaped backslashes in the path (for example C:/Users/you/projects/philly-events-mcp-server/dist/index.js). Restart Claude Desktop after saving; the philly_* tools then appear in the tools menu.
๐ก Example Queries
Once connected, you can ask Claude things like:
"What's happening in Fishtown this weekend?"
"Find free outdoor events in Philadelphia"
"Show me live music events under $30"
"Generate a weekly digest of food and drink events"
"Find comedy shows in Center City next Friday"
๐๏ธ Architecture
philly-events-mcp-server/
โโโ src/
โ โโโ index.ts # MCP server + tool registration
โ โโโ types.ts # TypeScript interfaces
โ โโโ constants.ts # Configuration constants
โ โโโ schemas/ # Zod validation schemas
โ โ โโโ eventSchemas.ts
โ โโโ services/ # Business logic
โ โโโ eventScraper.ts
โโโ package.json
โโโ tsconfig.json
โโโ README.mdKey Design Decisions
MCP Protocol - Uses Anthropic's Model Context Protocol for seamless AI integration
TypeScript - Strong typing for reliability and maintainability
Zod Schemas - Runtime validation with clear error messages
Modular Scrapers - Each source is independent and can be updated separately
In-Memory Cache - Efficient event retrieval within a session
๐ Roadmap
Phase 2: Intelligence Layer
Implement RAG with vector database for semantic search
Add preference learning based on user selections
Build recommendation engine
Phase 3: Product Features
Google Calendar API integration
Weekly email digest automation
User preference profiles
Event similarity matching
๐งช Testing
# Build and verify
npm run build
# Test with MCP Inspector
npx @modelcontextprotocol/inspector node dist/index.js๐ Event Categories
Category | Description |
| Concerts, live music, DJs |
| Food events, happy hours, tastings |
| Museums, galleries, exhibitions |
| Sports games, fitness events |
| Clubs, parties, bar events |
| Stand-up, improv, sketch |
| Parks, hiking, outdoor activities |
| Kid-friendly events |
| Neighborhood events, meetups |
| Classes, learning events |
| Professional events |
| Movies, screenings |
| Plays, musicals |
| Farmers markets, flea markets |
| Festivals, celebrations |
๐๏ธ Neighborhoods
Center City, Rittenhouse, Old City, Northern Liberties, Fishtown, University City, Manayunk, East Passyunk, South Philly, Fairmount, Gayborhood, Chinatown, Queen Village, Graduate Hospital, Brewerytown, Kensington, Port Richmond, Germantown, Chestnut Hill, Mount Airy, Hawthorne, Bella Vista
๐ License
MIT License - Feel free to use and modify for your own projects.
๐ค Contributing
Contributions welcome! This project is designed to be extended:
Add new event sources
Improve scraping accuracy
Enhance category classification
Add new tool capabilities
๐ค Author
Built as a portfolio project demonstrating:
Modern MCP server development
AI agent infrastructure
Product thinking for local discovery
TypeScript best practices
Made with โค๏ธ for Philadelphia
Available Tools
6 toolsphilly_export_to_calendarExport Events to Calendar FormatARead-onlyIdempotent
Convert Philadelphia events to Google Calendar format for import.
This tool takes event IDs (from search results) and returns them in Google Calendar JSON format, ready for import via the Google Calendar API.
Args:
event_ids (array): Array of event IDs to export (max 50)
include_description (boolean): Include full description (default: true)
include_source_link (boolean): Include link to original event (default: true)
Returns: Array of Google Calendar event objects ready for API import.
Example workflow:
Use philly_search_events to find events
Note the event IDs from results
Call this tool with those IDs to get calendar format
Import to Google Calendar via API
| Name | Required | Description | Default |
|---|---|---|---|
| event_ids | Yes | Array of event IDs to export | |
| include_description | No | Include full event description in calendar event | |
| include_source_link | No | Include link to original event page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower; the description adds the key behavioral boundary that this tool only produces Google Calendar JSON and does not itself push to the API. It also flags the 50-ID cap, though that is duplicated from the schema. Error behavior on invalid IDs is not disclosed.
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?
Purpose is front-loaded in the first sentence and the example workflow is genuinely useful. However, the Args and Returns blocks largely duplicate the schema and the 'ready for import via the Google Calendar API' point is stated twice, so a little trimming would help.
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 correctly explains the return value (array of Google Calendar event objects) and the end-to-end workflow. It is nearly complete for a simple read-only converter, with only edge-case/error handling left unaddressed.
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 100%, so the baseline is 3. The Args block restates the same parameter descriptions and defaults already present in the schema, adding no new semantics such as ID format or behavior for unknown IDs.
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 ('Convert Philadelphia events to Google Calendar format') and immediately scopes it as a format-conversion step for import, which no sibling tool does. An agent can distinguish it from philly_search_events or philly_weekly_digest without reading any 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?
The example workflow explicitly routes the agent: run philly_search_events first, capture IDs, then call this tool. That names the alternative/prerequisite concretely. It stops short of stating exclusions (e.g., what to do for non-Philadelphia or non-Google targets), so it is clear context rather than full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
philly_list_categoriesList Event CategoriesARead-onlyIdempotent
List all available event categories for filtering Philadelphia events.
Use this to discover what categories are available when searching for events.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is fully covered. The description adds only that categories are for filtering; it says nothing about whether the category set is static, how large it is, or the return shape. Adequate but thin given the annotations do the heavy lifting.
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 short sentences, zero filler, with the primary purpose front-loaded before the usage hint. Nothing is wasted.
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?
For a simple read-only listing tool with no output schema, the description covers what the tool returns at a high level, but omits any guidance on the one available parameter and does not describe the returned structure. Minimal but workable.
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 0% and the single parameter (response_format, enum json|markdown) is never mentioned in the description. With a parameter present and undocumented, the description fails to compensate for the coverage gap, leaving the agent to infer output-format behavior from the enum name alone.
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 (list) and resource (event categories) scoped to Philadelphia events, and explains the resource's role for filtering. It is distinguishable from philly_list_neighborhoods by resource, though it never names a sibling explicitly.
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?
"Use this to discover what categories are available when searching for events" clearly places the tool before a search/filter workflow. It gives clear context but names no explicit alternative or exclusion (e.g., when not to use it vs. philly_search_events).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
philly_list_neighborhoodsList Philadelphia NeighborhoodsARead-onlyIdempotent
List all recognized Philadelphia neighborhoods for filtering events.
Use this to discover what neighborhood filters are available.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered structurally. The description adds only the filter-discovery framing; it says nothing about pagination, result size, or response shape, so it earns limited additional credit.
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 short sentences with the action front-loaded and the usage hint second. No wasted phrasing, though the second sentence is mild restatement of the first.
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?
For a trivial, annotation-covered, parameter-free discovery tool with no output schema, purpose and usage are adequately covered. The missing piece is any mention of the response_format choice's effect on output.
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 0% and the single response_format parameter (json/markdown) is never mentioned in the description. Although the enum values are self-explanatory, the description does nothing to compensate for the absent schema descriptions, so it falls below the 3 baseline.
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+resource ('List all recognized Philadelphia neighborhoods') and scopes it to event filtering, which differentiates it from philly_list_categories by resource. It does not explicitly say how it differs from the other siblings, but the noun phrase is unambiguous.
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?
'Use this to discover what neighborhood filters are available' gives a clear positive use case. There is no when-not guidance and no alternative tool is named, so the routing decision relies on the agent inferring that this is a prerequisite/discovery step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
philly_search_eventsSearch Philadelphia EventsARead-onlyIdempotent
Search for events across all Philadelphia event sources (Do215, Visit Philly, Eventbrite).
This is the primary tool for discovering events happening in Philadelphia. It aggregates results from multiple sources, deduplicates them, and allows filtering by various criteria.
Args:
query (string, optional): Text to search in event titles, descriptions, and locations
categories (array, optional): Filter by categories like 'music', 'food_drink', 'arts_culture', 'sports', 'nightlife', 'comedy', 'outdoor', 'family', 'community', 'workshop', 'networking', 'film', 'theater', 'markets', 'festivals'
neighborhoods (array, optional): Filter by Philly neighborhoods like 'Fishtown', 'Center City', 'Rittenhouse', 'Northern Liberties', 'Old City', etc.
start_date (string, optional): Start date in YYYY-MM-DD format
end_date (string, optional): End date in YYYY-MM-DD format
is_free (boolean, optional): Only return free events
max_price (number, optional): Maximum ticket price in USD
limit (number): Max results to return (default: 20, max: 100)
offset (number): Pagination offset (default: 0)
response_format ('markdown' | 'json'): Output format (default: 'markdown')
Returns: Aggregated event listings from all sources with deduplication.
Examples:
"Find live music this weekend" โ query="live music", categories=["music"]
"Free outdoor events in Fishtown" โ is_free=true, categories=["outdoor"], neighborhoods=["Fishtown"]
"Comedy shows under $30" โ categories=["comedy"], max_price=30
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of events to return (default: 20, max: 100) | |
| query | No | Search text to match against event titles, descriptions, and locations | |
| offset | No | Number of events to skip for pagination | |
| is_free | No | Filter for free events only | |
| end_date | No | End date for event search (YYYY-MM-DD format) | |
| max_price | No | Maximum ticket price in USD | |
| categories | No | Filter by event categories (e.g., music, food_drink, arts_culture) | |
| start_date | No | Start date for event search (YYYY-MM-DD format) | |
| neighborhoods | No | Filter by Philadelphia neighborhoods (e.g., Fishtown, Center City, Rittenhouse) | |
| response_format | No | Output format: markdown for readable text, json for structured data | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower. The description still adds real behavior: cross-source aggregation, deduplication, and a summary of the return payload. It does not mention rate limits, source-failure behavior, or result ordering, 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?
Front-loads the one-line purpose, then a scoping sentence, then Args/Returns/Examples. The Args block largely restates the schema descriptions and is the longest section, but it is well-organized and every section is scannable; nothing is buried.
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 10 parameters, zero required, and no output schema, the definition supplies enough to call the tool correctly: all parameters documented, defaults noted, and examples given. It omits what happens with no filters at all (default result set, ordering, or how pagination interacts with deduplication), a minor gap given the tool's breadth.
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 100%, so the baseline is 3. The description goes beyond it by enumerating concrete category and neighborhood values and, more usefully, providing natural-language-to-parameter mappings ('Comedy shows under $30' โ categories=["comedy"], max_price=30) that show how parameters combine.
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 ('Search for events') plus a precise scope ('across all Philadelphia event sources'), and explicitly notes that it 'aggregates results from multiple sources, deduplicates them.' That aggregation framing distinguishes it from the sibling philly_search_source (single-source) without the agent needing to open schemas.
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?
Declares primacy ('This is the primary tool for discovering events happening in Philadelphia') and the worked examples show concrete when-to-use patterns ('Find live music this weekend'). However, it never states when NOT to use it, e.g. routing to philly_list_categories for browsing filters or philly_search_source for a single source.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
philly_search_sourceSearch Specific Event SourceARead-onlyIdempotent
Search for events from a specific Philadelphia event source.
Use this when you want to search only one source (e.g., just Do215 or just Eventbrite) rather than aggregating from all sources.
Args:
source (string): Event source to search - one of 'do215', 'visitphilly', 'eventbrite'
query (string, optional): Search text
limit (number): Max results (default: 20)
response_format ('markdown' | 'json'): Output format
Available sources:
do215: Local indie events, arts, music, nightlife
visitphilly: Tourism-focused events, major attractions
eventbrite: Ticketed events, workshops, professional events
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of events to return | |
| query | No | Search text to match against events | |
| source | Yes | Event source to search (do215, visitphilly, eventbrite) | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered. The description adds useful source-level context (do215 = indie/arts/nightlife, visitphilly = tourism, eventbrite = ticketed) but says nothing about pagination, deduping, or result volume limits beyond the limit param.
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?
Front-loaded with purpose and routing guidance before the Args and source catalog, and each source line carries distinct selection value. Slightly padded by restating limit's default and response_format enum that the schema already documents.
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 should set expectations for what comes back; it mentions markdown/json format but never describes the returned event fields. The truncated source enum also makes the definition incomplete relative to the actual parameter domain.
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?
The Args block restates limit's default and query/response_format without adding syntax beyond the schema. More seriously, it declares source is 'one of do215, visitphilly, eventbrite' while the schema enum permits six values (also whenwherewhat, uwishunu, phillymag), so the description actively under-informs and could steer an agent away from valid sources.
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+resource ('search for events from a specific Philadelphia event source') and explicitly scopes it against the broader aggregation behavior. An agent can distinguish it from philly_search_events (all sources) without opening either 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?
The second sentence gives explicit when-to-use guidance ('search only one source rather than aggregating from all sources'), which implies the alternative sibling philly_search_events. It stops short of naming that sibling explicitly, so routing still requires a small inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
philly_weekly_digestGenerate Weekly Event DigestARead-onlyIdempotent
Generate a curated weekly digest of Philadelphia events.
This tool searches for events happening in the next 7 days and formats them as a digestible newsletter-style summary, organized by category.
Args:
categories (array, optional): Focus on specific categories
neighborhoods (array, optional): Focus on specific neighborhoods
include_free_only (boolean): Only include free events (default: false)
max_events (number): Maximum events in digest (default: 20, max: 50)
response_format ('markdown' | 'json'): Output format
Perfect for:
Weekly event roundup emails
Planning your weekend
Discovering new things to do
| Name | Required | Description | Default |
|---|---|---|---|
| categories | No | Filter digest by categories of interest | |
| max_events | No | Maximum events to include in digest | |
| neighborhoods | No | Filter digest by preferred neighborhoods | |
| response_format | No | markdown | |
| include_free_only | No | Only include free events |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint and destructiveHint=false. The description adds the 7-day search window and the output shape (newsletter-style summary organized by category), which is useful operational context beyond 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?
The purpose and use-case sections are front-loaded and clear, but the Args block duplicates parameter information already present in the schema, so not every line 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?
For a 5-optional-parameter tool with no output schema, the description explains the return format (newsletter-style summary organized by category) and the temporal scope. It lacks routing guidance versus siblings, but otherwise gives enough to call the tool 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 description coverage is 80%, so the baseline is 3. The Args section largely repeats schema descriptions and even omits the min=5 constraint on max_events and the default 'markdown' for response_format, so it adds little beyond the structured schema.
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 'Generate' and resource 'curated weekly digest of Philadelphia events', and clarifies it searches the next 7 days and formats a newsletter-style summary. The digest framing distinguishes it functionally from search siblings, but it does not name an alternative tool explicitly.
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?
Provides clear use cases ('Perfect for: Weekly event roundup emails, Planning your weekend...') and a temporal context (next 7 days). It does not state when to prefer it over siblings such as philly_search_events or philly_export_to_calendar, nor any exclusions.
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.
6 tool updates
v1.0.0- First observed
philly_export_to_calendar - First observed
philly_list_categories - First observed
philly_list_neighborhoods - First observed
philly_search_events - First observed
philly_search_source - First observed
philly_weekly_digest
TDQS
Scored across 6 tools
Each tool targets a distinct operation: discovery (list_categories, list_neighborhoods), search (search_events aggregate, search_source single-source), export, and digest. The aggregate vs single-source search distinction is clearly explained. philly_weekly_digest partially overlaps with philly_search_events since it's essentially a preset filtered search with formatting, but the newsletter framing keeps it distinguishable.
All tools use a consistent philly_ prefix followed by a verb_noun pattern (list_categories, search_events, export_to_calendar, weekly_digest). No mixing of conventions or casing styles.
Six tools is well-scoped for a niche city event aggregator, with each tool earning its place: discovery, search, single-source search, export, and digest. No redundant or trivial tools in the set.
The surface covers discovery, search, filtering, export, and digest workflows well. The one noticeable gap is a get_event-by-ID tool, which would be useful given that export_to_calendar consumes event IDs yielded by search.
Maintenance
Related MCP Connectors
Run in-person events from your AI: create events, manage tickets, attendees, broadcasts.
Read-only search of upcoming local events worldwide: music, comedy, AI/tech, arts, food, sports.
Read your events, sales, orders and attendees from your AI assistant. OAuth sign-in, read only.
Search local events in plain words: shows, pop-ups, markets, classes, with times, venues, prices.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceIntegrates with the Eventbrite API to provide AI-assisted event management capabilities for viewing events, tracking attendees, and generating analytics reports.6 npm3MIT
- AlicenseAqualityCmaintenanceProvides read-only tools for discovering, searching, and browsing events from Luma, Posh, and Partiful platforms, including event details and guest lists, with optional authenticated access to a user's Luma events.10MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to search event calendars by keyword and list upcoming or date-filtered events from a chosen calendar, returning titles, dates, venues, coordinates, and keywords.12 npmMIT

SyncSoofficial
AlicenseNot gradedqualityBmaintenanceEnables agents to search and retrieve live local happenings in New York City โ music, theater, comedy, film, art, sports, festivals, markets, food and drink, classes, tours and nightlife โ each with dates, times, prices, booking links and images. Two tools, search_directions and get_details, let assistants answer time-sensitive questions about what is happening nearby and return bookable results.198MIT