@edicarlos.lds/businessmap-mcp
Version:
Model Context Protocol server for BusinessMap (Kanbanize) integration
263 lines • 9.54 kB
JavaScript
import { BaseClientModuleImpl } from './base-client.js';
export class CardClient extends BaseClientModuleImpl {
/**
* Get cards from a board with optional filters
*/
async getCards(boardId, filters) {
const params = { board_id: boardId, ...filters };
const response = await this.http.get('/cards', { params });
return response.data.data;
}
/**
* Get a specific card by ID
*/
async getCard(cardId) {
const response = await this.http.get(`/cards/${cardId}`);
return response.data.data;
}
/**
* Create a new card
*/
async createCard(params) {
this.checkReadOnlyMode('create card');
const response = await this.http.post('/cards', params);
return response.data.data;
}
/**
* Update an existing card
*/
async updateCard(params) {
this.checkReadOnlyMode('update card');
const { card_id, ...updateData } = params;
const response = await this.http.patch(`/cards/${card_id}`, updateData);
return response.data.data;
}
/**
* Move a card to a different column or lane
*/
async moveCard(cardId, columnId, laneId, position) {
this.checkReadOnlyMode('move card');
const response = await this.http.patch(`/cards/${cardId}`, {
column_id: columnId,
lane_id: laneId,
position: position,
});
return response.data.data;
}
/**
* Delete a card
*/
async deleteCard(cardId) {
this.checkReadOnlyMode('delete card');
await this.http.delete(`/cards/${cardId}`);
}
/**
* Get comments for a specific card
*/
async getCardComments(cardId) {
const response = await this.http.get(`/cards/${cardId}/comments`);
return response.data.data;
}
/**
* Get details of a specific comment
*/
async getCardComment(cardId, commentId) {
const response = await this.http.get(`/cards/${cardId}/comments/${commentId}`);
return response.data.data;
}
/**
* Get custom fields for a specific card
*/
async getCardCustomFields(cardId) {
const response = await this.http.get(`/cards/${cardId}/customFields`);
return response.data.data;
}
/**
* Get all card types
*/
async getCardTypes() {
const response = await this.http.get('/cardTypes');
return response.data.data;
}
/**
* Get card outcome history
*/
async getCardHistory(cardId, outcomeId) {
const response = await this.http.get(`/cards/${cardId}/outcomes/${outcomeId}/history`);
return response.data.data;
}
/**
* Get card outcomes
*/
async getCardOutcomes(cardId) {
const response = await this.http.get(`/cards/${cardId}/outcomes`);
return response.data.data;
}
/**
* Get linked cards for a specific card
*/
async getCardLinkedCards(cardId) {
const response = await this.http.get(`/cards/${cardId}/linkedCards`);
return response.data.data;
}
/**
* Get subtasks for a specific card
*/
async getCardSubtasks(cardId) {
const response = await this.http.get(`/cards/${cardId}/subtasks`);
return response.data.data;
}
/**
* Get details of a specific subtask
*/
async getCardSubtask(cardId, subtaskId) {
const response = await this.http.get(`/cards/${cardId}/subtasks/${subtaskId}`);
return response.data.data;
}
/**
* Create a new subtask for a card
*/
async createCardSubtask(cardId, params) {
this.checkReadOnlyMode('create subtask');
const response = await this.http.post(`/cards/${cardId}/subtasks`, params);
return response.data.data;
}
/**
* Get parent cards for a specific card
*/
async getCardParents(cardId) {
const response = await this.http.get(`/cards/${cardId}/parents`);
return response.data.data;
}
/**
* Check if a card is a parent of a given card
*/
async getCardParent(cardId, parentCardId) {
const response = await this.http.get(`/cards/${cardId}/parents/${parentCardId}`);
return response.data.data;
}
/**
* Make a card a parent of a given card
*/
async addCardParent(cardId, parentCardId) {
this.checkReadOnlyMode('add card parent');
const response = await this.http.put(`/cards/${cardId}/parents/${parentCardId}`);
return response.data.data;
}
/**
* Remove the link between a child card and a parent card
*/
async removeCardParent(cardId, parentCardId) {
this.checkReadOnlyMode('remove card parent');
await this.http.delete(`/cards/${cardId}/parents/${parentCardId}`);
}
/**
* Get parent graph for a specific card (including parent's parents)
*/
async getCardParentGraph(cardId) {
const response = await this.http.get(`/cards/${cardId}/parentGraph`);
return response.data.data;
}
/**
* Get child cards for a specific card
*/
async getCardChildren(cardId) {
const response = await this.http.get(`/cards/${cardId}/children`);
return response.data.data;
}
// ─── Block / Unblock ────────────────────────────────────────────────────────
/**
* Block a card with a reason comment
*/
async blockCard(cardId, reason) {
this.checkReadOnlyMode('block card');
await this.http.put(`/cards/${cardId}/blockReason`, { comment: reason });
}
/**
* Unblock a card by removing its block reason
*/
async unblockCard(cardId) {
this.checkReadOnlyMode('unblock card');
await this.http.delete(`/cards/${cardId}/blockReason`);
}
// ─── Comments ───────────────────────────────────────────────────────────────
/**
* Create a new comment on a card
*/
async createCardComment(cardId, params) {
this.checkReadOnlyMode('create comment');
const response = await this.http.post(`/cards/${cardId}/comments`, params);
return response.data.data;
}
/**
* Update an existing comment on a card
*/
async updateCardComment(cardId, commentId, params) {
this.checkReadOnlyMode('update comment');
const response = await this.http.patch(`/cards/${cardId}/comments/${commentId}`, params);
return response.data.data;
}
/**
* Delete a comment from a card
*/
async deleteCardComment(cardId, commentId) {
this.checkReadOnlyMode('delete comment');
await this.http.delete(`/cards/${cardId}/comments/${commentId}`);
}
// ─── Tags ────────────────────────────────────────────────────────────────────
/**
* Create a new tag
*/
async createTag(params) {
this.checkReadOnlyMode('create tag');
const response = await this.http.post('/tags', params);
return response.data.data;
}
/**
* Add a tag to a card
*/
async addTagToCard(cardId, tagId) {
this.checkReadOnlyMode('add tag to card');
await this.http.put(`/cards/${cardId}/tags/${tagId}`);
}
/**
* Remove a tag from a card
*/
async removeTagFromCard(cardId, tagId) {
this.checkReadOnlyMode('remove tag from card');
await this.http.delete(`/cards/${cardId}/tags/${tagId}`);
}
// ─── Stickers ───────────────────────────────────────────────────────────────
/**
* Add a sticker to a card
*/
async addStickerToCard(cardId, stickerId) {
this.checkReadOnlyMode('add sticker to card');
const params = { sticker_id: stickerId };
const response = await this.http.post(`/cards/${cardId}/stickers`, params);
return response.data.data;
}
/**
* Remove a sticker from a card (sticker_card_id is the association ID, not sticker_id)
*/
async removeStickerFromCard(cardId, stickerCardId) {
this.checkReadOnlyMode('remove sticker from card');
await this.http.delete(`/cards/${cardId}/stickers/${stickerCardId}`);
}
// ─── Predecessors ────────────────────────────────────────────────────────────
/**
* Add or update a predecessor relationship between two cards
*/
async addPredecessor(cardId, predecessorCardId, params) {
this.checkReadOnlyMode('add predecessor');
await this.http.put(`/cards/${cardId}/predecessors/${predecessorCardId}`, params || {});
}
/**
* Remove the predecessor relationship between two cards
*/
async removePredecessor(cardId, predecessorCardId) {
this.checkReadOnlyMode('remove predecessor');
await this.http.delete(`/cards/${cardId}/predecessors/${predecessorCardId}`);
}
}
//# sourceMappingURL=card-client.js.map