UNPKG

@jorgeceballos/mcp-server-oci

Version:

Model Context Protocol server for Oracle Cloud Infrastructure

197 lines (196 loc) 9.26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.startServer = startServer; const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js"); const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js"); const zod_1 = require("zod"); const oci_tools_1 = require("../tools/oci-tools"); async function startServer(port = 3000, profileName = 'DEFAULT') { // Configuración para el modo Claude Desktop const isCloudeDesktop = process.env.CLAUDE_DESKTOP === 'true'; const showLogs = !isCloudeDesktop; try { // Initialize OCI tools const ociTools = new oci_tools_1.OCITools(profileName); // Create MCP server const server = new mcp_js_1.McpServer({ name: 'OCI Server', version: '1.0.0' }); // Register tools with the server // Para simplificar, vamos a implementar directamente las herramientas sin usar getAllTools() // Herramienta list_compartments server.tool('list_compartments', 'Lists all compartments available in your Oracle Cloud Infrastructure account', async (extra) => { try { const compartments = await ociTools.ociClient.listCompartments(); return { content: [{ text: JSON.stringify(compartments.map(compartment => ({ id: compartment.id, name: compartment.name, description: compartment.description, timeCreated: compartment.timeCreated })), null, 2), type: "text" }] }; } catch (error) { // Only log errors if not running in Claude Desktop mode if (process.env.CLAUDE_DESKTOP !== 'true') { console.error('Error in list_compartments tool:', error); } throw error; } }); // Herramienta list_instances server.tool('list_instances', { compartmentId: zod_1.z.string().describe('The OCID of the compartment to list instances from') }, async (args, extra) => { try { const instances = await ociTools.ociClient.listInstances(args.compartmentId); return { content: [{ text: JSON.stringify(instances.map(instance => ({ id: instance.id, displayName: instance.displayName, shape: instance.shape, lifecycleState: instance.lifecycleState, timeCreated: instance.timeCreated, availabilityDomain: instance.availabilityDomain, faultDomain: instance.faultDomain })), null, 2), type: "text" }] }; } catch (error) { // Only log errors if not running in Claude Desktop mode if (process.env.CLAUDE_DESKTOP !== 'true') { console.error('Error in list_instances tool:', error); } throw error; } }); // Herramienta get_instance server.tool('get_instance', { instanceId: zod_1.z.string().describe('The OCID of the instance to get details for') }, async (args, extra) => { try { const instance = await ociTools.ociClient.getInstance(args.instanceId); return { content: [{ text: JSON.stringify({ id: instance.id, displayName: instance.displayName, shape: instance.shape, lifecycleState: instance.lifecycleState, timeCreated: instance.timeCreated, availabilityDomain: instance.availabilityDomain, faultDomain: instance.faultDomain, region: instance.region, shape_config: instance.shapeConfig, metadata: instance.metadata, freeformTags: instance.freeformTags, definedTags: instance.definedTags }, null, 2), type: "text" }] }; } catch (error) { // Only log errors if not running in Claude Desktop mode if (process.env.CLAUDE_DESKTOP !== 'true') { console.error('Error in get_instance tool:', error); } throw error; } }); // Herramienta start_instance server.tool('start_instance', { instanceId: zod_1.z.string().describe('The OCID of the instance to start') }, async (args, extra) => { try { await ociTools.ociClient.startInstance(args.instanceId); return { content: [{ text: `Instance ${args.instanceId} started successfully`, type: "text" }] }; } catch (error) { // Only log errors if not running in Claude Desktop mode if (process.env.CLAUDE_DESKTOP !== 'true') { console.error('Error in start_instance tool:', error); } throw error; } }); // Herramienta stop_instance server.tool('stop_instance', { instanceId: zod_1.z.string().describe('The OCID of the instance to stop') }, async (args, extra) => { try { await ociTools.ociClient.stopInstance(args.instanceId); return { content: [{ text: `Instance ${args.instanceId} stopped successfully`, type: "text" }] }; } catch (error) { // Only log errors if not running in Claude Desktop mode if (process.env.CLAUDE_DESKTOP !== 'true') { console.error('Error in stop_instance tool:', error); } throw error; } }); // Herramienta restart_instance server.tool('restart_instance', { instanceId: zod_1.z.string().describe('The OCID of the instance to restart') }, async (args, extra) => { try { await ociTools.ociClient.restartInstance(args.instanceId); return { content: [{ text: `Instance ${args.instanceId} restarted successfully`, type: "text" }] }; } catch (error) { // Only log errors if not running in Claude Desktop mode if (process.env.CLAUDE_DESKTOP !== 'true') { console.error('Error in restart_instance tool:', error); } throw error; } }); // Obtener lista de herramientas para mostrar const toolsList = [ { name: 'list_compartments', description: 'Lists all compartments available in your Oracle Cloud Infrastructure account' }, { name: 'list_instances', description: 'Lists all compute instances in a specific compartment' }, { name: 'get_instance', description: 'Gets detailed information about a specific compute instance' }, { name: 'start_instance', description: 'Starts a stopped compute instance' }, { name: 'stop_instance', description: 'Stops a running compute instance' }, { name: 'restart_instance', description: 'Restarts a running compute instance' } ]; // Create stdio transport for command-line interface const transport = new stdio_js_1.StdioServerTransport(); // Solo registrar logs si no estamos en modo Claude Desktop if (showLogs) { // Log server info console.log(`MCP OCI server preparing to start on port ${port}`); console.log(`OCI profile: ${profileName}`); console.log('Available tools:'); toolsList.forEach(tool => { console.log(`- ${tool.name}: ${tool.description}`); }); } // Connect the server to the transport await server.connect(transport); if (showLogs) { console.log('MCP OCI server started successfully'); } } catch (error) { // Only log errors if not running in Claude Desktop mode if (!isCloudeDesktop) { console.error('Failed to start MCP server:', error); } throw error; } }