trello-mcp-server
by v4lheru
Verified
- src
- services
/**
* Member Service
*
* Service for interacting with Trello members.
* Provides methods for retrieving and managing members.
*/
import { TrelloService } from './trello-service.js';
import { TrelloMember, TrelloBoard, TrelloCard } from '../types/trello-types.js';
/**
* Service for interacting with Trello members
*/
export class MemberService {
private trelloService: TrelloService;
/**
* Creates a new MemberService instance
* @param trelloService - The TrelloService instance
*/
constructor(trelloService: TrelloService) {
this.trelloService = trelloService;
}
/**
* Get the authenticated member (current user)
* @returns Promise resolving to the member
*/
async getMe(): Promise<TrelloMember> {
return this.trelloService.get<TrelloMember>('/members/me');
}
/**
* Get a specific member by ID or username
* @param memberIdOrUsername - ID or username of the member to retrieve
* @returns Promise resolving to the member
*/
async getMember(memberIdOrUsername: string): Promise<TrelloMember> {
return this.trelloService.get<TrelloMember>(`/members/${memberIdOrUsername}`);
}
/**
* Get boards that a member belongs to
* @param memberIdOrUsername - ID or username of the member
* @param filter - Optional filter (all, closed, members, open, organization, public, starred)
* @returns Promise resolving to an array of boards
*/
async getMemberBoards(
memberIdOrUsername: string,
filter: 'all' | 'closed' | 'members' | 'open' | 'organization' | 'public' | 'starred' = 'all'
): Promise<TrelloBoard[]> {
return this.trelloService.get<TrelloBoard[]>(`/members/${memberIdOrUsername}/boards`, { filter });
}
/**
* Get cards assigned to a member
* @param memberIdOrUsername - ID or username of the member
* @returns Promise resolving to an array of cards
*/
async getMemberCards(memberIdOrUsername: string): Promise<TrelloCard[]> {
return this.trelloService.get<TrelloCard[]>(`/members/${memberIdOrUsername}/cards`);
}
/**
* Get boards that a member has been invited to
* @param memberIdOrUsername - ID or username of the member
* @returns Promise resolving to an array of boards
*/
async getBoardsInvited(memberIdOrUsername: string): Promise<TrelloBoard[]> {
return this.trelloService.get<TrelloBoard[]>(`/members/${memberIdOrUsername}/boardsInvited`);
}
/**
* Get organizations that a member belongs to
* @param memberIdOrUsername - ID or username of the member
* @returns Promise resolving to an array of organizations
*/
async getMemberOrganizations(memberIdOrUsername: string): Promise<any[]> {
return this.trelloService.get<any[]>(`/members/${memberIdOrUsername}/organizations`);
}
/**
* Get notifications for the authenticated member
* @param filter - Optional filter for notification types
* @param readFilter - Optional filter for read status (all, read, unread)
* @param limit - Maximum number of notifications to return (max 1000)
* @returns Promise resolving to an array of notifications
*/
async getNotifications(
filter?: string,
readFilter: 'all' | 'read' | 'unread' = 'all',
limit: number = 50
): Promise<any[]> {
return this.trelloService.get<any[]>('/members/me/notifications', {
filter,
read_filter: readFilter,
limit: Math.min(limit, 1000)
});
}
/**
* Update the authenticated member's information
* @param data - Member update data
* @returns Promise resolving to the updated member
*/
async updateMe(data: {
fullName?: string;
initials?: string;
username?: string;
bio?: string;
avatarSource?: 'gravatar' | 'upload' | 'none';
prefs?: {
colorBlind?: boolean;
locale?: string;
minutesBetweenSummaries?: number;
};
}): Promise<TrelloMember> {
return this.trelloService.put<TrelloMember>('/members/me', data);
}
/**
* Get the authenticated member's avatar
* @param size - Size of the avatar (30, 50, 170, or original)
* @returns Promise resolving to the avatar URL
*/
async getAvatar(size: 30 | 50 | 170 | 'original' = 'original'): Promise<string> {
const me = await this.getMe();
if (!me.avatarUrl) {
throw new Error('Member does not have an avatar');
}
if (size === 'original') {
return me.avatarUrl;
}
// Construct URL for specific size
return `${me.avatarUrl}/${size}.png`;
}
/**
* Search for members by name
* @param query - Search query
* @param limit - Maximum number of results to return (max 20)
* @returns Promise resolving to an array of members
*/
async searchMembers(query: string, limit: number = 8): Promise<TrelloMember[]> {
return this.trelloService.get<TrelloMember[]>('/search/members', {
query,
limit: Math.min(limit, 20)
});
}
/**
* Get members of a board
* @param boardId - ID of the board
* @returns Promise resolving to an array of members
*/
async getBoardMembers(boardId: string): Promise<TrelloMember[]> {
return this.trelloService.get<TrelloMember[]>(`/boards/${boardId}/members`);
}
/**
* Get members of an organization
* @param organizationId - ID of the organization
* @returns Promise resolving to an array of members
*/
async getOrganizationMembers(organizationId: string): Promise<TrelloMember[]> {
return this.trelloService.get<TrelloMember[]>(`/organizations/${organizationId}/members`);
}
/**
* Get members assigned to a card
* @param cardId - ID of the card
* @returns Promise resolving to an array of members
*/
async getCardMembers(cardId: string): Promise<TrelloMember[]> {
return this.trelloService.get<TrelloMember[]>(`/cards/${cardId}/members`);
}
}