mirror of
https://github.com/samanhappy/mcphub.git
synced 2025-12-28 20:49:09 -05:00
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: samanhappy <2755122+samanhappy@users.noreply.github.com>
277 lines
7.6 KiB
TypeScript
277 lines
7.6 KiB
TypeScript
import { Request, Response } from 'express';
|
|
import { ApiResponse, CloudServer, CloudTool } from '../types/index.js';
|
|
import {
|
|
getCloudServers,
|
|
getCloudServerByName,
|
|
getCloudServerTools,
|
|
callCloudServerTool,
|
|
getCloudCategories,
|
|
getCloudTags,
|
|
searchCloudServers,
|
|
filterCloudServersByCategory,
|
|
filterCloudServersByTag,
|
|
} from '../services/cloudService.js';
|
|
|
|
// Get all cloud market servers
|
|
export const getAllCloudServers = async (_: Request, res: Response): Promise<void> => {
|
|
try {
|
|
const cloudServers = await getCloudServers();
|
|
const response: ApiResponse<CloudServer[]> = {
|
|
success: true,
|
|
data: cloudServers,
|
|
};
|
|
res.json(response);
|
|
} catch (error) {
|
|
console.error('Error getting cloud market servers:', error);
|
|
const errorMessage =
|
|
error instanceof Error ? error.message : 'Failed to get cloud market servers';
|
|
res.status(500).json({
|
|
success: false,
|
|
message: errorMessage,
|
|
});
|
|
}
|
|
};
|
|
|
|
// Get a specific cloud market server by name
|
|
export const getCloudServer = async (req: Request, res: Response): Promise<void> => {
|
|
try {
|
|
const { name } = req.params;
|
|
if (!name) {
|
|
res.status(400).json({
|
|
success: false,
|
|
message: 'Server name is required',
|
|
});
|
|
return;
|
|
}
|
|
|
|
const server = await getCloudServerByName(name);
|
|
if (!server) {
|
|
res.status(404).json({
|
|
success: false,
|
|
message: 'Cloud server not found',
|
|
});
|
|
return;
|
|
}
|
|
|
|
// Fetch tools for this server
|
|
try {
|
|
const tools = await getCloudServerTools(server.server_key);
|
|
server.tools = tools;
|
|
} catch (toolError) {
|
|
console.warn(`Failed to fetch tools for server ${server.name}:`, toolError);
|
|
// Continue without tools
|
|
}
|
|
|
|
const response: ApiResponse<CloudServer> = {
|
|
success: true,
|
|
data: server,
|
|
};
|
|
res.json(response);
|
|
} catch (error) {
|
|
console.error('Error getting cloud market server:', error);
|
|
const errorMessage =
|
|
error instanceof Error ? error.message : 'Failed to get cloud market server';
|
|
res.status(500).json({
|
|
success: false,
|
|
message: errorMessage,
|
|
});
|
|
}
|
|
};
|
|
|
|
// Get all cloud market categories
|
|
export const getAllCloudCategories = async (_: Request, res: Response): Promise<void> => {
|
|
try {
|
|
const categories = await getCloudCategories();
|
|
const response: ApiResponse<string[]> = {
|
|
success: true,
|
|
data: categories,
|
|
};
|
|
res.json(response);
|
|
} catch (error) {
|
|
console.error('Error getting cloud market categories:', error);
|
|
const errorMessage =
|
|
error instanceof Error ? error.message : 'Failed to get cloud market categories';
|
|
res.status(500).json({
|
|
success: false,
|
|
message: errorMessage,
|
|
});
|
|
}
|
|
};
|
|
|
|
// Get all cloud market tags
|
|
export const getAllCloudTags = async (_: Request, res: Response): Promise<void> => {
|
|
try {
|
|
const tags = await getCloudTags();
|
|
const response: ApiResponse<string[]> = {
|
|
success: true,
|
|
data: tags,
|
|
};
|
|
res.json(response);
|
|
} catch (error) {
|
|
console.error('Error getting cloud market tags:', error);
|
|
const errorMessage = error instanceof Error ? error.message : 'Failed to get cloud market tags';
|
|
res.status(500).json({
|
|
success: false,
|
|
message: errorMessage,
|
|
});
|
|
}
|
|
};
|
|
|
|
// Search cloud market servers
|
|
export const searchCloudServersByQuery = async (req: Request, res: Response): Promise<void> => {
|
|
try {
|
|
const query = req.query.query as string;
|
|
if (!query || query.trim() === '') {
|
|
res.status(400).json({
|
|
success: false,
|
|
message: 'Search query is required',
|
|
});
|
|
return;
|
|
}
|
|
|
|
const servers = await searchCloudServers(query);
|
|
const response: ApiResponse<CloudServer[]> = {
|
|
success: true,
|
|
data: servers,
|
|
};
|
|
res.json(response);
|
|
} catch (error) {
|
|
console.error('Error searching cloud market servers:', error);
|
|
const errorMessage =
|
|
error instanceof Error ? error.message : 'Failed to search cloud market servers';
|
|
res.status(500).json({
|
|
success: false,
|
|
message: errorMessage,
|
|
});
|
|
}
|
|
};
|
|
|
|
// Get cloud market servers by category
|
|
export const getCloudServersByCategory = async (req: Request, res: Response): Promise<void> => {
|
|
try {
|
|
const { category } = req.params;
|
|
if (!category) {
|
|
res.status(400).json({
|
|
success: false,
|
|
message: 'Category is required',
|
|
});
|
|
return;
|
|
}
|
|
|
|
const servers = await filterCloudServersByCategory(category);
|
|
const response: ApiResponse<CloudServer[]> = {
|
|
success: true,
|
|
data: servers,
|
|
};
|
|
res.json(response);
|
|
} catch (error) {
|
|
console.error('Error getting cloud market servers by category:', error);
|
|
const errorMessage =
|
|
error instanceof Error ? error.message : 'Failed to get cloud market servers by category';
|
|
res.status(500).json({
|
|
success: false,
|
|
message: errorMessage,
|
|
});
|
|
}
|
|
};
|
|
|
|
// Get cloud market servers by tag
|
|
export const getCloudServersByTag = async (req: Request, res: Response): Promise<void> => {
|
|
try {
|
|
const { tag } = req.params;
|
|
if (!tag) {
|
|
res.status(400).json({
|
|
success: false,
|
|
message: 'Tag is required',
|
|
});
|
|
return;
|
|
}
|
|
|
|
const servers = await filterCloudServersByTag(tag);
|
|
const response: ApiResponse<CloudServer[]> = {
|
|
success: true,
|
|
data: servers,
|
|
};
|
|
res.json(response);
|
|
} catch (error) {
|
|
console.error('Error getting cloud market servers by tag:', error);
|
|
const errorMessage =
|
|
error instanceof Error ? error.message : 'Failed to get cloud market servers by tag';
|
|
res.status(500).json({
|
|
success: false,
|
|
message: errorMessage,
|
|
});
|
|
}
|
|
};
|
|
|
|
// Get tools for a specific cloud server
|
|
export const getCloudServerToolsList = async (req: Request, res: Response): Promise<void> => {
|
|
try {
|
|
// Decode URL-encoded parameter to handle slashes in server name
|
|
const serverName = decodeURIComponent(req.params.serverName);
|
|
if (!serverName) {
|
|
res.status(400).json({
|
|
success: false,
|
|
message: 'Server name is required',
|
|
});
|
|
return;
|
|
}
|
|
|
|
const tools = await getCloudServerTools(serverName);
|
|
const response: ApiResponse<CloudTool[]> = {
|
|
success: true,
|
|
data: tools,
|
|
};
|
|
res.json(response);
|
|
} catch (error) {
|
|
console.error('Error getting cloud server tools:', error);
|
|
const errorMessage =
|
|
error instanceof Error ? error.message : 'Failed to get cloud server tools';
|
|
res.status(500).json({
|
|
success: false,
|
|
message: errorMessage,
|
|
});
|
|
}
|
|
};
|
|
|
|
// Call a tool on a cloud server
|
|
export const callCloudTool = async (req: Request, res: Response): Promise<void> => {
|
|
try {
|
|
// Decode URL-encoded parameters to handle slashes in server/tool names
|
|
const serverName = decodeURIComponent(req.params.serverName);
|
|
const toolName = decodeURIComponent(req.params.toolName);
|
|
const { arguments: args } = req.body;
|
|
|
|
if (!serverName) {
|
|
res.status(400).json({
|
|
success: false,
|
|
message: 'Server name is required',
|
|
});
|
|
return;
|
|
}
|
|
|
|
if (!toolName) {
|
|
res.status(400).json({
|
|
success: false,
|
|
message: 'Tool name is required',
|
|
});
|
|
return;
|
|
}
|
|
|
|
const result = await callCloudServerTool(serverName, toolName, args || {});
|
|
const response: ApiResponse = {
|
|
success: true,
|
|
data: result,
|
|
};
|
|
res.json(response);
|
|
} catch (error) {
|
|
console.error('Error calling cloud server tool:', error);
|
|
const errorMessage =
|
|
error instanceof Error ? error.message : 'Failed to call cloud server tool';
|
|
res.status(500).json({
|
|
success: false,
|
|
message: errorMessage,
|
|
});
|
|
}
|
|
};
|