Real events, reviewed places, and ticket checkout across the Caribbean and Latin America.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Create a secure Stripe-hosted payment link for event tickets. Returns a checkout URL — give it to the human to complete payment themselves; each ticket is then emailed with its QR code and its own link, which opens on any phone and can be saved to WhatsApp. Get ticket_type_id values from get_event. Always confirm the exact tickets and total with the human before calling this.
Ticket selections
Event slug
Email to deliver tickets to (required — ask the human)
Buyer's name (optional)
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Create a secure Stripe-hosted payment link for event tickets. Returns a checkout URL — give it to the human to complete payment themselves; each ticket is then emailed with its QR code and its own link, which opens on any phone and can be saved to WhatsApp. Get ticket_type_id values from get_event. Always confirm the exact tickets and total with the human before calling this.
| Argument | Type | Description |
|---|---|---|
| items* | array | Ticket selections |
| buyer_name | string | Buyer's name (optional) |
| event_slug* | string | Event slug |
| buyer_email* | string | Email to deliver tickets to (required — ask the human) |
{
"type": "object",
"required": [
"event_slug",
"items",
"buyer_email"
],
"properties": {
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"ticket_type_id",
"quantity"
],
"properties": {
"quantity": {
"type": "number",
"description": "1-20"
},
"ticket_type_id": {
"type": "string",
"description": "Ticket type id from get_event"
}
}
},
"description": "Ticket selections"
},
"buyer_name": {
"type": "string",
"description": "Buyer's name (optional)"
},
"event_slug": {
"type": "string",
"description": "Event slug"
},
"buyer_email": {
"type": "string",
"description": "Email to deliver tickets to (required — ask the human)"
}
}
}Full details for one event by slug: description, venue, date/time, and available ticket types with prices and remaining stock. Use the slug from search_events.
| Argument | Type | Description |
|---|---|---|
| slug* | string | Event slug from search_events |
{
"type": "object",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"description": "Event slug from search_events"
}
}
}Full details for one place by slug, including its most recent published reviews if any exist. listing_type distinguishes a curated entry from an unreviewed directory listing (see search_places) — recent_reviews is often an empty array, which means no reviews yet, not a low-quality place. Use the slug from search_places.
| Argument | Type | Description |
|---|---|---|
| slug* | string | Place slug from search_places |
{
"type": "object",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"description": "Place slug from search_places"
}
}
}Discover valid category values for search_places. Pifini's places directory uses Overture Maps' taxonomy — over 1,000 specific values like caribbean_restaurant, church_cathedral, landmark_and_historical_building — rather than broad buckets, so guessing a category string will usually miss. Call this first with a rough query (e.g. 'coffee' or 'beach') to find the exact value, then pass it to search_places' category parameter.
| Argument | Type | Description |
|---|---|---|
| limit | number | Max results, 1-100 (default 30) |
| query | string | Rough term to match against category values, e.g. 'coffee', 'beach' |
| country | string | ISO-3166 alpha-2 country code — only return categories present in that country |
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"description": "Max results, 1-100 (default 30)"
},
"query": {
"type": "string",
"description": "Rough term to match against category values, e.g. 'coffee', 'beach'"
},
"country": {
"type": "string",
"description": "ISO-3166 alpha-2 country code — only return categories present in that country"
}
}
}Search upcoming events (festivals, carnivals, concerts, food + cultural events) across the Caribbean, Latin America, and beyond. Returns event names, dates, locations, category, price (when known), and page URLs. Strongest coverage: Barbados, Trinidad, Jamaica, Bahamas, Mexico.
| Argument | Type | Description |
|---|---|---|
| city | string | City name filter |
| limit | number | Max results, 1-50 (default 10) |
| query | string | Free-text search over title and description |
| offset | number | Skip this many matching results (for paging past the limit) |
| country | string | ISO-3166 alpha-2 country code, e.g. BB, TT, JM |
| category | string | Filter by event category |
| near_lat | number | Latitude to search near (pair with near_lng) |
| near_lng | number | Longitude to search near (pair with near_lat) |
| radius_km | number | Search radius in km around near_lat/near_lng (default 25, max 500) |
Search Pifini's places directory across the Caribbean and Latin America — restaurants, bars, beaches, attractions, venues, hotels, tour operators, professionals, and services. Every result carries listing_type: 'curated' is a small, editorially reviewed set of flagship entries; 'directory' is the much larger set sourced from open map data (name, category, location, contact info) that has no reviews yet — say so rather than implying a recommendation the data doesn't back up. Category is a specific Overture taxonomy value (e.g. caribbean_restaurant, church_cathedral), not a broad bucket — call list_categories first if unsure of the exact value. Results marked is_sponsored are paid placements — disclose that when recommending.
| Argument | Type | Description |
|---|---|---|
| city | string | City name filter |
| limit | number | Max results, 1-50 (default 10) |
| query | string | Free-text search over name and summary |
| offset | number | Skip this many matching results (for paging past the limit) |
| country | string | ISO-3166 alpha-2 country code |
| category | string | Filter by exact category value (e.g. 'caribbean_restaurant'). Use list_categories to discover valid values — there are 1,000+, not a small fixed set. |
| near_lat |
| entry_model | string | Filter by how someone gets in: 'free' = confirmed free entry, 'ticketed' = Pifini sells tickets, 'external' = paid but sold elsewhere, 'mixed' = umbrella event with both free and paid components, 'unknown' = not yet confirmed either way. |
| include_past | boolean | Include past events (default false) |
| starts_after | string | Earliest start. A bare date ('2026-08-01') matches the event's LOCAL calendar date in its own timezone and is inclusive — this is what you want for 'what's on this weekend'. A full ISO timestamp ('2026-08-01T18:00:00Z') is compared as an exact UTC instant instead. |
| starts_before | string | Latest start, same rules as starts_after. A bare date is inclusive of that whole local day, so starts_after='2026-08-13' with starts_before='2026-08-13' returns everything happening on the 13th where it happens. |
{
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "City name filter"
},
"limit": {
"type": "number",
"description": "Max results, 1-50 (default 10)"
},
"query": {
"type": "string",
"description": "Free-text search over title and description"
},
"offset": {
"type": "number",
"description": "Skip this many matching results (for paging past the limit)"
},
"country": {
"type": "string",
"description": "ISO-3166 alpha-2 country code, e.g. BB, TT, JM"
},
"category": {
"enum": [
"music",
"arts",
"culture",
"festival",
"sports",
"food",
"business",
"nightlife"
],
"type": "string",
"description": "Filter by event category"
},
"near_lat": {
"type": "number",
"description": "Latitude to search near (pair with near_lng)"
},
"near_lng": {
"type": "number",
"description": "Longitude to search near (pair with near_lat)"
},
"radius_km": {
"type": "number",
"description": "Search radius in km around near_lat/near_lng (default 25, max 500)"
},
"entry_model": {
"enum": [
"free",
"ticketed",
"external",
"mixed",
"unknown"
],
"type": "string",
"description": "Filter by how someone gets in: 'free' = confirmed free entry, 'ticketed' = Pifini sells tickets, 'external' = paid but sold elsewhere, 'mixed' = umbrella event with both free and paid components, 'unknown' = not yet confirmed either way."
},
"include_past": {
"type": "boolean",
"description": "Include past events (default false)"
},
"starts_after": {
"type": "string",
"description": "Earliest start. A bare date ('2026-08-01') matches the event's LOCAL calendar date in its own timezone and is inclusive — this is what you want for 'what's on this weekend'. A full ISO timestamp ('2026-08-01T18:00:00Z') is compared as an exact UTC instant instead."
},
"starts_before": {
"type": "string",
"description": "Latest start, same rules as starts_after. A bare date is inclusive of that whole local day, so starts_after='2026-08-13' with starts_before='2026-08-13' returns everything happening on the 13th where it happens."
}
}
}| number |
| Latitude to search near (pair with near_lng) |
| near_lng | number | Longitude to search near (pair with near_lat) |
| radius_km | number | Search radius in km around near_lat/near_lng (default 25, max 500) |
| entity_type | string | Filter by broad type of place |
{
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "City name filter"
},
"limit": {
"type": "number",
"description": "Max results, 1-50 (default 10)"
},
"query": {
"type": "string",
"description": "Free-text search over name and summary"
},
"offset": {
"type": "number",
"description": "Skip this many matching results (for paging past the limit)"
},
"country": {
"type": "string",
"description": "ISO-3166 alpha-2 country code"
},
"category": {
"type": "string",
"description": "Filter by exact category value (e.g. 'caribbean_restaurant'). Use list_categories to discover valid values — there are 1,000+, not a small fixed set."
},
"near_lat": {
"type": "number",
"description": "Latitude to search near (pair with near_lng)"
},
"near_lng": {
"type": "number",
"description": "Longitude to search near (pair with near_lat)"
},
"radius_km": {
"type": "number",
"description": "Search radius in km around near_lat/near_lng (default 25, max 500)"
},
"entity_type": {
"enum": [
"venue",
"place",
"attraction",
"business",
"professional",
"service",
"city",
"country",
"experience",
"government",
"region",
"transport"
],
"type": "string",
"description": "Filter by broad type of place"
}
}
}