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