Skip to main content
Glama
ryddle

DateTime MCP Server

by ryddle
index.ts6.85 kB
#!/usr/bin/env node import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, } from '@modelcontextprotocol/sdk/types.js'; import axios from 'axios'; class DateTimeServer { private server: Server; constructor() { this.server = new Server( { name: 'datetime-mcp-server', version: '0.1.0', }, { capabilities: { tools: {}, }, } ); this.setupToolHandlers(); this.server.onerror = (error) => console.error('[MCP Error]', error); process.on('SIGINT', async () => { await this.server.close(); process.exit(0); }); } private parseDate(dateStr: string): Date { let date: Date; if (dateStr.includes('-')) { // ISO format date = new Date(dateStr); } else if (dateStr.includes('/')) { // DD/MM/YYYY format const parts = dateStr.split('/'); if (parts.length !== 3) { throw new Error('Invalid date format. Use YYYY-MM-DD or DD/MM/YYYY'); } const day = parseInt(parts[0], 10); const month = parseInt(parts[1], 10) - 1; // Month is 0-indexed const year = parseInt(parts[2], 10); date = new Date(year, month, day); } else { throw new Error('Invalid date format. Use YYYY-MM-DD or DD/MM/YYYY'); } if (isNaN(date.getTime())) { throw new Error('Invalid date'); } return date; } private setupToolHandlers() { this.server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: [ { name: 'datetime', description: 'Get the current date and time in the user\'s local timezone.', inputSchema: { type: 'object', properties: {}, required: [], }, }, { name: 'day_of_week', description: 'Get the day of the week for a given date. Returns the day name in English (e.g., Monday, Tuesday, etc.).', inputSchema: { type: 'object', properties: { date: { type: 'string', description: 'Date in ISO format (YYYY-MM-DD) or DD/MM/YYYY format. Examples: "2026-01-05" or "5/1/2026"', }, }, required: ['date'], }, }, { name: 'date_diff', description: 'Calculate the difference between two dates. Returns the difference in days, weeks, months, and years.', inputSchema: { type: 'object', properties: { start_date: { type: 'string', description: 'Start date in ISO format (YYYY-MM-DD) or DD/MM/YYYY format', }, end_date: { type: 'string', description: 'End date in ISO format (YYYY-MM-DD) or DD/MM/YYYY format. If omitted, uses current date.', }, }, required: ['start_date'], }, }, ], })); this.server.setRequestHandler(CallToolRequestSchema, async (request) => { if (request.params.name === 'datetime') { try { const result = new Date().toString(); return { content: [ { type: 'text', text: result, }, ], }; } catch (error) { return { content: [ { type: 'text', text: `Error getting date and time: ${error instanceof Error ? error.message : String(error)}`, }, ], isError: true, }; } } if (request.params.name === 'day_of_week') { try { const dateStr = request.params.arguments?.date as string; if (!dateStr) { throw new Error('Date parameter is required'); } const date = this.parseDate(dateStr); // Get day of week in English const daysInEnglish = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; const dayOfWeek = daysInEnglish[date.getDay()]; return { content: [ { type: 'text', text: dayOfWeek, }, ], }; } catch (error) { return { content: [ { type: 'text', text: `Error getting day of week: ${error instanceof Error ? error.message : String(error)}`, }, ], isError: true, }; } } if (request.params.name === 'date_diff') { try { const startDateStr = request.params.arguments?.start_date as string; const endDateStr = request.params.arguments?.end_date as string; if (!startDateStr) { throw new Error('start_date parameter is required'); } const startDate = this.parseDate(startDateStr); const endDate = endDateStr ? this.parseDate(endDateStr) : new Date(); // Calculate difference in milliseconds const diffMs = endDate.getTime() - startDate.getTime(); const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24)); const diffWeeks = Math.floor(diffDays / 7); const diffMonths = Math.floor(diffDays / 30.44); // Average days per month const diffYears = Math.floor(diffDays / 365.25); // Account for leap years const result = { days: diffDays, weeks: diffWeeks, months: diffMonths, years: diffYears, start_date: startDate.toISOString().split('T')[0], end_date: endDate.toISOString().split('T')[0], }; return { content: [ { type: 'text', text: JSON.stringify(result, null, 2), }, ], }; } catch (error) { return { content: [ { type: 'text', text: `Error calculating date difference: ${error instanceof Error ? error.message : String(error)}`, }, ], isError: true, }; } } throw new McpError( ErrorCode.MethodNotFound, `Unknown tool: ${request.params.name}` ); }); } async run() { const transport = new StdioServerTransport(); await this.server.connect(transport); console.error('DateTime MCP server running on stdio'); } } const server = new DateTimeServer(); server.run().catch(console.error);

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ryddle/datetime-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server