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
JavaScript
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