mirror of
https://github.com/samanhappy/mcphub.git
synced 2025-12-24 02:39:19 -05:00
feat: Implement tool management features including tool execution and result handling (#152)
This commit is contained in:
86
src/controllers/toolController.ts
Normal file
86
src/controllers/toolController.ts
Normal file
@@ -0,0 +1,86 @@
|
||||
import { Request, Response } from 'express';
|
||||
import { ApiResponse } from '../types/index.js';
|
||||
import { handleCallToolRequest } from '../services/mcpService.js';
|
||||
|
||||
/**
|
||||
* Interface for tool call request
|
||||
*/
|
||||
export interface ToolCallRequest {
|
||||
toolName: string;
|
||||
arguments?: Record<string, any>;
|
||||
}
|
||||
|
||||
/**
|
||||
* Interface for tool search request
|
||||
*/
|
||||
export interface ToolSearchRequest {
|
||||
query: string;
|
||||
limit?: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Interface for tool call result
|
||||
*/
|
||||
interface ToolCallResult {
|
||||
content?: Array<{
|
||||
type: string;
|
||||
text?: string;
|
||||
[key: string]: any;
|
||||
}>;
|
||||
isError?: boolean;
|
||||
[key: string]: any;
|
||||
}
|
||||
|
||||
/**
|
||||
* Call a specific tool with given arguments
|
||||
*/
|
||||
export const callTool = async (req: Request, res: Response): Promise<void> => {
|
||||
try {
|
||||
const { server } = req.params;
|
||||
const { toolName, arguments: toolArgs = {} } = req.body as ToolCallRequest;
|
||||
|
||||
if (!toolName) {
|
||||
res.status(400).json({
|
||||
success: false,
|
||||
message: 'toolName is required',
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// Create a mock request structure for handleCallToolRequest
|
||||
const mockRequest = {
|
||||
params: {
|
||||
name: 'call_tool',
|
||||
arguments: {
|
||||
toolName,
|
||||
arguments: toolArgs,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
const extra = {
|
||||
sessionId: req.headers['x-session-id'] || 'api-session',
|
||||
server: server || undefined,
|
||||
};
|
||||
|
||||
const result = (await handleCallToolRequest(mockRequest, extra)) as ToolCallResult;
|
||||
|
||||
const response: ApiResponse = {
|
||||
success: true,
|
||||
data: {
|
||||
content: result.content || [],
|
||||
toolName,
|
||||
arguments: toolArgs,
|
||||
},
|
||||
};
|
||||
|
||||
res.json(response);
|
||||
} catch (error) {
|
||||
console.error('Error calling tool:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: 'Failed to call tool',
|
||||
error: error instanceof Error ? error.message : 'Unknown error occurred',
|
||||
});
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user