UNPKG

rework-mcp-server

Version:

Rework MCP Server - Integrate rework tasks with AI through Model Context Protocol

111 lines (110 loc) 4.99 kB
import { reworkProjectFetcher } from '../../../utils/api/fetcher.js'; import Responder from '../../../utils/responder.js'; /** * Tool definition for creating a single task */ import { z } from 'zod'; // Enum for task statuses based on the query conditions export var TaskStatus; (function (TaskStatus) { TaskStatus["ACTIVE"] = "active"; TaskStatus["DONE"] = "done"; TaskStatus["REVIEW"] = "review"; TaskStatus["TODO"] = "todo"; TaskStatus["DOING"] = "doing"; TaskStatus["DONELATE"] = "donelate"; TaskStatus["OVERDUE"] = "overdue"; TaskStatus["NOTREVIEW"] = "notreview"; TaskStatus["TODAY"] = "today"; // status=0 and deadline is today })(TaskStatus || (TaskStatus = {})); // Define the Zod schema for creating a task export const getTasksSchema = { q: z.string().optional().describe("Optional search query to filter tasks by name."), board_id: z.string().optional().describe("Optional ID of the board that the tasks belong to."), project_id: z.string().optional().describe("Optional ID of the project that the tasks belong to."), deadline_from: z.string().optional().describe("Optional deadline from. Supports Unix timestamps (seconds)"), deadline_to: z.string().optional().describe("Optional deadline to. Supports Unix timestamps (seconds)"), page: z.number().optional().describe("Optional page number. Defaults to 0, each page has 100 tasks"), created_from: z.string().optional().describe("Optional created from. Supports Unix timestamps (seconds)"), created_to: z.string().optional().describe("Optional created to. Supports Unix timestamps (seconds)"), creator: z.string().optional().describe("Optional username of the creator. This will be used to indicate the task creator."), assign: z.string().optional().describe("Optional user ID of the assignee. This will be used to assign the task to the user."), status: z.enum([TaskStatus.ACTIVE, TaskStatus.DONE, TaskStatus.REVIEW, TaskStatus.TODO, TaskStatus.DOING, TaskStatus.DONELATE, TaskStatus.OVERDUE, TaskStatus.NOTREVIEW, TaskStatus.TODAY]).optional().describe("Optional status of the tasks. Can be one of: 'active' (not done), 'done', 'review' (In review process), 'todo' (not started), 'doing' (started), 'donelate' (completed after deadline), 'overdue' (not done and past deadline), 'notreview' (not in review), 'today' (due today)"), }; export const getTasksTool = { name: "get_tasks", description: ` Get tasks from a all boards. Can filtered by q (query to filter task name), board_id, project_id, deadline_from (Unix timestamp in seconds), deadline_to (Unix timestamp in seconds), created_from (Unix timestamp in seconds), created_to (Unix timestamp in seconds), page (page number), creator (user id of creator), assign (user id of assignee), status (one of: 'active' (not done), 'done', 'review' (In review process), 'todo' (not started), 'doing' (started), 'donelate' (completed after deadline), 'overdue' (not done and past deadline), 'notreview' (not in review), 'today' (due today)) `, inputSchema: getTasksSchema }; /** * Handler for creating a task */ export async function getTasksHandler(params) { const { q, board_id, project_id, deadline_from, deadline_to, created_from, created_to, page, creator, assign, status } = params; // Prepare task data const taskData = { limit: 10 }; // Add optional fields if they exist if (q) taskData.q = q; if (board_id) taskData.board_id = board_id; if (project_id) taskData.project_id = project_id; if (deadline_from) taskData.deadline_from = deadline_from; if (deadline_to) taskData.deadline_to = deadline_to; if (created_from) taskData.created_from = created_from; if (created_to) taskData.created_to = created_to; if (page) taskData.page = page; if (creator) taskData.creator = creator; if (assign) taskData.assign = assign; if (status) taskData.status = status; // Use the fetcher to create the task const data = await reworkProjectFetcher.request({ endpoint: '/projects/v1/task/list', data: taskData }); let tasks = (data?.tasks || []); tasks = tasks.map((e) => { return { name: e.name, id: e.id, content: e.content, since: e.since, status: e.status, user_id: e.user_id, creator_id: e.creator_id, board_export: e.board_export, project_export: e.project_export, result: e.result, deadline: e.deadline, last_update: e.last_update, custom_fields: (e.form || []).map((f) => ({ name: f.name, id: f.id, type: f.type, value: f.display })), }; }); return Responder.createResponse({ ...data, tasks }); }