import type { Tool } from '@modelcontextprotocol/sdk/types.js';
import { AWSAdapter } from '../adapters/aws-adapter.js';
import { AzureAdapter } from '../adapters/azure-adapter.js';
import { GCPAdapter } from '../adapters/gcp-adapter.js';
import type { CloudProvider } from '../types/index.js';
import { Validators } from '../utils/validators.js';
export const resourceManagementTools: Tool[] = [
{
name: 'list_resources',
description: 'List cloud resources (instances, storage, databases, functions) across AWS, Azure, or GCP',
inputSchema: {
type: 'object',
properties: {
provider: {
type: 'string',
enum: ['aws', 'azure', 'gcp'],
description: 'Cloud provider',
},
type: {
type: 'string',
enum: ['instance', 'storage', 'database', 'function', 'all'],
description: 'Resource type to list',
default: 'all',
},
region: {
type: 'string',
description: 'Region to filter resources',
},
},
required: ['provider'],
},
},
{
name: 'get_resource',
description: 'Get detailed information about a specific resource',
inputSchema: {
type: 'object',
properties: {
provider: {
type: 'string',
enum: ['aws', 'azure', 'gcp'],
description: 'Cloud provider',
},
resourceId: {
type: 'string',
description: 'Resource ID',
},
resourceType: {
type: 'string',
enum: ['instance', 'storage', 'database', 'function'],
description: 'Resource type',
},
},
required: ['provider', 'resourceId', 'resourceType'],
},
},
{
name: 'start_resource',
description: 'Start a cloud resource (instance, function, etc.)',
inputSchema: {
type: 'object',
properties: {
provider: {
type: 'string',
enum: ['aws', 'azure', 'gcp'],
description: 'Cloud provider',
},
resourceId: {
type: 'string',
description: 'Resource ID to start',
},
resourceType: {
type: 'string',
enum: ['instance', 'function'],
description: 'Resource type',
},
},
required: ['provider', 'resourceId', 'resourceType'],
},
},
{
name: 'stop_resource',
description: 'Stop a cloud resource',
inputSchema: {
type: 'object',
properties: {
provider: {
type: 'string',
enum: ['aws', 'azure', 'gcp'],
description: 'Cloud provider',
},
resourceId: {
type: 'string',
description: 'Resource ID to stop',
},
resourceType: {
type: 'string',
enum: ['instance', 'function'],
description: 'Resource type',
},
},
required: ['provider', 'resourceId', 'resourceType'],
},
},
{
name: 'delete_resource',
description: 'Delete a cloud resource (use with caution)',
inputSchema: {
type: 'object',
properties: {
provider: {
type: 'string',
enum: ['aws', 'azure', 'gcp'],
description: 'Cloud provider',
},
resourceId: {
type: 'string',
description: 'Resource ID to delete',
},
resourceType: {
type: 'string',
enum: ['instance', 'storage', 'database', 'function'],
description: 'Resource type',
},
confirm: {
type: 'boolean',
description: 'Confirmation required for deletion',
default: false,
},
},
required: ['provider', 'resourceId', 'resourceType', 'confirm'],
},
},
];
export async function handleResourceManagementTool(name: string, args: unknown): Promise<unknown> {
const params = args as Record<string, unknown>;
const provider = params.provider as CloudProvider;
if (!Validators.isValidProvider(provider)) {
throw new Error('Invalid cloud provider');
}
switch (name) {
case 'list_resources': {
const resourceType = (params.type as string) || 'all';
const region = params.region as string;
if (provider === 'aws') {
const adapter = new AWSAdapter(region);
const results: Record<string, unknown[]> = {};
if (resourceType === 'all' || resourceType === 'instance') {
results.instances = await adapter.listEC2Instances();
}
if (resourceType === 'all' || resourceType === 'storage') {
results.storage = await adapter.listS3Buckets();
}
if (resourceType === 'all' || resourceType === 'function') {
results.functions = await adapter.listLambdaFunctions();
}
if (resourceType === 'all' || resourceType === 'database') {
results.databases = await adapter.listRDSInstances();
}
return results;
} else if (provider === 'azure') {
const adapter = new AzureAdapter(undefined, region);
const results: Record<string, unknown[]> = {};
if (resourceType === 'all' || resourceType === 'instance') {
results.instances = await adapter.listVirtualMachines();
}
if (resourceType === 'all' || resourceType === 'storage') {
results.storage = await adapter.listStorageAccounts();
}
return results;
} else if (provider === 'gcp') {
const adapter = new GCPAdapter(undefined, region);
const results: Record<string, unknown[]> = {};
if (resourceType === 'all' || resourceType === 'instance') {
results.instances = await adapter.listComputeInstances();
}
if (resourceType === 'all' || resourceType === 'storage') {
results.storage = await adapter.listStorageBuckets();
}
if (resourceType === 'all' || resourceType === 'function') {
results.functions = await adapter.listCloudFunctions();
}
return results;
}
throw new Error(`Unsupported provider: ${provider}`);
}
case 'start_resource': {
const resourceId = params.resourceId as string;
const resourceType = params.resourceType as string;
if (provider === 'aws' && resourceType === 'instance') {
const adapter = new AWSAdapter();
await adapter.startEC2Instance(resourceId);
return { success: true, message: `Instance ${resourceId} started` };
}
throw new Error(`Start operation not yet implemented for ${provider} ${resourceType}`);
}
case 'stop_resource': {
const resourceId = params.resourceId as string;
const resourceType = params.resourceType as string;
if (provider === 'aws' && resourceType === 'instance') {
const adapter = new AWSAdapter();
await adapter.stopEC2Instance(resourceId);
return { success: true, message: `Instance ${resourceId} stopped` };
}
throw new Error(`Stop operation not yet implemented for ${provider} ${resourceType}`);
}
case 'delete_resource': {
const resourceId = params.resourceId as string;
const confirm = params.confirm as boolean;
if (!confirm) {
throw new Error('Deletion requires confirmation. Set confirm=true');
}
// Implementation would go here
return { success: true, message: `Resource ${resourceId} deletion initiated` };
}
case 'get_resource': {
const resourceId = params.resourceId as string;
// Implementation would fetch detailed resource info
return {
id: resourceId,
provider,
message: 'Detailed resource information retrieval not yet fully implemented',
};
}
default:
throw new Error(`Unknown tool: ${name}`);
}
}