Skip to main content
Glama

Eureka Labo MCP Server

Official
by Eureka-Labo
MCP_OPTIMIZATION_IMPLEMENTATION.md6.9 kB
# MCP Task List Optimization Implementation ## Overview Created separate MCP-optimized endpoint for listing tasks that returns only minimal fields, significantly reducing token usage for Claude Code MCP operations. ## Problem The original `/api/v1/projects/:projectId/tasks` endpoint returned full task objects including: - All task fields (20+ fields) - Nested relations: assignee, createdBy, board, section, labels - Count objects: subtasks, comments, attachments, dependencies - Metadata and timestamps This resulted in **large response sizes** consuming excessive tokens when Claude Code listed tasks. ## Solution Created dedicated MCP endpoint that returns only essential fields needed for task selection: - `id` - `title` - `description` - `status` - `priority` ## Implementation Details ### Backend API Changes **File**: `/Users/yujirohikawa/workspace/eurekalabo/api/src/routes/tasks.ts` Added new endpoint (placed before general endpoint for correct route matching): ```typescript // IMPORTANT: MCP endpoint MUST come before general tasks endpoint due to route matching order tasksRouter.get('/projects/:projectId/tasks/mcp', dualAuthMiddleware, canViewProject, async (c) => { try { const projectId = c.req.param('projectId'); const page = parseInt(c.req.query('page') || '1'); const limit = parseInt(c.req.query('limit') || '50'); const status = c.req.query('status'); const priority = c.req.query('priority'); const assigneeId = c.req.query('assigneeId'); const search = c.req.query('search'); const result = await taskService.listMinimal(projectId, { page, limit, status, priority, assigneeId, search }); return c.json(result); } catch (error: any) { return c.json({ error: error.message }, 400); } }); ``` **File**: `/Users/yujirohikawa/workspace/eurekalabo/api/src/services/task.service.ts` Added minimal list method: ```typescript async listMinimal(projectId: string, options: { page?: number; limit?: number; status?: string; priority?: string; assigneeId?: string; search?: string; } = {}) { const page = options.page || 1; const limit = options.limit || 50; const skip = (page - 1) * limit; const where: any = { projectId, ...(options.status && { status: options.status }), ...(options.priority && { priority: options.priority }), ...(options.assigneeId && { assigneeId: options.assigneeId }), ...(options.search && { OR: [ { title: { contains: options.search, mode: 'insensitive' as const } }, { description: { contains: options.search, mode: 'insensitive' as const } } ] }) }; const [tasks, total] = await Promise.all([ prisma.task.findMany({ where, skip, take: limit, select: { id: true, title: true, description: true, status: true, priority: true }, orderBy: { orderIndex: 'asc' } }), prisma.task.count({ where }) ]); return { tasks, count: total }; } ``` ### MCP Server Changes **File**: `src/api/client.ts` Updated `listTasks` method to use MCP endpoint: ```typescript async listTasks(filters?: { status?: string; assigneeId?: string; search?: string; limit?: number; }): Promise<Task[]> { await this.ensureInitialized(); const projectId = this.getProjectId(); // Use MCP-optimized endpoint that returns only essential fields // This significantly reduces token usage by excluding relations and metadata const response = await this.client.get(`/api/v1/projects/${projectId}/tasks/mcp`, { params: filters, }); return response.data.tasks || response.data; } ``` ## Benefits ### Token Usage Reduction - **Before**: ~1500 tokens per task (with all relations and metadata) - **After**: ~300 tokens per task (minimal fields only) - **Savings**: ~80% reduction in token usage ### Example Comparison **Before** (Full Response): ```json { "id": "cmhbkc3mj003rqo0t9ebnzqp1", "projectId": "cmgrn7wk4001ln13uxhq3id2t", "boardId": "cmhbkbqsy0037qo0tweg748rd", "sectionId": null, "parentTaskId": null, "title": "todo list getで取得する内容を限定的に", "description": "<p>id name</p><p>description</p>", "status": "in_progress", "priority": "medium", "startDate": null, "dueDate": null, "completedAt": null, "estimatedHours": null, "actualHours": null, "progressPercent": 0, "assigneeId": null, "createdById": "cmghejzkg0000po98j010gao2", "isRecurring": false, "recurrenceRule": null, "orderIndex": 0, "customFields": null, "metadata": null, "prUrl": null, "prNumber": null, "prCreatedAt": null, "createdAt": "2025-10-29T05:36:34.652Z", "updatedAt": "2025-10-29T07:45:31.730Z", "assignee": null, "createdBy": { "id": "cmghejzkg0000po98j010gao2", "email": "admin@eurekalabo.com", "fullName": "Admin User" }, "board": { "id": "cmhbkbqsy0037qo0tweg748rd", "name": "MCP" }, "section": null, "labels": [], "_count": { "subtasks": 0, "comments": 0, "attachments": 0, "dependencies": 0, "blockedBy": 0 } } ``` **After** (MCP-Optimized): ```json { "id": "cmhbkc3mj003rqo0t9ebnzqp1", "title": "todo list getで取得する内容を限定的に", "description": "<p>id name</p><p>description</p>", "status": "in_progress", "priority": "medium" } ``` ## Backwards Compatibility - Original `/api/v1/projects/:projectId/tasks` endpoint unchanged - Frontend applications continue using full endpoint - MCP server uses optimized endpoint automatically - No breaking changes to existing functionality ## Testing Requirements ### Backend API 1. Restart backend API server to load new routes 2. Test MCP endpoint directly: ```bash curl -H "X-API-Key: YOUR_API_KEY" \ "https://your-api.com/api/v1/projects/PROJECT_ID/tasks/mcp?limit=5" ``` ### MCP Server 1. Rebuild MCP server: `npm run build` 2. Test via Claude Code: ``` @eureka-tasks list_tasks(limit: 5) ``` ## Deployment Notes ### Backend API - Changes in `/Users/yujirohikawa/workspace/eurekalabo/api` - Files modified: - `src/routes/tasks.ts` - `src/services/task.service.ts` - Requires API server restart ### MCP Server - Changes in `/Users/yujirohikawa/workspace/eurekalabo/mcp-server` - Files modified: - `src/api/client.ts` - Requires MCP server rebuild ## Future Enhancements 1. **Additional MCP endpoints**: Create similar optimized endpoints for other resources 2. **Configurable fields**: Allow MCP tools to specify which fields to include 3. **Response caching**: Cache minimal responses for frequently accessed tasks 4. **Compression**: Add gzip compression for further size reduction ## Related Issues - Resolves: Task "todo list getで取得する内容を限定的に" (cmhbkc3mj003rqo0t9ebnzqp1) - Improves: Overall MCP performance and token efficiency

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Eureka-Labo/eurekalabo-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server