@jorgeceballos/mcp-server-oci
Version:
Model Context Protocol server for Oracle Cloud Infrastructure
190 lines (166 loc) • 6.05 kB
JavaScript
// 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);
});