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.

221 lines (220 loc) 5.53 kB
export class ProjectRepository { client; constructor(client) { this.client = client; } async listProjects() { const data = await this.client.request(` query projects { projects { edges { node { id name description environments { edges { node { id name } } } services { edges { node { id name } } } teamId baseEnvironmentId createdAt updatedAt deletedAt expiredAt isPublic isTempProject prDeploys prEnvCopyVolData botPrEnvironments subscriptionType subscriptionPlanLimit } } } } `); return data.projects.edges.map(edge => ({ ...edge.node, environments: edge.node.environments || { edges: [], pageInfo: { hasNextPage: false, hasPreviousPage: false } }, services: edge.node.services || { edges: [], pageInfo: { hasNextPage: false, hasPreviousPage: false } } })); } async getProject(projectId) { const data = await this.client.request(` query project($projectId: String!) { project(id: $projectId) { id name description environments { edges { node { id name projectId createdAt updatedAt deletedAt isEphemeral unmergedChangesCount } } pageInfo { hasNextPage hasPreviousPage startCursor endCursor } } services { edges { node { id name projectId createdAt updatedAt deletedAt icon templateServiceId templateThreadSlug featureFlags } } pageInfo { hasNextPage hasPreviousPage startCursor endCursor } } teamId baseEnvironmentId createdAt updatedAt deletedAt expiredAt isPublic isTempProject prDeploys prEnvCopyVolData botPrEnvironments subscriptionType subscriptionPlanLimit } } `, { projectId }); if (!data.project) { return null; } return data.project; } async createProject(name, teamId) { const data = await this.client.request(` mutation projectCreate($name: String!, $teamId: String) { projectCreate( input: { name: $name, teamId: $teamId }) { id name description environments { edges { node { id name } } pageInfo { hasNextPage hasPreviousPage } } services { edges { node { id name } } pageInfo { hasNextPage hasPreviousPage } } } } `, { name, teamId }); return { ...data.projectCreate, environments: data.projectCreate.environments || { edges: [], pageInfo: { hasNextPage: false, hasPreviousPage: false } }, services: data.projectCreate.services || { edges: [], pageInfo: { hasNextPage: false, hasPreviousPage: false } } }; } async deleteProject(projectId) { await this.client.request(` mutation projectDelete($projectId: String!) { projectDelete(id: $projectId) } `, { projectId }); } async listEnvironments(projectId) { const data = await this.client.request(` query environments($projectId: String!) { environments(projectId: $projectId) { edges { node { id name projectId createdAt updatedAt deletedAt isEphemeral unmergedChangesCount } } } } `, { projectId }); return data.environments.edges.map(edge => edge.node); } async listServices(projectId) { const data = await this.client.request(` query services($projectId: String!) { services(projectId: $projectId) { edges { node { id name projectId createdAt updatedAt deletedAt icon templateServiceId templateThreadSlug featureFlags } } } } `, { projectId }); return data.services.edges.map(edge => edge.node); } }