Compare commits

..

2 Commits

Author SHA1 Message Date
czlonkowski
f5088918aa fix: memory leak in SSE session reset (#542)
When SSE sessions are recreated every 5 minutes, the old session's MCP
server was not being closed, causing:
- SimpleCache cleanup timer continuing to run indefinitely
- Database connections remaining open
- Cached data (~50-100MB per session) persisting in memory

Added server.close() call before transport.close() in resetSessionSSE(),
mirroring the existing cleanup pattern in removeSession().

Fixes #542

Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 13:04:04 +01:00
Romuald Członkowski
0f15b82f1e chore: update n8n to 2.4.4 (#543)
* chore: update n8n to 2.4.4 and bump version to 2.33.3

- Updated n8n from 2.2.3 to 2.4.4
- Updated n8n-core from 2.2.2 to 2.4.2
- Updated n8n-workflow from 2.2.2 to 2.4.2
- Updated @n8n/n8n-nodes-langchain from 2.2.2 to 2.4.3
- Added new `icon` NodePropertyType (now 23 types total)
- Rebuilt node database with 803 nodes (541 from n8n-nodes-base, 262 from @n8n/n8n-nodes-langchain)
- Updated README badge with new n8n version
- Updated CHANGELOG with dependency changes

Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: update n8n-workflow version in Dockerfile for icon type support

The Docker build was using n8n-workflow@^1.96.0 which doesn't have the new
'icon' NodePropertyType. Updated to n8n-workflow@^2.4.2 to match the project's
package.json version.

Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: update comments to reflect 23 NodePropertyTypes

- Updated test comment from '22 standard types' to '23 standard types'
- Updated header comment from n8n-workflow v1.120.3 to v2.4.2

Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-01-21 11:22:26 +01:00
3 changed files with 29 additions and 4 deletions

View File

@@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
## [2.33.4] - 2026-01-21
### Fixed
- **Memory leak in SSE session reset** (Issue #542): Fixed memory leak when SSE sessions are recreated every 5 minutes
- Root cause: `resetSessionSSE()` only closed the transport but not the MCP server
- This left the SimpleCache cleanup timer (60-second interval) running indefinitely
- Database connections and cached data (~50-100MB per session) persisted in memory
- Fix: Added `server.close()` call before `transport.close()`, mirroring the existing cleanup pattern in `removeSession()`
- Impact: Prevents ~288 leaked server instances per day in long-running HTTP deployments
## [2.33.3] - 2026-01-21
### Changed

View File

@@ -1,6 +1,6 @@
{
"name": "n8n-mcp",
"version": "2.33.3",
"version": "2.33.4",
"description": "Integration between n8n workflow automation and Model Context Protocol (MCP)",
"main": "dist/index.js",
"types": "dist/index.d.ts",

View File

@@ -677,11 +677,25 @@ export class SingleSessionHTTPServer {
private async resetSessionSSE(res: express.Response): Promise<void> {
// Clean up old session if exists
if (this.session) {
const sessionId = this.session.sessionId;
logger.info('Closing previous session for SSE', { sessionId });
// Close server first to free resources (database, cache timer, etc.)
// This mirrors the cleanup pattern in removeSession() (issue #542)
// Handle server close errors separately so transport close still runs
if (this.session.server && typeof this.session.server.close === 'function') {
try {
await this.session.server.close();
} catch (serverError) {
logger.warn('Error closing server for SSE session', { sessionId, error: serverError });
}
}
// Close transport last - always attempt even if server.close() failed
try {
logger.info('Closing previous session for SSE', { sessionId: this.session.sessionId });
await this.session.transport.close();
} catch (error) {
logger.warn('Error closing previous session:', error);
} catch (transportError) {
logger.warn('Error closing transport for SSE session', { sessionId, error: transportError });
}
}