Skip to main content
Glama
phase3-tools.ts7.06 kB
/** * Phase 3 Tools - Security and performance management tools */ import type { ToolMetadata, ToolImplementation } from '../types.js'; import type { AuditLogger } from '../monitoring/audit-logger.js'; import type { TieredRateLimiter } from '../security/rate-limiter.js'; import type { ParallelExecutor, ParallelExecutionRequest } from '../performance/parallel-executor.js'; /** * Create audit logs query tool metadata */ export function createAuditLogsToolMetadata(): ToolMetadata { return { name: 'query_audit_logs', description: 'Query audit logs with filters for security and compliance monitoring', parameters: [ { name: 'startDate', type: 'string', description: 'Start date for log query (ISO 8601 format)', required: false, }, { name: 'endDate', type: 'string', description: 'End date for log query (ISO 8601 format)', required: false, }, { name: 'type', type: 'string', description: 'Event type filter', required: false, enum: ['tool_execution', 'authentication', 'authorization', 'configuration_change', 'rate_limit', 'error', 'system'], }, { name: 'level', type: 'string', description: 'Event level filter', required: false, enum: ['info', 'warn', 'error', 'critical'], }, { name: 'actorId', type: 'string', description: 'Filter by actor ID', required: false, }, { name: 'action', type: 'string', description: 'Filter by action', required: false, }, { name: 'result', type: 'string', description: 'Filter by result', required: false, enum: ['success', 'failure'], }, { name: 'limit', type: 'number', description: 'Maximum number of results', required: false, minimum: 1, maximum: 1000, default: 100, }, { name: 'offset', type: 'number', description: 'Pagination offset', required: false, minimum: 0, default: 0, }, ], }; } /** * Create audit logs query tool implementation */ export function createAuditLogsToolImplementation( auditLogger: AuditLogger ): ToolImplementation { return async (parameters: Record<string, any>) => { const query: any = { limit: parameters.limit || 100, offset: parameters.offset || 0, }; if (parameters.startDate) { query.startDate = new Date(parameters.startDate); } if (parameters.endDate) { query.endDate = new Date(parameters.endDate); } if (parameters.type) { query.type = parameters.type; } if (parameters.level) { query.level = parameters.level; } if (parameters.actorId) { query.actorId = parameters.actorId; } if (parameters.action) { query.action = parameters.action; } if (parameters.result) { query.result = parameters.result; } const logs = auditLogger.query(query); const stats = auditLogger.getStats(); return { logs, stats, query, }; }; } /** * Create audit stats tool metadata */ export function createAuditStatsToolMetadata(): ToolMetadata { return { name: 'get_audit_stats', description: 'Get statistical summary of audit logs', parameters: [ { name: 'timeWindowMs', type: 'number', description: 'Time window in milliseconds (optional, defaults to all time)', required: false, minimum: 1000, }, ], }; } /** * Create audit stats tool implementation */ export function createAuditStatsToolImplementation( auditLogger: AuditLogger ): ToolImplementation { return async (parameters: Record<string, any>) => { const timeWindowMs = parameters.timeWindowMs; const stats = auditLogger.getStats(timeWindowMs); return { stats, timeWindow: timeWindowMs ? `Last ${timeWindowMs}ms` : 'All time', }; }; } /** * Create parallel execution tool metadata */ export function createParallelExecutionToolMetadata(): ToolMetadata { return { name: 'execute_parallel', description: 'Execute multiple tool calls in parallel for improved performance', parameters: [ { name: 'requests', type: 'array', description: 'Array of tool execution requests, each with toolName and parameters', required: true, }, { name: 'maxConcurrency', type: 'number', description: 'Maximum number of concurrent executions', required: false, minimum: 1, maximum: 50, default: 10, }, { name: 'timeout', type: 'number', description: 'Timeout in milliseconds for each execution', required: false, minimum: 1000, default: 30000, }, { name: 'continueOnError', type: 'boolean', description: 'Continue executing remaining tasks if one fails', required: false, default: true, }, ], }; } /** * Create parallel execution tool implementation */ export function createParallelExecutionToolImplementation( parallelExecutor: ParallelExecutor ): ToolImplementation { return async (parameters: Record<string, any>) => { const { requests, maxConcurrency, timeout, continueOnError } = parameters; if (!Array.isArray(requests)) { throw new Error('requests parameter must be an array'); } const parallelRequests: ParallelExecutionRequest[] = requests.map((req: any, index: number) => ({ id: req.id || `request-${index}`, toolName: req.toolName, parameters: req.parameters || {}, })); const summary = await parallelExecutor.executeParallel(parallelRequests, { maxConcurrency, timeout, continueOnError, }); const stats = parallelExecutor.getExecutionStats(summary); return { summary, stats, }; }; } /** * Create rate limit stats tool metadata */ export function createRateLimitStatsToolMetadata(): ToolMetadata { return { name: 'get_rate_limit_stats', description: 'Get current rate limit statistics for all identifiers', parameters: [], }; } /** * Create rate limit stats tool implementation */ export function createRateLimitStatsToolImplementation( rateLimiter: TieredRateLimiter ): ToolImplementation { return async () => { const stats = rateLimiter.getStats(); return stats; }; } /** * Create cache stats tool metadata */ export function createCacheStatsToolMetadata(): ToolMetadata { return { name: 'get_cache_stats', description: 'Get cache performance statistics', parameters: [], }; } /** * Create cache stats tool implementation */ export function createCacheStatsToolImplementation( getCacheStats: () => any ): ToolImplementation { return async () => { return getCacheStats(); }; }

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/krtw00/search-mcp'

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