workflow.ts•2.7 kB
/**
* Dynamic Workflow Resource Handler
*
* This module provides the MCP resource implementation for retrieving
* detailed workflow information by ID.
*/
import { N8nApiService } from '../../api/n8n-client.js';
import { formatWorkflowDetails, formatResourceUri } from '../../utils/resource-formatter.js';
import { McpError, ErrorCode } from '../../errors/index.js';
/**
* Get workflow resource data by ID
*
* @param apiService n8n API service
* @param workflowId Workflow ID
* @returns Formatted workflow resource data
*/
export async function getWorkflowResource(apiService: N8nApiService, workflowId: string): Promise<string> {
try {
// Get the specific workflow from the API
const workflow = await apiService.getWorkflow(workflowId);
// Format the workflow for resource consumption
const formattedWorkflow = formatWorkflowDetails(workflow);
// Add metadata about the resource
const result = {
resourceType: 'workflow',
id: workflowId,
...formattedWorkflow,
_links: {
self: formatResourceUri('workflow', workflowId),
// Include links to related resources
executions: `n8n://executions?workflowId=${workflowId}`,
},
lastUpdated: new Date().toISOString(),
};
return JSON.stringify(result, null, 2);
} catch (error) {
console.error(`Error fetching workflow resource (ID: ${workflowId}):`, error);
// Handle not found errors specifically
if (error instanceof McpError && error.code === ErrorCode.NotFoundError) {
throw error;
}
throw new McpError(
ErrorCode.InternalError,
`Failed to retrieve workflow (ID: ${workflowId}): ${error instanceof Error ? error.message : 'Unknown error'}`
);
}
}
/**
* Get workflow resource template URI
*
* @returns Formatted resource template URI
*/
export function getWorkflowResourceTemplateUri(): string {
return 'n8n://workflows/{id}';
}
/**
* Get workflow resource template metadata
*
* @returns Resource template metadata object
*/
export function getWorkflowResourceTemplateMetadata(): Record<string, any> {
return {
uriTemplate: getWorkflowResourceTemplateUri(),
name: 'n8n Workflow Details',
mimeType: 'application/json',
description: 'Detailed information about a specific n8n workflow including all nodes, connections, and settings',
};
}
/**
* Extract workflow ID from resource URI
*
* @param uri Resource URI
* @returns Workflow ID or null if URI format is invalid
*/
export function extractWorkflowIdFromUri(uri: string): string | null {
const match = uri.match(/^n8n:\/\/workflows\/([^/]+)$/);
return match ? match[1] : null;
}