UNPKG

@aashari/mcp-server-aws-sso

Version:

Node.js/TypeScript MCP server for AWS Single Sign-On (SSO). Enables AI systems (LLMs) with tools to initiate SSO login (device auth flow), list accounts/roles, and securely execute AWS CLI commands using temporary credentials. Streamlines AI interaction w

199 lines (198 loc) 6.42 kB
"use strict"; /** * Standardized formatting utilities for consistent output across all CLI and Tool interfaces. * These functions should be used by all formatters to ensure consistent formatting. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.formatDate = formatDate; exports.formatRelativeTime = formatRelativeTime; exports.formatUrl = formatUrl; exports.formatPagination = formatPagination; exports.formatHeading = formatHeading; exports.formatBulletList = formatBulletList; exports.formatSeparator = formatSeparator; exports.formatNumberedList = formatNumberedList; exports.formatCodeBlock = formatCodeBlock; /** * Format a date in a standardized way: YYYY-MM-DD HH:MM:SS UTC * @param dateString - ISO date string or Date object * @returns Formatted date string */ function formatDate(dateString) { if (!dateString) { return 'Not available'; } try { const date = typeof dateString === 'string' ? new Date(dateString) : dateString; // Format: YYYY-MM-DD HH:MM:SS UTC return date .toISOString() .replace('T', ' ') .replace(/\.\d+Z$/, ' UTC'); } catch { return 'Invalid date'; } } /** * Format a relative time (e.g., "2 days ago") * @param dateString - ISO date string or Date object * @returns Relative time string */ function formatRelativeTime(dateString) { if (!dateString) { return 'Not available'; } try { const date = typeof dateString === 'string' ? new Date(dateString) : dateString; const now = new Date(); const diffMs = now.getTime() - date.getTime(); const diffSec = Math.floor(diffMs / 1000); const diffMin = Math.floor(diffSec / 60); const diffHour = Math.floor(diffMin / 60); const diffDay = Math.floor(diffHour / 24); const diffMonth = Math.floor(diffDay / 30); const diffYear = Math.floor(diffMonth / 12); if (diffYear > 0) { return `${diffYear} year${diffYear === 1 ? '' : 's'} ago`; } else if (diffMonth > 0) { return `${diffMonth} month${diffMonth === 1 ? '' : 's'} ago`; } else if (diffDay > 0) { return `${diffDay} day${diffDay === 1 ? '' : 's'} ago`; } else if (diffHour > 0) { return `${diffHour} hour${diffHour === 1 ? '' : 's'} ago`; } else if (diffMin > 0) { return `${diffMin} minute${diffMin === 1 ? '' : 's'} ago`; } else { return `${diffSec} second${diffSec === 1 ? '' : 's'} ago`; } } catch { return 'Invalid date'; } } /** * Format a URL as a markdown link * @param url - URL to format * @param title - Link title * @returns Formatted markdown link */ function formatUrl(url, title) { if (!url) { return 'Not available'; } const linkTitle = title || url; return `[${linkTitle}](${url})`; } /** * Format pagination information in a standardized way * @param totalItems - Number of items in the current result set * @param hasMore - Whether there are more results available * @param nextCursor - Cursor for the next page of results * @returns Formatted pagination information */ function formatPagination(totalItems, hasMore, nextCursor) { if (!hasMore) { return `*Showing ${totalItems} item${totalItems === 1 ? '' : 's'}.*`; } return `*Showing ${totalItems} item${totalItems === 1 ? '' : 's'}. More results are available.*\n\nTo see more results, use --cursor "${nextCursor}"`; } /** * Format a heading with consistent style * @param text - Heading text * @param level - Heading level (1-6) * @returns Formatted heading */ function formatHeading(text, level = 1) { const validLevel = Math.min(Math.max(level, 1), 6); const prefix = '#'.repeat(validLevel); return `${prefix} ${text}`; } /** * Format a list of key-value pairs as a bullet list * @param items - Object with key-value pairs * @param keyFormatter - Optional function to format keys * @returns Formatted bullet list */ function formatBulletList(items, keyFormatter) { const lines = []; for (const [key, value] of Object.entries(items)) { if (value === undefined || value === null) { continue; } const formattedKey = keyFormatter ? keyFormatter(key) : key; const formattedValue = formatValue(value); lines.push(`- **${formattedKey}**: ${formattedValue}`); } return lines.join('\n'); } /** * Format a value based on its type * @param value - Value to format * @returns Formatted value */ function formatValue(value) { if (value === undefined || value === null) { return 'Not available'; } if (value instanceof Date) { return formatDate(value); } // Handle URL objects with url and title properties if (typeof value === 'object' && value !== null && 'url' in value) { const urlObj = value; if (typeof urlObj.url === 'string') { return formatUrl(urlObj.url, urlObj.title); } } if (typeof value === 'string') { // Check if it's a URL if (value.startsWith('http://') || value.startsWith('https://')) { return formatUrl(value); } // Check if it might be a date if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(value)) { return formatDate(value); } return value; } if (typeof value === 'boolean') { return value ? 'Yes' : 'No'; } return String(value); } /** * Format a separator line * @returns Separator line */ function formatSeparator() { return '---'; } /** * Format a numbered list of items * @param items - Array of items to format * @param formatter - Function to format each item * @returns Formatted numbered list */ function formatNumberedList(items, formatter) { if (!items.length) { return 'No items available.'; } return items .map((item, index) => formatter(item, index)) .join('\n\n' + formatSeparator() + '\n\n'); } /** * Format a code block with the given content * @param content Code content * @param language Optional language for syntax highlighting * @returns Formatted code block */ function formatCodeBlock(content, language = '') { return '```' + language + '\n' + content.trim() + '\n```'; }