Skip to main content
Glama

queue_diagnostics

Analyze and resolve stuck queue items in media management services to restore workflow automation and monitoring functionality.

Instructions

Analyze and auto-fix stuck queue items

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
autoFixNo
serviceYes

Implementation Reference

  • src/index.ts:134-145 (registration)
    MCP tool registration defining the 'queue_diagnostics' tool name, description, and input schema.
    {
      name: "queue_diagnostics",
      description: "Analyze and auto-fix stuck queue items",
      inputSchema: {
        type: "object",
        properties: {
          service: { type: "string" },
          autoFix: { type: "boolean" },
        },
        required: ["service"],
      },
    },
  • Tool dispatch handler in main CallToolRequestSchema that routes 'queue_diagnostics' calls to the service implementation.
    case "queue_diagnostics":
      return await service.queueDiagnostics(input.autoFix);
  • Primary handler implementation in BaseArrService: fetches queue, analyzes issues, attempts auto-fixes if enabled, and returns diagnostics.
    async queueDiagnostics(
    	autoFix = true,
    ): Promise<OperationResult<QueueDiagnosticsData>> {
    	const operation = withMetrics(
    		this.serviceName,
    		"queueDiagnostics",
    		async () => {
    			debugOperation(this.serviceName, "queueDiagnostics");
    			// Get current queue with detailed status
    			const queueResponse = await fetchJson(this.buildApiUrl("/queue"));
    			const queueData = QueueSchema.parse(queueResponse);
    
    			const allItems = queueData.records || [];
    			const issuesAnalyzed: QueueIssueAnalysis[] = [];
    			const fixesAttempted: QueueFixAction[] = [];
    
    			for (const item of allItems) {
    				const analysis = this.analyzeQueueItem(item);
    
    				// Include all real issues - exclude only "unknown" type with "info" severity
    				const isRealIssue = !(
    					analysis.category.type === "unknown" &&
    					analysis.category.severity === "info"
    				);
    
    				if (isRealIssue) {
    					issuesAnalyzed.push(analysis);
    
    					// Attempt auto-fix if possible and enabled
    					if (autoFix && analysis.category.autoFixable) {
    						const fixAction = await this.attemptAutoFix(item, analysis);
    						fixesAttempted.push(fixAction);
    					}
    				}
    			}
    
    			const summary = {
    				fixed: fixesAttempted.filter((f) => f.success === true).length,
    				failed: fixesAttempted.filter((f) => f.success === false).length,
    				requiresManual: issuesAnalyzed.filter((i) => !i.category.autoFixable)
    					.length,
    			};
    
    			return {
    				ok: true,
    				data: {
    					service: this.serviceName,
    					mediaKind: this.mediaKind,
    					totalQueueItems: allItems.length,
    					issuesFound: issuesAnalyzed.length,
    					issuesAnalyzed,
    					fixesAttempted,
    					summary,
    				},
    			};
    		},
    	);
    
    	try {
    		return await operation();
    	} catch (error) {
    		return handleError(error, this.serviceName);
    	}
    }
  • TypeScript interface defining the structure of QueueDiagnosticsData returned by the tool.
    export interface QueueDiagnosticsData {
    	service: string;
    	mediaKind: "series" | "movie";
    	totalQueueItems: number;
    	issuesFound: number;
    	issuesAnalyzed: QueueIssueAnalysis[];
    	fixesAttempted: QueueFixAction[];
    	summary: {
    		fixed: number;
    		failed: number;
    		requiresManual: number;
    	};
    }
  • Helper method analyzeQueueItem categorizes queue issues based on status messages and error patterns.
    private analyzeQueueItem(item: QueueRecord): QueueIssueAnalysis {
    	const status = item.status?.toLowerCase() || "";
    	const statusMessages = item.statusMessages || [];
    	const errorMessage = item.errorMessage || "";
    	const allMessages = [
    		status,
    		...statusMessages.map((m: StatusMessage) => m.title || m.message || ""),
    		...statusMessages.flatMap((m: StatusMessage) => m.messages || []),
    		errorMessage,
    	]
    		.filter(Boolean)
    		.join(" ")
    		.toLowerCase();
    
    	// TheXEM mapping issues
    	if (allMessages.includes("thexem") && allMessages.includes("mapping")) {
    		return {
    			id: item.id,
    			title: item.title,
    			status: item.status,
    			category: { type: "mapping", severity: "warning", autoFixable: true },
    			message: "TheXEM mapping issue detected",
    			suggestedAction: "Trigger manual import to bypass mapping requirements",
    		};
    	}
    
    	// Quality downgrade issues
    	if (
    		allMessages.includes("not a custom format upgrade") ||
    		allMessages.includes("do not improve on existing")
    	) {
    		return {
    			id: item.id,
    			title: item.title,
    			status: item.status,
    			category: {
    				type: "quality_downgrade",
    				severity: "warning",
    				autoFixable: true,
    			},
    			message: "Download is not an upgrade over existing file",
    			suggestedAction: "Remove from queue as existing file is better quality",
    		};
    	}
    
    	// Network/connection errors
    	if (
    		allMessages.includes("timeout") ||
    		allMessages.includes("connection") ||
    		allMessages.includes("network") ||
    		allMessages.includes("dns")
    	) {
    		return {
    			id: item.id,
    			title: item.title,
    			status: item.status,
    			category: {
    				type: "network_error",
    				severity: "warning",
    				autoFixable: true,
    			},
    			message: "Network connectivity issue detected",
    			suggestedAction: "Retry download after network issue resolution",
    		};
    	}
    
    	// Disk space issues
    	if (
    		allMessages.includes("disk") &&
    		(allMessages.includes("space") || allMessages.includes("full"))
    	) {
    		return {
    			id: item.id,
    			title: item.title,
    			status: item.status,
    			category: {
    				type: "disk_space",
    				severity: "critical",
    				autoFixable: false,
    			},
    			message: "Insufficient disk space",
    			suggestedAction: "Free up disk space manually",
    		};
    	}
    
    	// Permission issues
    	if (
    		allMessages.includes("permission") ||
    		allMessages.includes("access denied")
    	) {
    		return {
    			id: item.id,
    			title: item.title,
    			status: item.status,
    			category: {
    				type: "permissions",
    				severity: "critical",
    				autoFixable: false,
    			},
    			message: "File system permission issue",
    			suggestedAction: "Fix file permissions manually",
    		};
    	}
    
    	// Check if item appears stuck (downloading for too long)
    	const isStuck =
    		status.includes("warning") ||
    		status.includes("error") ||
    		statusMessages.length > 0;
    
    	if (isStuck) {
    		return {
    			id: item.id,
    			title: item.title,
    			status: item.status,
    			category: { type: "unknown", severity: "warning", autoFixable: false },
    			message: "Item appears stuck with unrecognized issue",
    			suggestedAction: "Manual investigation required",
    		};
    	}
    
    	// No issues detected
    	return {
    		id: item.id,
    		title: item.title,
    		status: item.status,
    		category: { type: "unknown", severity: "info", autoFixable: false },
    		message: "No issues detected",
    		suggestedAction: "No action needed",
    	};
    }

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/thesammykins/FlixBridge'

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