UNPKG

@crazyrabbitltc/railway-mcp

Version:

Railway MCP Server - 146+ tools with 100% Railway API coverage, comprehensive MCP testing framework, and real infrastructure management through AI assistants. Enhanced version with enterprise features, based on original work by Jason Tan.

103 lines (102 loc) 3.84 kB
import { BaseService } from './base.service.js'; import { createSuccessResponse, createErrorResponse, formatError } from '../utils/responses.js'; class VolumeService extends BaseService { constructor() { super(); } /** * List all volumes in a project * * @param projectId ID of the project * @returns CallToolResult with formatted response */ async listVolumes(projectId) { try { const volumes = await this.client.volumes.listVolumes(projectId); if (volumes.length === 0) { return createSuccessResponse({ text: "No volumes found in this project.", data: [] }); } const volumeDetails = volumes.map(volume => `📦 ${volume.name} (ID: ${volume.id}) Created: ${volume.createdAt ? new Date(volume.createdAt).toLocaleString() : 'N/A'}`); return createSuccessResponse({ text: `Volumes in project:\n\n${volumeDetails.join('\n\n')}`, data: volumes }); } catch (error) { return createErrorResponse(`Error listing volumes: ${formatError(error)}`); } } /** * Create a new volume in a project * * @param projectId ID of the project where the volume will be created * @param serviceId ID of the service to attach the volume to * @param environmentId ID of the environment to create the volume in * @param mountPath Path to mount the volume on * @returns CallToolResult with formatted response */ async createVolume(projectId, serviceId, environmentId, mountPath) { try { const input = { projectId, serviceId, environmentId, mountPath, name: 'volume-' + Date.now() }; const volume = await this.client.volumes.createVolume(input); if (!volume) { return createErrorResponse(`Error creating volume: Failed to create volume for ${serviceId} in environment ${environmentId}`); } return createSuccessResponse({ text: `✅ Volume "${volume.name}" created successfully (ID: ${volume.id})`, data: volume }); } catch (error) { return createErrorResponse(`Error creating volume: ${formatError(error)}`); } } /** * Update a volume * * @param volumeId ID of the volume to update * @param name New name for the volume * @returns CallToolResult with formatted response */ async updateVolume(volumeId, name) { try { const input = { name }; const volume = await this.client.volumes.updateVolume(volumeId, input); return createSuccessResponse({ text: `✅ Volume updated successfully to "${volume.name}" (ID: ${volume.id})`, data: volume }); } catch (error) { return createErrorResponse(`Error updating volume: ${formatError(error)}`); } } /** * Delete a volume * * @param volumeId ID of the volume to delete * @returns CallToolResult with formatted response */ async deleteVolume(volumeId) { try { const success = await this.client.volumes.deleteVolume(volumeId); if (success) { return createSuccessResponse({ text: "✅ Volume deleted successfully", data: { success } }); } else { return createErrorResponse("Failed to delete volume"); } } catch (error) { return createErrorResponse(`Error deleting volume: ${formatError(error)}`); } } } export const volumeService = new VolumeService();