Skip to main content
Glama
anewt225

Philly Events MCP Server

by anewt225

๐Ÿ›๏ธ 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

philly_search_events

Search events across all sources with powerful filters

philly_search_source

Search a specific event source

philly_export_to_calendar

Export events to Google Calendar format

philly_list_categories

List all event categories

philly_list_neighborhoods

List Philadelphia neighborhoods

philly_weekly_digest

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 start

Running with HTTP (Production)

TRANSPORT=http PORT=3000 npm start

Adding 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.js

Claude Desktop: open Settings โ†’ Developer โ†’ Edit Config, or edit claude_desktop_config.json directly:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %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.md

Key Design Decisions

  1. MCP Protocol - Uses Anthropic's Model Context Protocol for seamless AI integration

  2. TypeScript - Strong typing for reliability and maintainability

  3. Zod Schemas - Runtime validation with clear error messages

  4. Modular Scrapers - Each source is independent and can be updated separately

  5. 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

music

Concerts, live music, DJs

food_drink

Food events, happy hours, tastings

arts_culture

Museums, galleries, exhibitions

sports

Sports games, fitness events

nightlife

Clubs, parties, bar events

comedy

Stand-up, improv, sketch

outdoor

Parks, hiking, outdoor activities

family

Kid-friendly events

community

Neighborhood events, meetups

workshop

Classes, learning events

networking

Professional events

film

Movies, screenings

theater

Plays, musicals

markets

Farmers markets, flea markets

festivals

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 tools
philly_export_to_calendarExport Events to Calendar FormatA
Read-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:

  1. Use philly_search_events to find events

  2. Note the event IDs from results

  3. Call this tool with those IDs to get calendar format

  4. Import to Google Calendar via API

ParametersJSON Schema
NameRequiredDescriptionDefault
event_idsYesArray of event IDs to export
include_descriptionNoInclude full event description in calendar event
include_source_linkNoInclude link to original event page

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 CategoriesA
Read-onlyIdempotent

List all available event categories for filtering Philadelphia events.

Use this to discover what categories are available when searching for events.

ParametersJSON Schema
NameRequiredDescriptionDefault
response_formatNomarkdown

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 NeighborhoodsA
Read-onlyIdempotent

List all recognized Philadelphia neighborhoods for filtering events.

Use this to discover what neighborhood filters are available.

ParametersJSON Schema
NameRequiredDescriptionDefault
response_formatNomarkdown

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 EventsA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of events to return (default: 20, max: 100)
queryNoSearch text to match against event titles, descriptions, and locations
offsetNoNumber of events to skip for pagination
is_freeNoFilter for free events only
end_dateNoEnd date for event search (YYYY-MM-DD format)
max_priceNoMaximum ticket price in USD
categoriesNoFilter by event categories (e.g., music, food_drink, arts_culture)
start_dateNoStart date for event search (YYYY-MM-DD format)
neighborhoodsNoFilter by Philadelphia neighborhoods (e.g., Fishtown, Center City, Rittenhouse)
response_formatNoOutput format: markdown for readable text, json for structured datamarkdown

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 SourceA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of events to return
queryNoSearch text to match against events
sourceYesEvent source to search (do215, visitphilly, eventbrite)
response_formatNomarkdown

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 DigestA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
categoriesNoFilter digest by categories of interest
max_eventsNoMaximum events to include in digest
neighborhoodsNoFilter digest by preferred neighborhoods
response_formatNomarkdown
include_free_onlyNoOnly include free events

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

  1. 6 tool updatesv1.0.0
    • First observedphilly_export_to_calendar
    • First observedphilly_list_categories
    • First observedphilly_list_neighborhoods
    • First observedphilly_search_events
    • First observedphilly_search_source
    • First observedphilly_weekly_digest

TDQS

A3.9/5.0

Scored across 6 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Provides 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.
    10
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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.
    198
    MIT