Enhance MCP settings export with error handling and null value removal (#465)

This commit is contained in:
samanhappy
2025-12-01 16:28:45 +08:00
committed by GitHub
parent 764959eaca
commit 9d8f5ba370
3 changed files with 137 additions and 81 deletions

View File

@@ -4,6 +4,7 @@ import { loadSettings, loadOriginalSettings } from '../config/index.js';
import { getDataService } from '../services/services.js';
import { DataService } from '../services/dataService.js';
import { IUser } from '../types/index.js';
import { getServerDao } from '../dao/DaoFactory.js';
const dataService: DataService = getDataService();
@@ -73,17 +74,39 @@ export const getPublicConfig = (req: Request, res: Response): void => {
}
};
/**
* Recursively remove null values from an object
*/
const removeNullValues = <T>(obj: T): T => {
if (obj === null || obj === undefined) {
return obj;
}
if (Array.isArray(obj)) {
return obj.map((item) => removeNullValues(item)) as T;
}
if (typeof obj === 'object') {
const result: Record<string, unknown> = {};
for (const [key, value] of Object.entries(obj)) {
if (value !== null) {
result[key] = removeNullValues(value);
}
}
return result as T;
}
return obj;
};
/**
* Get MCP settings in JSON format for export/copy
* Supports both full settings and individual server configuration
*/
export const getMcpSettingsJson = (req: Request, res: Response): void => {
export const getMcpSettingsJson = async (req: Request, res: Response): Promise<void> => {
try {
const { serverName } = req.query;
const settings = loadOriginalSettings();
if (serverName && typeof serverName === 'string') {
// Return individual server configuration
const serverConfig = settings.mcpServers[serverName];
// Return individual server configuration using DAO
const serverDao = getServerDao();
const serverConfig = await serverDao.findById(serverName);
if (!serverConfig) {
res.status(404).json({
success: false,
@@ -92,16 +115,21 @@ export const getMcpSettingsJson = (req: Request, res: Response): void => {
return;
}
// Remove the 'name' field from config as it's used as the key
const { name, ...configWithoutName } = serverConfig;
// Remove null values from the config
const cleanedConfig = removeNullValues(configWithoutName);
res.json({
success: true,
data: {
mcpServers: {
[serverName]: serverConfig,
[name]: cleanedConfig,
},
},
});
} else {
// Return full settings
const settings = loadOriginalSettings();
res.json({
success: true,
data: settings,