mirror of
https://github.com/czlonkowski/n8n-mcp.git
synced 2026-03-25 03:43:08 +00:00
chore: update n8n to v1.114.3 and optimize template fetching
Updates: - Updated n8n from 1.113.3 to 1.114.3 - Updated n8n-core from 1.112.1 to 1.113.1 - Updated n8n-workflow from 1.110.0 to 1.111.0 - Updated @n8n/n8n-nodes-langchain from 1.112.2 to 1.113.1 - Rebuilt node database with 536 nodes - Updated template database (2647 → 2653, +6 new templates) - Sanitized 24 templates to remove API tokens Performance Improvements: - Optimized template update to fetch only last 2 weeks - Reduced update time from 10+ minutes to ~60 seconds - Added getMostRecentTemplateDate() to TemplateRepository - Modified TemplateFetcher to support date-based filtering - Update mode now fetches templates since (most_recent - 14 days) All tests passing (933 unit, 249 integration) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
BIN
data/nodes.db
BIN
data/nodes.db
Binary file not shown.
826
package-lock.json
generated
826
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -132,15 +132,15 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@modelcontextprotocol/sdk": "^1.13.2",
|
"@modelcontextprotocol/sdk": "^1.13.2",
|
||||||
"@n8n/n8n-nodes-langchain": "^1.112.2",
|
"@n8n/n8n-nodes-langchain": "^1.113.1",
|
||||||
"@supabase/supabase-js": "^2.57.4",
|
"@supabase/supabase-js": "^2.57.4",
|
||||||
"dotenv": "^16.5.0",
|
"dotenv": "^16.5.0",
|
||||||
"express": "^5.1.0",
|
"express": "^5.1.0",
|
||||||
"express-rate-limit": "^7.1.5",
|
"express-rate-limit": "^7.1.5",
|
||||||
"lru-cache": "^11.2.1",
|
"lru-cache": "^11.2.1",
|
||||||
"n8n": "^1.113.3",
|
"n8n": "^1.114.3",
|
||||||
"n8n-core": "^1.112.1",
|
"n8n-core": "^1.113.1",
|
||||||
"n8n-workflow": "^1.110.0",
|
"n8n-workflow": "^1.111.0",
|
||||||
"openai": "^4.77.0",
|
"openai": "^4.77.0",
|
||||||
"sql.js": "^1.13.0",
|
"sql.js": "^1.13.0",
|
||||||
"uuid": "^10.0.0",
|
"uuid": "^10.0.0",
|
||||||
|
|||||||
@@ -45,19 +45,22 @@ export class TemplateFetcher {
|
|||||||
* Fetch all templates and filter to last 12 months
|
* Fetch all templates and filter to last 12 months
|
||||||
* This fetches ALL pages first, then applies date filter locally
|
* This fetches ALL pages first, then applies date filter locally
|
||||||
*/
|
*/
|
||||||
async fetchTemplates(progressCallback?: (current: number, total: number) => void): Promise<TemplateWorkflow[]> {
|
async fetchTemplates(progressCallback?: (current: number, total: number) => void, sinceDate?: Date): Promise<TemplateWorkflow[]> {
|
||||||
const allTemplates = await this.fetchAllTemplates(progressCallback);
|
const allTemplates = await this.fetchAllTemplates(progressCallback);
|
||||||
|
|
||||||
// Apply date filter locally after fetching all
|
// Use provided date or default to 12 months ago
|
||||||
const oneYearAgo = new Date();
|
const cutoffDate = sinceDate || (() => {
|
||||||
oneYearAgo.setMonth(oneYearAgo.getMonth() - 12);
|
const oneYearAgo = new Date();
|
||||||
|
oneYearAgo.setMonth(oneYearAgo.getMonth() - 12);
|
||||||
|
return oneYearAgo;
|
||||||
|
})();
|
||||||
|
|
||||||
const recentTemplates = allTemplates.filter((w: TemplateWorkflow) => {
|
const recentTemplates = allTemplates.filter((w: TemplateWorkflow) => {
|
||||||
const createdDate = new Date(w.createdAt);
|
const createdDate = new Date(w.createdAt);
|
||||||
return createdDate >= oneYearAgo;
|
return createdDate >= cutoffDate;
|
||||||
});
|
});
|
||||||
|
|
||||||
logger.info(`Filtered to ${recentTemplates.length} templates from last 12 months (out of ${allTemplates.length} total)`);
|
logger.info(`Filtered to ${recentTemplates.length} templates since ${cutoffDate.toISOString().split('T')[0]} (out of ${allTemplates.length} total)`);
|
||||||
return recentTemplates;
|
return recentTemplates;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -442,7 +442,19 @@ export class TemplateRepository {
|
|||||||
const rows = this.db.prepare('SELECT id FROM templates').all() as { id: number }[];
|
const rows = this.db.prepare('SELECT id FROM templates').all() as { id: number }[];
|
||||||
return new Set(rows.map(r => r.id));
|
return new Set(rows.map(r => r.id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the most recent template creation date
|
||||||
|
* Used in update mode to fetch only newer templates
|
||||||
|
*/
|
||||||
|
getMostRecentTemplateDate(): Date | null {
|
||||||
|
const result = this.db.prepare('SELECT MAX(created_at) as max_date FROM templates').get() as { max_date: string | null } | undefined;
|
||||||
|
if (!result || !result.max_date) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new Date(result.max_date);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if a template exists in the database
|
* Check if a template exists in the database
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -319,22 +319,38 @@ export class TemplateService {
|
|||||||
|
|
||||||
// Get existing template IDs if in update mode
|
// Get existing template IDs if in update mode
|
||||||
let existingIds: Set<number> = new Set();
|
let existingIds: Set<number> = new Set();
|
||||||
|
let sinceDate: Date | undefined;
|
||||||
|
|
||||||
if (mode === 'update') {
|
if (mode === 'update') {
|
||||||
existingIds = this.repository.getExistingTemplateIds();
|
existingIds = this.repository.getExistingTemplateIds();
|
||||||
logger.info(`Update mode: Found ${existingIds.size} existing templates in database`);
|
logger.info(`Update mode: Found ${existingIds.size} existing templates in database`);
|
||||||
|
|
||||||
|
// Get most recent template date and fetch only templates from last 2 weeks
|
||||||
|
const mostRecentDate = this.repository.getMostRecentTemplateDate();
|
||||||
|
if (mostRecentDate) {
|
||||||
|
// Fetch templates from 2 weeks before the most recent template
|
||||||
|
sinceDate = new Date(mostRecentDate);
|
||||||
|
sinceDate.setDate(sinceDate.getDate() - 14);
|
||||||
|
logger.info(`Update mode: Fetching templates since ${sinceDate.toISOString().split('T')[0]} (2 weeks before most recent)`);
|
||||||
|
} else {
|
||||||
|
// No templates yet, fetch from last 2 weeks
|
||||||
|
sinceDate = new Date();
|
||||||
|
sinceDate.setDate(sinceDate.getDate() - 14);
|
||||||
|
logger.info(`Update mode: No existing templates, fetching from last 2 weeks`);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// Clear existing templates in rebuild mode
|
// Clear existing templates in rebuild mode
|
||||||
this.repository.clearTemplates();
|
this.repository.clearTemplates();
|
||||||
logger.info('Rebuild mode: Cleared existing templates');
|
logger.info('Rebuild mode: Cleared existing templates');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fetch template list
|
// Fetch template list
|
||||||
logger.info(`Fetching template list from n8n.io (mode: ${mode})`);
|
logger.info(`Fetching template list from n8n.io (mode: ${mode})`);
|
||||||
const templates = await fetcher.fetchTemplates((current, total) => {
|
const templates = await fetcher.fetchTemplates((current, total) => {
|
||||||
progressCallback?.('Fetching template list', current, total);
|
progressCallback?.('Fetching template list', current, total);
|
||||||
});
|
}, sinceDate);
|
||||||
|
|
||||||
logger.info(`Found ${templates.length} templates from last 12 months`);
|
logger.info(`Found ${templates.length} templates matching date criteria`);
|
||||||
|
|
||||||
// Filter to only new templates if in update mode
|
// Filter to only new templates if in update mode
|
||||||
let templatesToFetch = templates;
|
let templatesToFetch = templates;
|
||||||
|
|||||||
Reference in New Issue
Block a user