mcp-clickup

import { ClickUpUser, ClickUpTask } from './type'; const BASE_URL = 'https://api.clickup.com/api/v2'; export class ClickUpClient { private headers: { Authorization: string; 'Content-Type': string }; private workspaceId: string; constructor(apiToken: string, workspaceId: string) { this.headers = { Authorization: apiToken, 'Content-Type': 'application/json', }; this.workspaceId = workspaceId; } private async request<T>( endpoint: string, options: RequestInit = {} ): Promise<T> { const response = await fetch(`${BASE_URL}${endpoint}`, { ...options, headers: this.headers, }); return response.json(); } async authenticate(): Promise<ClickUpUser> { return this.request<ClickUpUser>('/user'); } async getTask(taskId: string): Promise<ClickUpTask> { return this.request<ClickUpTask>( `/task/${taskId}?custom_task_ids=false&team_id=${this.workspaceId}&include_subtasks=true&include_markdown_description=true` ); } async getTaskByCustomId(customId: string): Promise<ClickUpTask> { return this.request<ClickUpTask>( `/task/${customId}?custom_task_ids=true&team_id=${this.workspaceId}&include_subtasks=true&include_markdown_description=true` ); } async getTasks(taskIds: string[]): Promise<{ tasks: ClickUpTask[] }> { const tasksUrl = `/team/${ this.workspaceId }/task?include_markdown_description=true&include_subtasks=true&${taskIds .map((id) => `task_ids=${id}`) .join('&')}`; return this.request<{ tasks: ClickUpTask[] }>(tasksUrl); } } export default ClickUpClient;