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
JavaScript
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