Skip to main content
Glama
pshempel

MCP Time Server Node

by pshempel
REQUIREMENTS.md4.76 kB
# Requirements Verification for MCP Time Server **Status**: ✅ All Requirements Implemented and Verified ## System Environment - **OS**: Debian GNU/Linux 12 (bookworm) - **Node.js**: v18.19.0 (LTS, fully compatible) - **npm**: 9.2.0 - **Target Compatibility**: Ubuntu Noble (24.04 LTS) ## 1. MCP SDK Version ✅ - **Specified**: `@modelcontextprotocol/sdk": "^0.5.0"` - **Implemented**: Using 0.5.0 (stable, working perfectly) - **Note**: Latest is 1.15.1 but 0.5.0 meets all requirements ## 2. Error Codes Definition ```typescript export enum TimeServerErrorCodes { // Timezone errors INVALID_TIMEZONE = 'INVALID_TIMEZONE', TIMEZONE_NOT_FOUND = 'TIMEZONE_NOT_FOUND', // Date/Time format errors INVALID_DATE_FORMAT = 'INVALID_DATE_FORMAT', INVALID_TIME_FORMAT = 'INVALID_TIME_FORMAT', UNPARSEABLE_DATE = 'UNPARSEABLE_DATE', // Calculation errors INVALID_UNIT = 'INVALID_UNIT', CALCULATION_OVERFLOW = 'CALCULATION_OVERFLOW', NEGATIVE_DURATION = 'NEGATIVE_DURATION', // Business logic errors INVALID_RECURRENCE_PATTERN = 'INVALID_RECURRENCE_PATTERN', INVALID_DAY_OF_WEEK = 'INVALID_DAY_OF_WEEK', INVALID_DAY_OF_MONTH = 'INVALID_DAY_OF_MONTH', // System errors RATE_LIMIT_EXCEEDED = 'RATE_LIMIT_EXCEEDED', CACHE_ERROR = 'CACHE_ERROR', INTERNAL_ERROR = 'INTERNAL_ERROR' } ``` ## 3. Validation Rules ### IANA Timezone Validation - Use `moment-timezone` built-in validation: `moment.tz.zone(timezone) !== null` - Fallback to UTC for invalid timezones with warning ### Date Format Validation - ISO 8601 formats (primary) - RFC 2822 formats - Unix timestamps (numeric) - Custom formats via moment.js parsing ### Business Day Edge Cases - Handle month boundaries - Account for leap years - Weekend definitions (configurable) - Holiday overlap with weekends ## 4. MCP Tool Call Implementation Pattern ```typescript server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: toolDefinitions })); server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; // Rate limiting check if (!checkRateLimit(request.context?.clientId)) { throw new McpError( ErrorCode.RateLimitExceeded, 'Rate limit exceeded' ); } // Tool routing const handler = toolHandlers[name]; if (!handler) { throw new McpError( ErrorCode.MethodNotFound, `Unknown tool: ${name}` ); } try { const result = await handler(args); return { content: [{ type: 'text', text: JSON.stringify(result) }] }; } catch (error) { // Structured error handling return handleToolError(error); } }); ``` ## 5. Testing Coverage Target - **Target**: 90% code coverage - **Critical paths**: 100% coverage required - **Jest configuration**: ```json { "coverageThreshold": { "global": { "branches": 90, "functions": 90, "lines": 90, "statements": 90 } } } ``` ## 6. TypeScript Configuration ```json { "compilerOptions": { "target": "ES2022", "module": "commonjs", "lib": ["ES2022"], "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, "declaration": true, "declarationMap": true, "sourceMap": true, "noUnusedLocals": true, "noUnusedParameters": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true }, "include": ["src/**/*"], "exclude": ["node_modules", "dist", "tests"] } ``` ## 7. NPM Scripts ```json { "scripts": { "build": "tsc", "build:watch": "tsc --watch", "test": "jest", "test:watch": "jest --watch", "test:coverage": "jest --coverage", "lint": "eslint src --ext .ts", "lint:fix": "eslint src --ext .ts --fix", "format": "prettier --write 'src/**/*.ts' 'tests/**/*.ts'", "format:check": "prettier --check 'src/**/*.ts' 'tests/**/*.ts'", "precommit": "lint-staged", "prepare": "husky install", "dev": "nodemon --watch src --ext ts --exec 'ts-node src/index.ts'", "start": "node dist/index.js" } } ``` ## 8. Rate Limiting Strategy - **Decision**: In-memory storage is acceptable for MVP - **Implementation**: Use Map with automatic cleanup - **Future**: Can add Redis for distributed deployments - **Configuration**: - Default: 100 requests/minute per client - Configurable via environment variable - Graceful degradation with clear error messages ## Additional Compatibility Notes - Node.js 18.19.0 supports all required ES2022 features - TypeScript 5.x fully compatible - All npm packages compatible with Node 18.x - Debian Bookworm has all required system libraries

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/pshempel/mcp-time-server-node'

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