@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.
193 lines (192 loc) • 7.21 kB
JavaScript
import { BaseService } from "./base.service.js";
import { createSuccessResponse, createErrorResponse, formatError } from "../utils/responses.js";
export class TeamService extends BaseService {
constructor() {
super();
}
async list() {
try {
const teams = await this.client.teams.list();
const personalTeams = teams.filter(team => team.isPersonal);
const organizationTeams = teams.filter(team => !team.isPersonal);
return createSuccessResponse({
text: `Found ${teams.length} teams (${personalTeams.length} personal, ${organizationTeams.length} organizations)`,
data: {
totalCount: teams.length,
personalCount: personalTeams.length,
organizationCount: organizationTeams.length,
teams: teams.map(team => ({
id: team.id,
name: team.name,
type: team.isPersonal ? 'Personal' : 'Organization',
avatar: team.avatar,
createdAt: team.createdAt
}))
}
});
}
catch (error) {
return createErrorResponse(`Failed to list teams: ${formatError(error)}`);
}
}
async get(teamId) {
try {
const team = await this.client.teams.get(teamId);
const members = await this.client.teams.getMembers(teamId);
return createSuccessResponse({
text: `Retrieved team "${team.name}" with ${members.length} members`,
data: {
id: team.id,
name: team.name,
type: team.isPersonal ? 'Personal' : 'Organization',
avatar: team.avatar,
createdAt: team.createdAt,
updatedAt: team.updatedAt,
memberCount: members.length,
members: members.map(member => ({
id: member.id,
name: member.name,
email: member.email,
role: member.role,
joinedAt: member.joinedAt
}))
}
});
}
catch (error) {
return createErrorResponse(`Failed to get team: ${formatError(error)}`);
}
}
async create(name, avatar) {
try {
const team = await this.client.teams.create({ name, avatar });
return createSuccessResponse({
text: `Team "${team.name}" created successfully`,
data: {
id: team.id,
name: team.name,
type: team.isPersonal ? 'Personal' : 'Organization',
avatar: team.avatar,
createdAt: team.createdAt
}
});
}
catch (error) {
return createErrorResponse(`Failed to create team: ${formatError(error)}`);
}
}
async update(teamId, name, avatar) {
try {
const team = await this.client.teams.update(teamId, { name, avatar });
return createSuccessResponse({
text: `Team updated successfully`,
data: {
id: team.id,
name: team.name,
avatar: team.avatar,
updatedAt: team.updatedAt
}
});
}
catch (error) {
return createErrorResponse(`Failed to update team: ${formatError(error)}`);
}
}
async delete(teamId) {
try {
const success = await this.client.teams.delete(teamId);
if (success) {
return createSuccessResponse({
text: "Team deleted successfully"
});
}
else {
return createErrorResponse("Failed to delete team");
}
}
catch (error) {
return createErrorResponse(`Failed to delete team: ${formatError(error)}`);
}
}
async invite(teamId, email, role) {
try {
const invite = await this.client.teams.invite(teamId, { email, role });
return createSuccessResponse({
text: `Invitation sent to ${email} as ${role}`,
data: {
id: invite.id,
email: invite.email,
role: invite.role,
createdAt: invite.createdAt,
expiresAt: invite.expiresAt
}
});
}
catch (error) {
return createErrorResponse(`Failed to send team invitation: ${formatError(error)}`);
}
}
async removeMember(teamId, userId) {
try {
const success = await this.client.teams.removeMember(teamId, userId);
if (success) {
return createSuccessResponse({
text: "Member removed from team successfully"
});
}
else {
return createErrorResponse("Failed to remove member from team");
}
}
catch (error) {
return createErrorResponse(`Failed to remove team member: ${formatError(error)}`);
}
}
async updateMemberRole(teamId, userId, role) {
try {
const member = await this.client.teams.updateMemberRole(teamId, userId, role);
return createSuccessResponse({
text: `Updated ${member.name}'s role to ${role}`,
data: {
id: member.id,
name: member.name,
email: member.email,
role: member.role
}
});
}
catch (error) {
return createErrorResponse(`Failed to update member role: ${formatError(error)}`);
}
}
async getMembers(teamId) {
try {
const members = await this.client.teams.getMembers(teamId);
const roleGroups = members.reduce((acc, member) => {
if (!acc[member.role])
acc[member.role] = [];
acc[member.role].push(member);
return acc;
}, {});
return createSuccessResponse({
text: `Team has ${members.length} members`,
data: {
totalCount: members.length,
byRole: roleGroups,
members: members.map(member => ({
id: member.id,
name: member.name,
email: member.email,
role: member.role,
joinedAt: member.joinedAt,
avatar: member.avatar
}))
}
});
}
catch (error) {
return createErrorResponse(`Failed to get team members: ${formatError(error)}`);
}
}
}
export const teamService = new TeamService();