Skip to main content
Glama
utils.ts1.75 kB
import crypto from 'crypto' import fs from 'fs' import os from 'os' import path from 'path' export function getServerUrlHash(key: URL): string { return crypto.createHash('sha256').update(key.toString()).digest('hex') } export function getTimestamp(): string { const now = new Date() return `${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}:${now.getSeconds().toString().padStart(2, '0')}.${now.getMilliseconds().toString().padStart(3, '0')}` } export function debugLog(str: string, ...rest: unknown[]) { if (!process.env.DEBUG) { return } void printLog('DEBUG', str, ...rest) } export function log(str: string, ...rest: unknown[]) { if (!process.env.LOGGING && !process.env.DEBUG) { return } void printLog('LOG', str, ...rest) } export function fatalLog(str: string, ...rest: unknown[]) { void printLog('FATAL', str, ...rest) } export async function printLog(type: string, str: string, ...rest: unknown[]) { console.error(`[${type}] [${process.pid}] ${str}`, ...rest) if (!process.env.STORE_LOGS) { return } try { const logfile = path.join(os.homedir(), '.mcp-auth', 'mcp-proxy.log') await fs.promises.appendFile(logfile, `[${new Date().toISOString()}] [${type}] [${process.pid}] ${str}\n`, 'utf-8') for (const arg of rest) { await fs.promises.appendFile(logfile, `${String(arg)}\n`, 'utf-8') } } catch {} } export function setupShutdownHook(cleanup: () => Promise<void>) { const fn = async () => { log('Shutting down...') await cleanup() process.exit(0) } process.on('SIGINT', fn) process.on('SIGTERM', fn) } export async function sleep(ms: number) { await new Promise((resolve) => setTimeout(resolve, ms)) }

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/sequa-ai/sequa-mcp'

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