Skip to main content
Glama

todo_management

Manage tasks for SRT subtitle processing workflows. Create, update, and track tasks across parsing, translation, and quality check stages to monitor progress.

Instructions

Manage tasks for SRT processing workflows.

WHAT IT DOES:

  • Create, update, and track tasks during SRT processing

  • Monitor progress across different processing stages

  • Manage task priorities and dependencies

ACTIONS:

  • create: Create a new task

  • update: Update task status

  • complete: Mark task as completed

  • list: List all tasks

  • get_status: Get overall task status

TASK TYPES:

  • srt_parse: Parse and validate SRT file

  • conversation_detect: Detect conversation chunks

  • chunk_optimize: Optimize chunks for AI processing

  • ai_process: Process with AI model

  • translate: Translate content

  • quality_check: Quality assurance

  • output_generate: Generate final output

EXAMPLE USAGE:

  1. Create task: {"action": "create", "taskType": "srt_parse", "title": "Parse SRT file", "priority": "high"}

  2. Update status: {"action": "update", "taskId": "task-123", "status": "completed"}

  3. List tasks: {"action": "list"}

  4. Get status: {"action": "get_status"}

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
actionYesTodo action to perform
taskTypeNoType of task
titleNoTask title
descriptionNoTask description
priorityNoTask prioritymedium
taskIdNoTask ID (for update/complete actions)
statusNoTask status (for update action)
metadataNoAdditional task metadata

Implementation Reference

  • Tool registration including name, description, and input schema definition for todo_management.
    { name: 'todo_management', description: `Manage tasks for SRT processing workflows. WHAT IT DOES: - Create, update, and track tasks during SRT processing - Monitor progress across different processing stages - Manage task priorities and dependencies ACTIONS: - create: Create a new task - update: Update task status - complete: Mark task as completed - list: List all tasks - get_status: Get overall task status TASK TYPES: - srt_parse: Parse and validate SRT file - conversation_detect: Detect conversation chunks - chunk_optimize: Optimize chunks for AI processing - ai_process: Process with AI model - translate: Translate content - quality_check: Quality assurance - output_generate: Generate final output EXAMPLE USAGE: 1. Create task: {"action": "create", "taskType": "srt_parse", "title": "Parse SRT file", "priority": "high"} 2. Update status: {"action": "update", "taskId": "task-123", "status": "completed"} 3. List tasks: {"action": "list"} 4. Get status: {"action": "get_status"}`, inputSchema: { type: 'object', properties: { action: { type: 'string', enum: ['create', 'update', 'complete', 'list', 'get_status'], description: 'Todo action to perform', }, taskType: { type: 'string', enum: ['srt_parse', 'conversation_detect', 'chunk_optimize', 'ai_process', 'translate', 'quality_check', 'output_generate'], description: 'Type of task', }, title: { type: 'string', description: 'Task title', }, description: { type: 'string', description: 'Task description', }, priority: { type: 'string', enum: ['low', 'medium', 'high', 'urgent'], description: 'Task priority', default: 'medium', }, taskId: { type: 'string', description: 'Task ID (for update/complete actions)', }, status: { type: 'string', enum: ['pending', 'in_progress', 'completed', 'failed', 'cancelled'], description: 'Task status (for update action)', }, metadata: { type: 'object', description: 'Additional task metadata', }, }, required: ['action'], }, },
  • Main handler function that processes todo_management tool calls by dispatching to different actions using the todoManager.
    private async handleTodoManagement(args: any) { const { action, taskType, title, description, priority, taskId, status, metadata } = args; switch (action) { case 'create': if (!taskType || !title) { throw new Error('taskType and title are required for create action'); } const todo = await this.todoManager.createSRTProcessingTodos( title, 1, 'translation' ); return { content: [ { type: 'text', text: JSON.stringify({ success: true, todo }, null, 2), }, ], }; case 'update': if (!taskId || !status) { throw new Error('taskId and status are required for update action'); } // Note: SRTProcessingTodoManager doesn't have direct update method // This is a placeholder for the actual implementation console.log(`Updating todo ${taskId} to status ${status}`); return { content: [ { type: 'text', text: JSON.stringify({ success: true, message: 'Todo updated' }, null, 2), }, ], }; case 'complete': if (!taskId) { throw new Error('taskId is required for complete action'); } // Note: SRTProcessingTodoManager doesn't have direct complete method // This is a placeholder for the actual implementation console.log(`Completing todo ${taskId}`); return { content: [ { type: 'text', text: JSON.stringify({ success: true, message: 'Todo completed' }, null, 2), }, ], }; case 'list': // Use the todo manager's getTodosByStage method const todos = await this.todoManager.getTodosByStage('all'); return { content: [ { type: 'text', text: JSON.stringify({ success: true, todos }, null, 2), }, ], }; case 'get_status': // Use the todo manager's getProcessingStatistics method const statistics = await this.todoManager.getProcessingStatistics(); return { content: [ { type: 'text', text: JSON.stringify({ success: true, status: statistics }, null, 2), }, ], }; default: throw new Error(`Unknown action: ${action}`); } }
  • SRTProcessingTodoManager class providing methods like createSRTProcessingTodos, getTodosByStage, getProcessingStatistics used by the todo_management handler.
    export class SRTProcessingTodoManager { private todoTool: TodoToolInterface; private modelType: string; constructor(modelType: string) { this.modelType = modelType; this.todoTool = TodoToolFactory.createTodoTool(modelType); } /** * Create comprehensive SRT processing todos */ async createSRTProcessingTodos( fileName: string, chunkCount: number, processingType: 'translation' | 'analysis' | 'conversation-detection', targetLanguage?: string ): Promise<TodoListResult> { const todos: Omit<TodoItem, 'id' | 'createdAt' | 'updatedAt'>[] = []; // Add file analysis todos todos.push(...SRTTodoTemplates.createFileAnalysisTodos(fileName)); // Add chunk detection todos todos.push(...SRTTodoTemplates.createChunkDetectionTodos(chunkCount)); // Add chunk optimization todos todos.push(...SRTTodoTemplates.createChunkOptimizationTodos(chunkCount, this.modelType)); // Add processing-specific todos switch (processingType) { case 'translation': if (targetLanguage) { todos.push(...SRTTodoTemplates.createTranslationTodos(chunkCount, targetLanguage)); } break; case 'analysis': todos.push(...SRTTodoTemplates.createAnalysisTodos(chunkCount)); break; case 'conversation-detection': // Already covered by chunk detection todos break; } // Add validation todos todos.push(...SRTTodoTemplates.createValidationTodos(chunkCount)); return this.todoTool.createTodoList(todos as TodoItem[]); } /** * Update processing progress */ async updateProcessingProgress( stage: 'file-analysis' | 'chunk-detection' | 'chunk-optimization' | 'processing' | 'validation', status: TodoStatus ): Promise<void> { const todos = await this.todoTool.getTodoList(); const stageTodos = todos.filter(todo => todo.metadata?.processingContext?.processingType === stage ); for (const todo of stageTodos) { await this.todoTool.updateTodoStatus(todo.id, status); } } /** * Get processing statistics */ async getProcessingStatistics(): Promise<TodoStatistics> { return this.todoTool.getTodoStatistics(); } /** * Get todos by processing stage */ async getTodosByStage(stage: string): Promise<TodoItem[]> { const todos = await this.todoTool.getTodoList(); if (stage === 'all') { return todos; } return todos.filter(todo => todo.metadata?.processingContext?.processingType === stage ); } }
  • UniversalTodoTool implementing the core in-memory todo storage and operations (Map-based), used by SRTProcessingTodoManager.
    export class UniversalTodoTool implements TodoToolInterface { private todos: Map<string, TodoItem> = new Map(); private todoCounter = 0; private modelType: string; constructor(modelType: string = 'generic') { this.modelType = modelType; } /** * Create todo list */ async createTodoList(todos: TodoItem[]): Promise<TodoListResult> { const todoIds: string[] = []; const warnings: string[] = []; for (const todo of todos) { try { const createdTodo = await this.addTodo(todo); todoIds.push(createdTodo.id); } catch (error) { warnings.push(`Failed to create todo: ${error instanceof Error ? error.message : 'Unknown error'}`); } } return { success: todoIds.length > 0, todoIds, message: `Created ${todoIds.length} todos for ${this.modelType}`, warnings: warnings.length > 0 ? warnings : undefined }; } /** * Add single todo */ async addTodo(todo: Omit<TodoItem, 'id' | 'createdAt' | 'updatedAt'>): Promise<TodoItem> { const id = `${this.modelType}-todo-${++this.todoCounter}`; const now = new Date(); const newTodo: TodoItem = { ...todo, id, createdAt: now, updatedAt: now }; this.todos.set(id, newTodo); console.log(`[DEBUG] Added todo ${id}, total todos: ${this.todos.size}`); return newTodo; } /** * Update todo status */ async updateTodoStatus(todoId: string, status: TodoStatus): Promise<boolean> { const todo = this.todos.get(todoId); if (!todo) return false; todo.status = status; todo.updatedAt = new Date(); if (status === 'completed') { todo.completedAt = new Date(); } this.todos.set(todoId, todo); return true; } /** * Get todo list */ async getTodoList(): Promise<TodoItem[]> { console.log(`[DEBUG] getTodoList called, todos count: ${this.todos.size}`); const todos = Array.from(this.todos.values()); console.log(`[DEBUG] returning ${todos.length} todos`); return todos; } /** * Mark todo as complete */ async markTodoComplete(todoId: string): Promise<boolean> { return this.updateTodoStatus(todoId, 'completed'); } /** * Get todo by ID */ async getTodoById(todoId: string): Promise<TodoItem | null> { return this.todos.get(todoId) || null; } /** * Delete todo */ async deleteTodo(todoId: string): Promise<boolean> { return this.todos.delete(todoId); } /** * Update todo */ async updateTodo(todoId: string, updates: Partial<TodoItem>): Promise<TodoItem | null> { const todo = this.todos.get(todoId); if (!todo) return null; const updatedTodo = { ...todo, ...updates, id: todoId, // Preserve ID updatedAt: new Date() }; this.todos.set(todoId, updatedTodo); return updatedTodo; } /** * Search todos */ async searchTodos(query: string): Promise<TodoItem[]> { const allTodos = Array.from(this.todos.values()); const searchTerm = query.toLowerCase(); return allTodos.filter(todo => todo.content.toLowerCase().includes(searchTerm) || todo.category.toLowerCase().includes(searchTerm) || (todo.tags && todo.tags.some(tag => tag.toLowerCase().includes(searchTerm))) ); } /** * Get todos by category */ async getTodosByCategory(category: string): Promise<TodoItem[]> { const allTodos = Array.from(this.todos.values()); return allTodos.filter(todo => todo.category === category); } /** * Get todos by status */ async getTodosByStatus(status: TodoStatus): Promise<TodoItem[]> { const allTodos = Array.from(this.todos.values()); return allTodos.filter(todo => todo.status === status); } /** * Get todos by priority */ async getTodosByPriority(priority: TodoPriority): Promise<TodoItem[]> { const allTodos = Array.from(this.todos.values()); return allTodos.filter(todo => todo.priority === priority); } /** * Get todo statistics */ async getTodoStatistics(): Promise<TodoStatistics> { const allTodos = Array.from(this.todos.values()); const stats: TodoStatistics = { total: allTodos.length, pending: allTodos.filter(t => t.status === 'pending').length, inProgress: allTodos.filter(t => t.status === 'in_progress').length, completed: allTodos.filter(t => t.status === 'completed').length, cancelled: allTodos.filter(t => t.status === 'cancelled').length, blocked: allTodos.filter(t => t.status === 'blocked').length, byPriority: { low: allTodos.filter(t => t.priority === 'low').length, medium: allTodos.filter(t => t.priority === 'medium').length, high: allTodos.filter(t => t.priority === 'high').length, critical: allTodos.filter(t => t.priority === 'critical').length }, byCategory: {} }; // Calculate category distribution const categories = [...new Set(allTodos.map(t => t.category))]; categories.forEach(category => { stats.byCategory[category] = allTodos.filter(t => t.category === category).length; }); // Calculate completion rate if (stats.total > 0) { stats.completionRate = stats.completed / stats.total; } // Calculate average completion time for completed todos const completedTodos = allTodos.filter(t => t.status === 'completed' && t.completedAt); if (completedTodos.length > 0) { const totalTime = completedTodos.reduce((sum, todo) => { if (todo.completedAt && todo.createdAt) { return sum + (todo.completedAt.getTime() - todo.createdAt.getTime()); } return sum; }, 0); stats.averageCompletionTime = totalTime / completedTodos.length; } return stats; } }

Latest Blog Posts

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/omd0/srt-mcp'

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