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