mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-19 09:50:15 +01:00
🗃️ refactor: Simplify MCP Server Config to Two-Repository Pattern (#10705)
* refactor(mcp): simplify registry to two-repository architecture with explicit storage
* Chore: address AI Review comments
* Simplify MCP config cache architecture and remove legacy code:
Follow-up cleanup to commit d2bfdd033 which refactored MCP registry to two-repository architecture. This removes leftover legacy abstractions that were no longer used.
What changed:
- Simplified ServerConfigsCacheFactory.create() from 3 params to 2 (namespace, leaderOnly)
- Removed unused scope: 'Shared' | 'Private' parameter (only 'Shared' was ever used)
- Removed dead set() and getNamespace() methods from cache classes
- Updated JSDoc to reflect two-repository architecture (Cache + DB) instead of old three-tier system
- Fixed stale mocks and comments referencing removed sharedAppServers, sharedUserServers, privateServersCache
Files changed:
- ServerConfigsCacheFactory.ts - Simplified factory signature
- ServerConfigsCacheRedis.ts - Removed scope, renamed owner→namespace
- ServerConfigsCacheInMemory.ts - Removed unused methods
- MCPServersRegistry.ts - Updated JSDoc, simplified factory call
- RegistryStatusCache.ts - Removed stale JSDoc reference
- MCPManager.test.ts - Fixed legacy mock
- ServerConfigsCacheFactory.test.ts - Updated test assertions
* fix: Update error message in MCPServersRegistry for clarity
---------
Co-authored-by: Atef Bellaaj <slalom.bellaaj@external.daimlertruck.com>
Co-authored-by: Danny Avila <danny@librechat.ai>
This commit is contained in:
parent
fc73f4f996
commit
2263931a32
31 changed files with 551 additions and 4714 deletions
|
|
@ -26,18 +26,20 @@ export class ConnectionsRepository {
|
|||
/** Checks whether this repository can connect to a specific server */
|
||||
async has(serverName: string): Promise<boolean> {
|
||||
const config = await registry.getServerConfig(serverName, this.ownerId);
|
||||
if (!config) {
|
||||
//if the config does not exist, clean up any potential orphaned connections (caused by server tier migration)
|
||||
const canConnect = !!config && this.isAllowedToConnectToServer(config);
|
||||
if (!canConnect) {
|
||||
//if connection is no longer possible we attempt to disconnect any leftover connections
|
||||
await this.disconnect(serverName);
|
||||
}
|
||||
return !!config;
|
||||
return canConnect;
|
||||
}
|
||||
|
||||
/** Gets or creates a connection for the specified server with lazy loading */
|
||||
async get(serverName: string): Promise<MCPConnection | null> {
|
||||
const serverConfig = await registry.getServerConfig(serverName, this.ownerId);
|
||||
|
||||
const existingConnection = this.connections.get(serverName);
|
||||
if (!serverConfig) {
|
||||
if (!serverConfig || !this.isAllowedToConnectToServer(serverConfig)) {
|
||||
if (existingConnection) {
|
||||
await existingConnection.disconnect();
|
||||
}
|
||||
|
|
@ -64,7 +66,6 @@ export class ConnectionsRepository {
|
|||
await this.disconnect(serverName);
|
||||
}
|
||||
}
|
||||
|
||||
const connection = await MCPConnectionFactory.create(
|
||||
{
|
||||
serverName,
|
||||
|
|
@ -92,13 +93,13 @@ export class ConnectionsRepository {
|
|||
/** Gets or creates connections for all configured servers in this repository's scope */
|
||||
async getAll(): Promise<Map<string, MCPConnection>> {
|
||||
//TODO in the future we should use a scoped config getter (APPLevel, UserLevel, Private)
|
||||
//for now the unexisting config will not throw error
|
||||
//for now the absent config will not throw error
|
||||
const allConfigs = await registry.getAllServerConfigs(this.ownerId);
|
||||
return this.getMany(Object.keys(allConfigs));
|
||||
}
|
||||
|
||||
/** Disconnects and removes a specific server connection from the pool */
|
||||
disconnect(serverName: string): Promise<void> {
|
||||
async disconnect(serverName: string): Promise<void> {
|
||||
const connection = this.connections.get(serverName);
|
||||
if (!connection) return Promise.resolve();
|
||||
this.connections.delete(serverName);
|
||||
|
|
@ -117,4 +118,12 @@ export class ConnectionsRepository {
|
|||
protected prefix(serverName: string): string {
|
||||
return `[MCP][${serverName}]`;
|
||||
}
|
||||
|
||||
private isAllowedToConnectToServer(config: t.ParsedServerConfig) {
|
||||
//the repository is not allowed to be connected in case the Connection repository is shared (ownerId is undefined/null) and the server requires Auth or startup false.
|
||||
if (this.ownerId === undefined && (config.startup === false || config.requiresOAuth)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue