UNPKG

@mseep/atlas-mcp-server

Version:

A Model Context Protocol (MCP) server for ATLAS, a Neo4j-powered task management system for LLM Agents - implementing a three-tier architecture (Projects, Tasks, Knowledge) to manage complex workflows.

145 lines (144 loc) 7.53 kB
import { z } from "zod"; import { PriorityLevel, ResponseFormat, TaskStatus, createResponseFormatEnum, createToolResponse } from "../../../types/mcp.js"; import { createToolExample, createToolMetadata, registerTool } from "../../../types/tool.js"; import { atlasListTasks } from "./listTasks.js"; import { formatTaskListResponse } from "./responseFormat.js"; // Schema shapes for tool registration const TaskListRequestSchemaShape = { projectId: z.string().describe("ID of the project to list tasks for (required)"), status: z.union([ z.enum([TaskStatus.BACKLOG, TaskStatus.TODO, TaskStatus.IN_PROGRESS, TaskStatus.COMPLETED]), z.array(z.enum([TaskStatus.BACKLOG, TaskStatus.TODO, TaskStatus.IN_PROGRESS, TaskStatus.COMPLETED])) ]).optional().describe("Filter by task status or array of statuses"), assignedTo: z.string().optional().describe("Filter by assignment ID"), priority: z.union([ z.enum([PriorityLevel.LOW, PriorityLevel.MEDIUM, PriorityLevel.HIGH, PriorityLevel.CRITICAL]), z.array(z.enum([PriorityLevel.LOW, PriorityLevel.MEDIUM, PriorityLevel.HIGH, PriorityLevel.CRITICAL])) ]).optional().describe("Filter by priority level or array of priorities"), tags: z.array(z.string()).optional().describe("Array of tags to filter by (tasks matching any tag will be included)"), taskType: z.string().optional().describe("Filter by task classification"), sortBy: z.enum(['priority', 'createdAt', 'status']).optional().describe("Field to sort results by (Default: createdAt)"), sortDirection: z.enum(['asc', 'desc']).optional().describe("Sort order (Default: desc)"), page: z.number().optional().describe("Page number for paginated results (Default: 1)"), limit: z.number().optional().describe("Number of results per page, maximum 100 (Default: 20)"), responseFormat: createResponseFormatEnum().optional().default(ResponseFormat.FORMATTED).describe("Desired response format: 'formatted' (default string) or 'json' (raw object)"), }; export const registerAtlasTaskListTool = (server) => { registerTool(server, "atlas_task_list", "Lists tasks according to specified filters with advanced filtering, sorting, and pagination capabilities", TaskListRequestSchemaShape, async (input, context) => { // Parse and process input (assuming validation happens implicitly via registerTool) const validatedInput = input; // Corrected type cast const result = await atlasListTasks(validatedInput, context); // Added context argument // Conditionally format response if (validatedInput.responseFormat === ResponseFormat.JSON) { // Stringify the result and wrap it in a standard text response // The client will need to parse this stringified JSON return createToolResponse(JSON.stringify(result, null, 2)); } else { // Return the formatted string using the formatter for rich display return formatTaskListResponse(result, false); // Added second argument } }, createToolMetadata({ examples: [ createToolExample({ projectId: "proj_example123", status: "in_progress", limit: 10 }, `{ "tasks": [ { "id": "task_abcd1234", "projectId": "proj_example123", "title": "Implement User Authentication", "description": "Create secure user authentication system with JWT and refresh tokens", "priority": "high", "status": "in_progress", "assignedTo": "user_5678", "tags": ["security", "backend"], "completionRequirements": "Authentication endpoints working with proper error handling and tests", "outputFormat": "Documented API with test coverage", "taskType": "implementation", "createdAt": "2025-03-20T14:24:35.123Z", "updatedAt": "2025-03-22T09:15:22.456Z" } ], "total": 5, "page": 1, "limit": 10, "totalPages": 1 }`, "List in-progress tasks for a specific project"), createToolExample({ projectId: "proj_frontend42", priority: ["high", "critical"], tags: ["bug", "urgent"], sortBy: "priority", sortDirection: "desc" }, `{ "tasks": [ { "id": "task_ef5678", "projectId": "proj_frontend42", "title": "Fix Critical UI Rendering Bug", "description": "Address the UI rendering issue causing layout problems on mobile devices", "priority": "critical", "status": "todo", "tags": ["bug", "ui", "urgent"], "completionRequirements": "UI displays correctly on all supported mobile devices", "outputFormat": "Fixed code with browser compatibility tests", "taskType": "bugfix", "createdAt": "2025-03-21T10:30:15.789Z", "updatedAt": "2025-03-21T10:30:15.789Z" }, { "id": "task_gh9012", "projectId": "proj_frontend42", "title": "Optimize Image Loading Performance", "description": "Implement lazy loading and optimize image assets to improve page load time", "priority": "high", "status": "backlog", "tags": ["performance", "urgent"], "completionRequirements": "Page load time reduced by 40% with Lighthouse score above 90", "outputFormat": "Optimized code with performance benchmarks", "taskType": "optimization", "createdAt": "2025-03-19T16:45:22.123Z", "updatedAt": "2025-03-19T16:45:22.123Z" } ], "total": 2, "page": 1, "limit": 20, "totalPages": 1 }`, "List high priority and critical tasks with specific tags, sorted by priority") ], requiredPermission: "project:read", returnSchema: z.object({ tasks: z.array(z.object({ id: z.string(), projectId: z.string(), title: z.string(), description: z.string(), priority: z.enum([PriorityLevel.LOW, PriorityLevel.MEDIUM, PriorityLevel.HIGH, PriorityLevel.CRITICAL]), status: z.enum([TaskStatus.BACKLOG, TaskStatus.TODO, TaskStatus.IN_PROGRESS, TaskStatus.COMPLETED]), assignedTo: z.string().optional(), urls: z.array(z.object({ title: z.string(), url: z.string() })).optional(), tags: z.array(z.string()).optional(), completionRequirements: z.string(), outputFormat: z.string(), taskType: z.string(), createdAt: z.string(), updatedAt: z.string() })), total: z.number().int(), page: z.number().int(), limit: z.number().int(), totalPages: z.number().int() }), rateLimit: { windowMs: 60 * 1000, // 1 minute maxRequests: 30 // 30 requests per minute } })); };