const { CacheKeys } = require('librechat-data-provider'); const getLogStores = require('~/cache/getLogStores'); /** * Cache key generators for different tool access patterns */ const ToolCacheKeys = { /** Global tools available to all users */ GLOBAL: 'tools:global', /** MCP tools cached by user ID and server name */ MCP_SERVER: (userId, serverName) => `tools:mcp:${userId}:${serverName}`, }; /** * Retrieves available tools from cache * @function getCachedTools * @param {Object} options - Options for retrieving tools * @param {string} [options.userId] - User ID for user-specific MCP tools * @param {string} [options.serverName] - MCP server name to get cached tools for * @returns {Promise} The available tools object or null if not cached */ async function getCachedTools(options = {}) { const cache = getLogStores(CacheKeys.CONFIG_STORE); const { userId, serverName } = options; // Return MCP server-specific tools if requested if (serverName && userId) { return await cache.get(ToolCacheKeys.MCP_SERVER(userId, serverName)); } // Default to global tools return await cache.get(ToolCacheKeys.GLOBAL); } /** * Sets available tools in cache * @function setCachedTools * @param {Object} tools - The tools object to cache * @param {Object} options - Options for caching tools * @param {string} [options.userId] - User ID for user-specific MCP tools * @param {string} [options.serverName] - MCP server name for server-specific tools * @param {number} [options.ttl] - Time to live in milliseconds * @returns {Promise} Whether the operation was successful */ async function setCachedTools(tools, options = {}) { const cache = getLogStores(CacheKeys.CONFIG_STORE); const { userId, serverName, ttl } = options; // Cache by MCP server if specified (requires userId) if (serverName && userId) { return await cache.set(ToolCacheKeys.MCP_SERVER(userId, serverName), tools, ttl); } // Default to global cache return await cache.set(ToolCacheKeys.GLOBAL, tools, ttl); } /** * Invalidates cached tools * @function invalidateCachedTools * @param {Object} options - Options for invalidating tools * @param {string} [options.userId] - User ID for user-specific MCP tools * @param {string} [options.serverName] - MCP server name to invalidate * @param {boolean} [options.invalidateGlobal=false] - Whether to invalidate global tools * @returns {Promise} */ async function invalidateCachedTools(options = {}) { const cache = getLogStores(CacheKeys.CONFIG_STORE); const { userId, serverName, invalidateGlobal = false } = options; const keysToDelete = []; if (invalidateGlobal) { keysToDelete.push(ToolCacheKeys.GLOBAL); } if (serverName && userId) { keysToDelete.push(ToolCacheKeys.MCP_SERVER(userId, serverName)); } await Promise.all(keysToDelete.map((key) => cache.delete(key))); } /** * Gets MCP tools for a specific server from cache * @function getMCPServerTools * @param {string} userId - The user ID * @param {string} serverName - The MCP server name * @returns {Promise} The available tools for the server */ async function getMCPServerTools(userId, serverName) { const cache = getLogStores(CacheKeys.CONFIG_STORE); const serverTools = await cache.get(ToolCacheKeys.MCP_SERVER(userId, serverName)); if (serverTools) { return serverTools; } return null; } module.exports = { ToolCacheKeys, getCachedTools, setCachedTools, getMCPServerTools, invalidateCachedTools, };