Skip to main content
Glama

Timeline MCP Server

by derekalia
date-helpers.ts3.35 kB
/** * Helper functions for date handling in timeline-mcp * SQLite stores dates as strings, but we use Date types in our schemas */ /** * Convert a value to ISO string for SQLite storage * Handles Date objects, strings, null, and undefined */ export function toSQLiteDate(value: Date | string | null | undefined): string | null { if (value === null || value === undefined) { return null; } if (value instanceof Date) { return value.toISOString(); } // If it's already a string, validate it's a valid date if (typeof value === 'string') { const date = new Date(value); if (!isNaN(date.getTime())) { return date.toISOString(); } } return null; } /** * Parse a date string from SQLite to a Date object */ export function fromSQLiteDate(value: string | null | undefined): Date | null { if (value === null || value === undefined) { return null; } const date = new Date(value); return isNaN(date.getTime()) ? null : date; } /** * Prepare event data for SQLite storage * Converts all Date fields to ISO strings */ export function prepareEventForDb(event: any): any { const prepared = { ...event }; // Convert date fields to ISO strings if (prepared.scheduledTime) prepared.scheduledTime = toSQLiteDate(prepared.scheduledTime); if (prepared.generationTime) prepared.generationTime = toSQLiteDate(prepared.generationTime); if (prepared.postTime) prepared.postTime = toSQLiteDate(prepared.postTime); if (prepared.generationStartedAt) prepared.generationStartedAt = toSQLiteDate(prepared.generationStartedAt); if (prepared.approvalRequestedAt) prepared.approvalRequestedAt = toSQLiteDate(prepared.approvalRequestedAt); if (prepared.createdAt) prepared.createdAt = toSQLiteDate(prepared.createdAt); if (prepared.updatedAt) prepared.updatedAt = toSQLiteDate(prepared.updatedAt); // Convert boolean fields to 0/1 for SQLite if (typeof prepared.contentGenerated === 'boolean') { prepared.contentGenerated = prepared.contentGenerated ? 1 : 0; } if (typeof prepared.approved === 'boolean') { prepared.approved = prepared.approved ? 1 : 0; } if (typeof prepared.posted === 'boolean') { prepared.posted = prepared.posted ? 1 : 0; } if (typeof prepared.generationStarted === 'boolean') { prepared.generationStarted = prepared.generationStarted ? 1 : 0; } return prepared; } /** * Parse event data from SQLite * Converts date strings to Date objects and integers to booleans */ export function parseEventFromDb(event: any): any { if (!event) return null; const parsed = { ...event }; // Convert date strings to Date objects parsed.scheduledTime = fromSQLiteDate(event.scheduledTime); parsed.generationTime = fromSQLiteDate(event.generationTime); parsed.postTime = fromSQLiteDate(event.postTime); parsed.generationStartedAt = fromSQLiteDate(event.generationStartedAt); parsed.approvalRequestedAt = fromSQLiteDate(event.approvalRequestedAt); parsed.createdAt = fromSQLiteDate(event.createdAt); parsed.updatedAt = fromSQLiteDate(event.updatedAt); // Convert SQLite integers to booleans parsed.contentGenerated = event.contentGenerated === 1; parsed.approved = event.approved === 1; parsed.posted = event.posted === 1; parsed.generationStarted = event.generationStarted === 1; return parsed; }

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/derekalia/timeline-mcp'

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