UNPKG

@jorgeceballos/mcp-server-oci

Version:

Model Context Protocol server for Oracle Cloud Infrastructure

190 lines (166 loc) 6.05 kB
#!/usr/bin/env node // Servidor MCP-OCI limpio para Claude Desktop // Este script proporciona un transporte STDIO limpio sin mensajes de log interferentes const { McpServer } = require('@modelcontextprotocol/sdk/server/mcp.js'); const { StdioServerTransport } = require('@modelcontextprotocol/sdk/server/stdio.js'); const { z } = require('zod'); const fs = require('fs'); // Redirigir todos los logs a un archivo de log en lugar de stdout/stderr const logFile = '/Users/jocebal/Work/mcp-oci-server/claude-desktop.log'; // Sobrescribir console.log y console.error para que no interfieran con STDIO const originalConsoleLog = console.log; const originalConsoleError = console.error; // Redefinir console.log para que escriba en un archivo en lugar de stdout console.log = function() { const args = Array.from(arguments); const message = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg) ).join(' '); try { fs.appendFileSync(logFile, `[LOG] ${new Date().toISOString()} ${message}\n`); } catch (err) { // No podemos hacer mucho aquí, ya que un error en la redirección de logs // no debería romper la funcionalidad principal } }; // Redefinir console.error para que escriba en un archivo en lugar de stderr console.error = function() { const args = Array.from(arguments); const message = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg) ).join(' '); try { fs.appendFileSync(logFile, `[ERROR] ${new Date().toISOString()} ${message}\n`); } catch (err) { // Igual que arriba } }; // Limpiar el archivo de log al inicio try { fs.writeFileSync(logFile, `[START] ${new Date().toISOString()} Iniciando servidor MCP-OCI para Claude Desktop\n`); } catch (err) { // Si no podemos escribir el log, continuamos de todas formas } // Aquí necesitamos importar tu cliente OCI y todas las herramientas // Esto es solo un placeholder, deberás adaptarlo a tu código real class OCIClient { constructor(profileName) { this.profileName = profileName; console.log(`Inicializando cliente OCI con perfil: ${profileName}`); } async listCompartments() { console.log('Listando compartments'); // Reemplaza esto con tu implementación real return [ { id: "ocid1.compartment.oc1..example1", name: "Compartment1", description: "Description for Compartment1", timeCreated: new Date().toISOString() } ]; } async listInstances(compartmentId) { console.log(`Listando instancias en compartment: ${compartmentId}`); // Reemplaza esto con tu implementación real return [ { id: "ocid1.instance.oc1..example1", displayName: "Instance1", shape: "VM.Standard2.1", lifecycleState: "RUNNING", timeCreated: new Date().toISOString(), availabilityDomain: "ABcd:US-ASHBURN-AD-1", faultDomain: "FAULT-DOMAIN-1" } ]; } // Implementa otros métodos según sea necesario } // Iniciar el servidor async function startServer() { try { console.log("Iniciando servidor MCP-OCI para Claude Desktop"); // Inicializar cliente OCI const ociClient = new OCIClient('DEFAULT'); // Crear servidor MCP const server = new McpServer({ name: 'OCI Server', version: '1.0.0' }); // Registrar herramientas con el servidor // Herramienta list_compartments server.tool( 'list_compartments', 'Lists all compartments available in your Oracle Cloud Infrastructure account', async (extra) => { try { const compartments = await 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) { console.error('Error en herramienta list_compartments:', error); throw error; } } ); // Herramienta list_instances server.tool( 'list_instances', { compartmentId: z.string().describe('The OCID of the compartment to list instances from') }, async (args, extra) => { try { const instances = await 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) { console.error('Error en herramienta list_instances:', error); throw error; } } ); // Añade el resto de tus herramientas aquí... // Crear transporte STDIO para la comunicación const transport = new StdioServerTransport(); console.log("Transporte STDIO creado, conectando servidor..."); // Conectar el servidor al transporte await server.connect(transport); console.log("Servidor MCP-OCI conectado y listo para recibir comandos"); } catch (error) { console.error('Error al iniciar el servidor:', error); // No usamos process.exit() para evitar cerrar el proceso si hay un error recuperable } } // Iniciar el servidor startServer().catch(error => { console.error('Error fatal en el servidor:', error); });