UNPKG

@specstory/tnydev-mcp

Version:

MCP server for tny.dev URL shortening service - AI agent integration for link management

99 lines 3.59 kB
import axios from 'axios'; export class TnyDevClient { client; lastRateLimitInfo; constructor(config) { this.client = axios.create({ baseURL: config.baseUrl || 'https://www.tny.dev/api/v1', headers: { 'X-API-Key': config.apiKey, 'Content-Type': 'application/json', }, }); // Intercept responses to capture rate limit info this.client.interceptors.response.use((response) => { const headers = response.headers; if (headers['x-ratelimit-limit']) { this.lastRateLimitInfo = { limit: parseInt(headers['x-ratelimit-limit']), remaining: parseInt(headers['x-ratelimit-remaining']), reset: headers['x-ratelimit-reset'], tier: headers['x-ratelimit-tier'], }; } return response; }, (error) => { if (error.response?.headers) { const headers = error.response.headers; if (headers['x-ratelimit-limit']) { this.lastRateLimitInfo = { limit: parseInt(headers['x-ratelimit-limit']), remaining: parseInt(headers['x-ratelimit-remaining']), reset: headers['x-ratelimit-reset'], tier: headers['x-ratelimit-tier'], }; } } throw error; }); } async shortenUrl(request) { try { const response = await this.client.post('/shorten', request); return response.data; } catch (error) { this.handleError(error); } } async getAnalytics(slug) { try { const response = await this.client.get(`/analytics/${slug}`); return response.data; } catch (error) { this.handleError(error); } } async listLinks(page = 1, limit = 20) { try { const response = await this.client.get('/links', { params: { page, limit } }); return response.data; } catch (error) { this.handleError(error); } } getRateLimitInfo() { return this.lastRateLimitInfo; } handleError(error) { if (axios.isAxiosError(error)) { const axiosError = error; if (axiosError.response?.data) { const apiError = axiosError.response.data; let errorMessage = apiError.error; if (apiError.upgrade_required) { errorMessage += ` (Upgrade required: ${apiError.upgrade_url || '/plans'})`; } if (axiosError.response.status === 429) { errorMessage = `Rate limit exceeded. ${errorMessage}`; if (this.lastRateLimitInfo) { errorMessage += ` Reset at: ${new Date(this.lastRateLimitInfo.reset).toLocaleString()}`; } } throw new Error(errorMessage); } else if (axiosError.response) { throw new Error(`API error: ${axiosError.response.status} ${axiosError.response.statusText}`); } else if (axiosError.request) { throw new Error('No response from API server'); } } throw new Error('Unknown error occurred'); } } //# sourceMappingURL=client.js.map