Skip to main content
Glama

SFomo: Bay Area events

Find a performer

find_performer
Read-onlyIdempotent

Find a performer, band, comedian or act in Bay Area by name (words in query must all match; case-insensitive) and get their upcoming events, top venues, genres or topics and the platforms that list them. Names come only from public event listings; there are no contact details. Use it for "when is playing" or "who plays at ". For events by topic or venue rather than by name, use search_events; use get_event with an id for one event's full listing. No sign-in; each client gets 30 calls a minute and 2,500 event rows an hour.

Input Schema

NameRequiredDescriptionDefault
limitNoMax matches (default 10, max 25)
queryYesPart of a name, e.g. 'khruangbin'

Output Schema

NameRequiredDescriptionDefault
queryNo
matchedYes
matchesYes
coverageNoCoverage and accuracy page
attributionNo
data_generatedNoWhen this city's data was last published
directory_generatedNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / matches / items / properties / next_events / items / properties / venue_status
      Added value: +{
      +  "description": "Present only when location is empty, and says why (we never guess a venue): rsvp = the address is shared after RSVP/registration; tba = the venue isn't decided; hidden = the source shows the venue to its members only (Meetup stubs; /mcp leaves these out, so you won't see it here); title = the title names the place; text = the description names a place; unset = the host left it blank. Open the link for the venue",
      +  "enum": [
      +    "rsvp",
      +    "tba",
      +    "hidden",
      +    "title",
      +    "text",
      +    "unset"
      +  ],
      +  "type": "string"
      +}
  2. Changed3 schema fields changed
    • addedOutput schema / properties / matches / items / properties / next_events / items / properties / changed
      Added value: +{
      +  "description": "When we last saw the title, date or time, venue, link, price or status change (local ISO time); the first-seen day for older events",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / matches / items / properties / next_events / items / properties / event_status
      Added value: +{
      +  "description": "What a source says: postponed (no new date yet; listed on its original date), rescheduled (this is the new date), moved (to another venue; location is the new one), sold_out. Absent = scheduled as listed; cancelled events are left out",
      +  "enum": [
      +    "sold_out",
      +    "postponed",
      +    "rescheduled",
      +    "moved"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / matches / items / properties / next_events / items / properties / status_note
      Added value: +{
      +  "description": "The source's own wording of event_status, e.g. \"Moved to The Warfield\"",
      +  "type": "string"
      +}
  3. Changed1 schema field changed
    • addedOutput schema / properties / matches / items / properties / next_events / items / properties / checked_live
      Added value: +{
      +  "description": "When we last opened the original listing and found it still matches (time, venue, not cancelled); local ISO time. Absent = not checked in the last two days",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  4. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "attribution": {
      +      "type": "string"
      +    },
      +    "coverage": {
      +      "description": "Coverage and accuracy page",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "data_generated": {
      +      "description": "When this city's data was last published",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "directory_generated": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "matched": {
      +      "type": "number"
      +    },
      +    "matches": {
      +      "items": {
      +        "properties": {
      +          "events_listed": {
      +            "type": "number"
      +          },
      +          "genres": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "listed_on": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "name": {
      +            "type": "string"
      +          },
      +          "next_date": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "next_events": {
      +            "items": {
      +              "properties": {
      +                "audience": {
      +                  "description": "kids, teens or seniors when the event is only for them",
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "biz_formats": {
      +                  "items": {
      +                    "type": "string"
      +                  },
      +                  "type": "array"
      +                },
      +                "categories": {
      +                  "items": {
      +                    "type": "string"
      +                  },
      +                  "type": "array"
      +                },
      +                "city": {
      +                  "description": "Town or city within the metro",
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "date": {
      +                  "description": "Local start date, YYYY-MM-DD",
      +                  "type": "string"
      +                },
      +                "distance_km": {
      +                  "description": "With near: distance from the place",
      +                  "type": "number"
      +                },
      +                "end": {
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "first_seen": {
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "free": {
      +                  "type": "boolean"
      +                },
      +                "id": {
      +                  "description": "Stable 12-character id; pass it to get_event",
      +                  "type": "string"
      +                },
      +                "last_fetched": {
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "last_seen": {
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "link": {
      +                  "description": "The original listing; keep it and credit What's Up In",
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "location": {
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "neighborhood": {
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "performers": {
      +                  "items": {
      +                    "type": "string"
      +                  },
      +                  "type": "array"
      +                },
      +                "possibly_free": {
      +                  "type": "boolean"
      +                },
      +                "posted_by_sources": {
      +                  "type": "number"
      +                },
      +                "price": {
      +                  "description": "All-in price as the source states it, \"Free\", or \"See tickets\" when the source doesn't state the all-in total",
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "recurring": {
      +                  "description": "weekly, biweekly or monthly when the event is one date of a series",
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "region": {
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "rv": {
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "sectors": {
      +                  "items": {
      +                    "type": "string"
      +                  },
      +                  "type": "array"
      +                },
      +                "sold_out": {
      +                  "type": "boolean"
      +                },
      +                "sources": {
      +                  "items": {
      +                    "type": "string"
      +                  },
      +                  "type": "array"
      +                },
      +                "start": {
      +                  "description": "Local start, ISO 8601, when the source gives a time",
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "title": {
      +                  "type": "string"
      +                },
      +                "topics": {
      +                  "items": {
      +                    "type": "string"
      +                  },
      +                  "type": "array"
      +                }
      +              },
      +              "required": [
      +                "id",
      +                "title",
      +                "date"
      +              ],
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "recurring_dates": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "top_venues": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "topics": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "upcoming_events": {
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "query": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "matched",
      +    "matches"
      +  ],
      +  "type": "object"
      +}
  5. Added

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the description adds genuinely new behavioral context: data provenance (public event listings only), a negative guarantee (no contact details), no sign-in required, and hard rate limits (30 calls/min, 2,500 event rows/hour). These are exactly the operational facts an agent needs before calling at volume.

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 scope, and every sentence carries distinct information (scope, use cases, alternatives, limits). The opening sentence is dense with multiple clauses, which slightly slows scanning, but no content is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Return values are covered by the output schema, so the description is right not to enumerate them; it instead covers provenance, access model, rate limits, and sibling routing. For a 2-parameter read tool, nothing an agent needs 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline would be 3, but the description adds matching semantics the schema lacks: all words in `query` must match and matching is case-insensitive. `limit` behavior is left entirely to the schema, which already documents default and max.

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 ('find a performer, band, comedian or act in Bay Area by name') plus exactly what comes back (upcoming events, top venues, genres/topics, listing platforms). It also names the sibling tools it is not (search_events, get_event), so an agent can route 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete use cases ('when is <band> playing', 'who plays at <venue>') and explicit exclusions with the correct alternative named for each: search_events for topic/venue browsing, get_event for a single listing by id. Nothing about selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources