UNPKG

mcp-server-ticketmaster

Version:

A Model Context Protocol server for discovering events, venues, and attractions through the Ticketmaster Discovery API

100 lines 3.47 kB
import axios from 'axios'; import { TicketmasterApiError } from './types.js'; /** * Client for interacting with the Ticketmaster Discovery API */ export class TicketmasterClient { constructor(apiKey) { this.baseUrl = 'https://app.ticketmaster.com/discovery/v2'; if (!apiKey) { throw new Error('API key is required'); } this.apiKey = apiKey; } /** * Formats a date range for the Ticketmaster API * @param startDate Start of the date range * @param endDate End of the date range * @returns Formatted date range string */ formatDateRange(startDate, endDate) { // Set start time to beginning of day in UTC const start = new Date(startDate); start.setUTCHours(0, 0, 0, 0); // Set end time to end of day in UTC const end = new Date(endDate); end.setUTCHours(23, 59, 59, 999); return `${start.toISOString().split('.')[0]}Z,${end.toISOString().split('.')[0]}Z`; } /** * Search for events, venues, or attractions * @param type Type of search (event, venue, attraction) * @param query Search query parameters * @returns Array of matching items */ async search(type, query = {}) { try { const endpoint = `${this.baseUrl}/${type}s`; const params = { apikey: this.apiKey, size: query.size || 20 }; if (query.keyword) { params.keyword = query.keyword; } if (query.startDateTime && query.endDateTime) { const dateRange = this.formatDateRange(query.startDateTime, query.endDateTime); params.startDateTime = dateRange.split(',')[0]; params.endDateTime = dateRange.split(',')[1]; } if (query.city) { params.city = query.city; } if (query.stateCode) { params.stateCode = query.stateCode; } if (query.countryCode) { params.countryCode = query.countryCode; } if (query.venueId) { params.venueId = query.venueId; } if (query.attractionId) { params.attractionId = query.attractionId; } if (query.classificationName) { params.classificationName = query.classificationName; } const response = await axios.get(endpoint, { params }); const items = response.data._embedded?.[`${type}s`] || []; return items; } catch (error) { if (axios.isAxiosError(error)) { const axiosError = error; const apiError = axiosError.response?.data?.fault; throw new TicketmasterApiError(apiError?.faultstring || 'Failed to fetch results', apiError?.detail?.errorcode, axiosError.response?.status); } throw error; } } /** * Search for events */ async searchEvents(query = {}) { return this.search('event', query); } /** * Search for venues */ async searchVenues(query = {}) { return this.search('venue', query); } /** * Search for attractions */ async searchAttractions(query = {}) { return this.search('attraction', query); } } //# sourceMappingURL=TicketmasterClient.js.map