@specstory/tnydev-mcp
Version:
MCP server for tny.dev URL shortening service - AI agent integration for link management
70 lines (64 loc) ⢠2.54 kB
JavaScript
import { z } from 'zod';
const GetAnalyticsSchema = z.object({
slug: z.string().describe('The slug of the shortened URL to get analytics for')
});
export async function handleGetAnalytics(params, client) {
const parsed = GetAnalyticsSchema.parse(params);
try {
const result = await client.getAnalytics(parsed.slug);
const rateLimitInfo = client.getRateLimitInfo();
// Format analytics for display
const analytics = result.analytics;
const link = result.link;
const analyticsText = `Analytics for ${link.long_url}:
š **Total Clicks**: ${analytics.total_clicks}
- Actual clicks: ${analytics.actual_clicks}
- Previews: ${analytics.previews}
- QR scans: ${analytics.qr_scans}
- Email clicks: ${analytics.email_clicks}
- Bot visits: ${analytics.bot_visits}
š± **Devices**:
${Object.entries(analytics.devices).map(([device, count]) => `- ${device}: ${count}`).join('\n')}
š **Top Countries**:
${Object.entries(analytics.countries).slice(0, 5).map(([country, count]) => `- ${country}: ${count}`).join('\n')}
š **Top Referrers**:
${Object.entries(analytics.referrers).slice(0, 5).map(([referrer, count]) => `- ${referrer}: ${count}`).join('\n')}
${analytics.utm.total > 0 ? `
š **UTM Parameters**:
- Sources: ${Object.keys(analytics.utm.sources).join(', ')}
- Mediums: ${Object.keys(analytics.utm.mediums).join(', ')}
- Campaigns: ${Object.keys(analytics.utm.campaigns).join(', ')}
- Total UTM clicks: ${analytics.utm.total}
` : ''}
š **Short URL**: https://www.tny.dev/${parsed.slug}
š
**Created**: ${new Date(link.created_at).toLocaleString()}${rateLimitInfo
? `\n\nā” Rate Limit: ${rateLimitInfo.remaining}/${rateLimitInfo.limit} requests remaining (${rateLimitInfo.tier} tier)`
: ''}`;
return {
content: [
{
type: "text",
text: analyticsText
}
]
};
}
catch (error) {
throw new Error(`Failed to get analytics: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
}
export const getAnalyticsTool = {
name: "get_link_analytics",
description: "Get click analytics for a shortened link",
inputSchema: {
type: "object",
properties: {
slug: {
type: "string",
description: "The slug of the shortened URL to get analytics for"
}
},
required: ["slug"]
}
};
//# sourceMappingURL=analytics.js.map