feat: Add MCP Reinitialization to MCPPanel (#8418)

*  feat: Add MCP Reinitialization to MCPPanel

- Refactored tool caching to include user-specific tools in various service files.
- Refactored MCPManager class for clarity
- Added a new endpoint for reinitializing MCP servers, allowing for dynamic updates of server configurations.
- Enhanced the MCPPanel component to support server reinitialization with user feedback.

* 🔃 refactor: Simplify Plugin Deduplication and Clear Cache Post-MCP Initialization

- Replaced manual deduplication of tools with the dedicated `filterUniquePlugins` function for improved readability.
- Added back cache clearing for tools after MCP initialization to ensure fresh data is used.
- Removed unused exports from `PluginController.js` to clean up the codebase.
This commit is contained in:
Dustin Healy 2025-07-21 14:49:19 -07:00 committed by GitHub
parent 14660d75ae
commit faaba30af1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 499 additions and 193 deletions

View file

@ -708,5 +708,53 @@ describe('Environment Variable Extraction (MCP)', () => {
SYSTEM_PATH: process.env.PATH, // Actual value of PATH from the test environment
});
});
it('should process GitHub MCP server configuration with PAT_TOKEN placeholder', () => {
const user = createTestUser({ id: 'github-user-123', email: 'user@example.com' });
const customUserVars = {
PAT_TOKEN: 'ghp_1234567890abcdef1234567890abcdef12345678', // GitHub Personal Access Token
};
// Simulate the GitHub MCP server configuration from librechat.yaml
const obj: MCPOptions = {
type: 'streamable-http',
url: 'https://api.githubcopilot.com/mcp/',
headers: {
Authorization: '{{PAT_TOKEN}}',
'Content-Type': 'application/json',
'User-Agent': 'LibreChat-MCP-Client',
},
};
const result = processMCPEnv(obj, user, customUserVars);
expect('headers' in result && result.headers).toEqual({
Authorization: 'ghp_1234567890abcdef1234567890abcdef12345678',
'Content-Type': 'application/json',
'User-Agent': 'LibreChat-MCP-Client',
});
expect('url' in result && result.url).toBe('https://api.githubcopilot.com/mcp/');
expect(result.type).toBe('streamable-http');
});
it('should handle GitHub MCP server configuration without PAT_TOKEN (placeholder remains)', () => {
const user = createTestUser({ id: 'github-user-123' });
// No customUserVars provided - PAT_TOKEN should remain as placeholder
const obj: MCPOptions = {
type: 'streamable-http',
url: 'https://api.githubcopilot.com/mcp/',
headers: {
Authorization: '{{PAT_TOKEN}}',
'Content-Type': 'application/json',
},
};
const result = processMCPEnv(obj, user);
expect('headers' in result && result.headers).toEqual({
Authorization: '{{PAT_TOKEN}}', // Should remain unchanged since no customUserVars provided
'Content-Type': 'application/json',
});
});
});
});