Skip to main content
Glama
environment.ts3.74 kB
/** * Environment validation utilities */ import { exec } from 'child_process'; import { promisify } from 'util'; import { platform } from 'os'; import { EnvironmentValidation } from '../types/config.js'; const execAsync = promisify(exec); export async function validateEnvironment(): Promise<EnvironmentValidation> { const validation: EnvironmentValidation = { valid: true, errors: [], warnings: [], platform: platform(), nodeVersion: process.version, shortcutsAvailable: false }; // Check platform if (validation.platform !== 'darwin') { validation.errors.push('This MCP server only works on macOS'); validation.valid = false; } // Check Node.js version const nodeVersion = process.version; const majorVersion = parseInt(nodeVersion.slice(1).split('.')[0]); if (majorVersion < 18) { validation.errors.push(`Node.js 18+ required, found ${nodeVersion}`); validation.valid = false; } // Check macOS version if (validation.platform === 'darwin') { try { const { stdout } = await execAsync('sw_vers -productVersion'); const macosVersion = stdout.trim(); const majorVersion = parseInt(macosVersion.split('.')[0]); if (majorVersion < 12) { validation.errors.push(`macOS 12+ required for Shortcuts support, found ${macosVersion}`); validation.valid = false; } else { validation.warnings.push(`Running on macOS ${macosVersion}`); } } catch (error) { validation.warnings.push('Could not determine macOS version'); } } // Check shortcuts CLI availability try { await execAsync('which shortcuts'); validation.shortcutsAvailable = true; // Test shortcuts command try { await execAsync('shortcuts list'); validation.warnings.push('Shortcuts CLI is working'); } catch (error) { validation.errors.push('Shortcuts CLI found but not accessible. Check permissions.'); validation.valid = false; } } catch (error) { validation.errors.push('macOS shortcuts CLI not found. Ensure Shortcuts app is installed.'); validation.valid = false; } // Check for Shortcuts app try { await execAsync('ls /System/Applications/Shortcuts.app'); validation.warnings.push('Shortcuts app found'); } catch (error) { validation.warnings.push('Shortcuts app not found in expected location'); } // Check permissions try { // This is a basic check - more sophisticated permission checking could be added await execAsync('osascript -e "tell application \\"System Events\\" to get name"'); validation.warnings.push('Basic automation permissions available'); } catch (error) { validation.warnings.push('Automation permissions may need to be granted'); } return validation; } export function checkDependencies(): string[] { const missing: string[] = []; try { require('@modelcontextprotocol/sdk'); } catch { missing.push('@modelcontextprotocol/sdk'); } return missing; } export async function getSystemInfo(): Promise<Record<string, any>> { const info: Record<string, any> = { platform: platform(), nodeVersion: process.version, arch: process.arch, pid: process.pid, uptime: process.uptime() }; if (platform() === 'darwin') { try { const { stdout: macosVersion } = await execAsync('sw_vers -productVersion'); info.macosVersion = macosVersion.trim(); } catch { info.macosVersion = 'unknown'; } try { const { stdout: shortcutsVersion } = await execAsync('shortcuts --version'); info.shortcutsVersion = shortcutsVersion.trim(); } catch { info.shortcutsVersion = 'not available'; } } return info; }

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/aezizhu/shortcut-mcp'

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