get_top_deals
Retrieve trending deals from multiple sources like Slickdeals and RapidAPI. Specify sources and limit results to find the best offers quickly.
Instructions
Get top/trending deals from all or specific sources
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of deals to return | |
| sources | No | Specific sources to get deals from |
Implementation Reference
- src/server.ts:179-197 (registration)Tool registration for 'get_top_deals' including name, description, and input schema definition used in listTools response.{ name: 'get_top_deals', description: 'Get top/trending deals from all or specific sources', inputSchema: { type: 'object', properties: { limit: { type: 'number', description: 'Maximum number of deals to return', default: 20, }, sources: { type: 'array', items: { type: 'string' }, description: 'Specific sources to get deals from', }, }, }, },
- src/server.ts:315-342 (handler)Primary handler function for the MCP 'get_top_deals' tool. Extracts parameters from args, fetches top deals via aggregator, formats and returns JSON response.private async handleGetTopDeals(args: any) { const { limit = 20, sources } = args; const deals = await this.aggregator.getTopDeals(limit, sources); return { content: [ { type: 'text', text: JSON.stringify({ success: true, results: deals.length, deals: deals.map(deal => ({ id: deal.id, title: deal.title, price: deal.price, originalPrice: deal.originalPrice, discountPercentage: deal.discountPercentage, rating: deal.rating, store: deal.store, url: deal.url, source: deal.source, popularity: deal.popularity })) }, null, 2), }, ], }; }
- src/services/aggregator.ts:42-63 (helper)DealAggregator.getTopDeals: Orchestrates fetching top deals from selected providers in parallel, aggregates results, sorts by popularity, and limits output.async getTopDeals(limit: number = 20, sources?: string[]): Promise<Deal[]> { const selectedProviders = sources && sources.length > 0 ? sources.filter(source => this.providers.has(source)) : Array.from(this.providers.keys()); const dealPromises = selectedProviders.map(async (providerName) => { const provider = this.providers.get(providerName); if (!provider) return []; try { return await provider.getTopDeals(Math.ceil(limit / selectedProviders.length)); } catch (error) { console.error(`Error getting top deals from ${providerName}:`, error); return []; } }); const results = await Promise.all(dealPromises); const allDeals = results.flat(); return this.sortDeals(allDeals, 'popularity', 'desc').slice(0, limit); }
- src/providers/slickdeals.ts:29-42 (helper)SlickdealsProvider.getTopDeals: Fetches trending deals from Slickdeals API endpoint and transforms raw data into Deal objects.async getTopDeals(limit: number = 20): Promise<Deal[]> { try { const response = await this.client.get(`/v2/deals/trending?limit=${limit}`); if (response.data && response.data.deals) { return response.data.deals.map((deal: any) => this.transformDeal(deal)); } return []; } catch (error) { console.error('SlickDeals top deals error:', error); return []; } }
- src/providers/rapidapi.ts:40-55 (helper)RapidApiDealProvider.getTopDeals: Fetches trending deals from RapidAPI deals scraper endpoint and transforms into Deal objects.async getTopDeals(limit: number = 20): Promise<Deal[]> { try { const response = await this.client.get('/trending', { params: { limit } }); if (response.data && response.data.deals) { return response.data.deals.map((deal: any) => this.transformDeal(deal)); } return []; } catch (error) { console.error('RapidAPI top deals error:', error); return []; } }