import type { CallToolRequest } from '@modelcontextprotocol/sdk/types.js';
import { DatabaseManager } from './databaseManager.js';
import type { DatabaseConfig } from './type.js';
export async function handleToolCall(
request: CallToolRequest,
dbManager: DatabaseManager
) {
const { name, arguments: args } = request.params;
if (!args) {
return { content: [{ type: 'text', text: 'Missing arguments' }], isError: true };
}
try {
switch (name) {
case 'connect_database':
await dbManager.connect(args.connectionId as string, {
type: args.type as DatabaseConfig['type'],
host: args.host as string,
port: args.port as number,
database: args.database as string,
username: args.username as string,
password: args.password as string,
filename: args.filename as string,
ssl: args.ssl as boolean,
trustServerCertificate: args.trustServerCertificate as boolean
});
return {
content: [{
type: 'text' as const,
text: `Successfully connected to ${args.type} database with ID: ${args.connectionId}`
}]
};
case 'execute_query':
const result = await dbManager.executeQuery(
args.connectionId as string,
args.query as string,
(args.parameters as any[]) || []
);
return {
content: [{
type: 'text' as const,
text: JSON.stringify(result, null, 2)
}]
};
case 'get_table_schema':
const schema = await dbManager.getTableSchema(
args.connectionId as string,
args.tableName as string
);
return {
content: [{
type: 'text' as const,
text: JSON.stringify(schema, null, 2)
}]
};
case 'list_connections':
const connections = dbManager.getConnectionInfo();
return {
content: [{
type: 'text' as const,
text: JSON.stringify(connections, null, 2)
}]
};
case 'disconnect_database':
await dbManager.disconnect(args.connectionId as string);
return {
content: [{
type: 'text' as const,
text: `Disconnected from database: ${args.connectionId}`
}]
};
default:
throw new Error(`Unknown tool: ${name}`);
}
} catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
return {
content: [{
type: 'text' as const,
text: `Error: ${errorMessage}`
}],
isError: true
};
}
}