UNPKG

random-org-mcp-server

Version:

MCP Server for api.random.org integration - Generate true random numbers, strings, UUIDs and more

158 lines 6.19 kB
import axios from 'axios'; import { RateLimiter } from './rateLimiter.js'; export class RandomOrgClient { constructor(config) { this.config = config; this.requestId = 1; this.client = axios.create({ baseURL: config.baseUrl, timeout: config.timeout, headers: { 'Content-Type': 'application/json', }, }); this.rateLimiter = new RateLimiter(config.rateLimitRequestsPerSecond || 1, config.rateLimitBurstSize || 5); } async makeRequest(method, params) { await this.rateLimiter.waitForToken(); const requestData = { jsonrpc: '2.0', method, params: { apiKey: this.config.apiKey, ...params, }, id: this.requestId++, }; let lastError; for (let attempt = 0; attempt <= (this.config.maxRetries || 3); attempt++) { try { const response = await this.client.post('', requestData); if (response.data.error) { const error = response.data; throw new Error(`Random.org API Error: ${error.error.message} (Code: ${error.error.code})`); } const result = response.data; return result.result; } catch (error) { lastError = error; if (attempt < (this.config.maxRetries || 3)) { const delay = (this.config.retryDelay || 1000) * Math.pow(2, attempt); await new Promise(resolve => setTimeout(resolve, delay)); } } } throw new Error(`Failed after ${this.config.maxRetries || 3} retries: ${lastError?.message || 'Unknown error'}`); } async generateIntegers(params) { this.validateIntegerParams(params); return this.makeRequest('generateIntegers', params); } async generateIntegerSequences(params) { this.validateIntegerSequenceParams(params); return this.makeRequest('generateIntegerSequences', params); } async generateDecimalFractions(params) { this.validateDecimalParams(params); return this.makeRequest('generateDecimalFractions', params); } async generateGaussians(params) { this.validateGaussianParams(params); return this.makeRequest('generateGaussians', params); } async generateStrings(params) { this.validateStringParams(params); return this.makeRequest('generateStrings', params); } async generateUUIDs(params) { this.validateUUIDParams(params); return this.makeRequest('generateUUIDs', params); } async generateBlobs(params) { this.validateBlobParams(params); return this.makeRequest('generateBlobs', params); } async getUsage() { return this.makeRequest('getUsage', {}); } // Validation methods validateIntegerParams(params) { if (params.n < 1 || params.n > 10000) { throw new Error('n must be between 1 and 10,000'); } if (params.min < -1000000000 || params.min > 1000000000) { throw new Error('min must be between -1,000,000,000 and 1,000,000,000'); } if (params.max < -1000000000 || params.max > 1000000000) { throw new Error('max must be between -1,000,000,000 and 1,000,000,000'); } if (params.min >= params.max) { throw new Error('min must be less than max'); } if (params.base && ![2, 8, 10, 16].includes(params.base)) { throw new Error('base must be 2, 8, 10, or 16'); } } validateIntegerSequenceParams(params) { if (params.n < 1 || params.n > 10000) { throw new Error('n must be between 1 and 10,000'); } if (params.length < 1 || params.length > 10000) { throw new Error('length must be between 1 and 10,000'); } if (params.min < -1000000000 || params.min > 1000000000) { throw new Error('min must be between -1,000,000,000 and 1,000,000,000'); } if (params.max < -1000000000 || params.max > 1000000000) { throw new Error('max must be between -1,000,000,000 and 1,000,000,000'); } if (params.min >= params.max) { throw new Error('min must be less than max'); } } validateDecimalParams(params) { if (params.n < 1 || params.n > 10000) { throw new Error('n must be between 1 and 10,000'); } if (params.decimalPlaces < 1 || params.decimalPlaces > 20) { throw new Error('decimalPlaces must be between 1 and 20'); } } validateGaussianParams(params) { if (params.n < 1 || params.n > 10000) { throw new Error('n must be between 1 and 10,000'); } if (params.significantDigits < 2 || params.significantDigits > 20) { throw new Error('significantDigits must be between 2 and 20'); } } validateStringParams(params) { if (params.n < 1 || params.n > 10000) { throw new Error('n must be between 1 and 10,000'); } if (params.length < 1 || params.length > 20) { throw new Error('length must be between 1 and 20'); } if (!params.characters || params.characters.length === 0) { throw new Error('characters must be a non-empty string'); } } validateUUIDParams(params) { if (params.n < 1 || params.n > 1000) { throw new Error('n must be between 1 and 1,000'); } } validateBlobParams(params) { if (params.n < 1 || params.n > 100) { throw new Error('n must be between 1 and 100'); } if (params.size < 1 || params.size > 1048576) { throw new Error('size must be between 1 and 1,048,576 bytes'); } if (params.format && !['base64', 'hex'].includes(params.format)) { throw new Error('format must be "base64" or "hex"'); } } } //# sourceMappingURL=randomOrgClient.js.map