@specstory/tnydev-mcp
Version:
MCP server for tny.dev URL shortening service - AI agent integration for link management
99 lines • 3.59 kB
JavaScript
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