UNPKG

@mseep/railway-mcp

Version:

Model Context Protocol server for Railway.app - Enables AI agents to manage Railway infrastructure through natural language

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); } }