mirror of
https://github.com/czlonkowski/n8n-mcp.git
synced 2026-03-24 03:13:07 +00:00
Compare commits
2 Commits
v2.20.4
...
feat/add-s
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
523b897d04 | ||
|
|
9462c654c4 |
132
CHANGELOG.md
132
CHANGELOG.md
@@ -7,138 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
## [2.20.4] - 2025-10-21
|
|
||||||
|
|
||||||
### 🛡️ Safety & Reliability Enhancements
|
|
||||||
|
|
||||||
**HTTP Server Validation Tools - Enhanced Safety Features (builds on PR #343)**
|
|
||||||
|
|
||||||
This release adds defensive safety measures to the HTTP server validation tools response handling, preventing potential memory issues and improving code quality.
|
|
||||||
|
|
||||||
#### Building on PR #343
|
|
||||||
|
|
||||||
PR #343 (merged 2025-10-21) successfully fixed the MCP protocol error -32600 by adding the required `structuredContent` field for validation tools via HTTP transport. This release enhances that fix with additional safety features to match STDIO server behavior.
|
|
||||||
|
|
||||||
#### Added
|
|
||||||
|
|
||||||
**1. TypeScript Interface for Type Safety**
|
|
||||||
- Added `MCPToolResponse` interface (src/http-server.ts:26-35)
|
|
||||||
- Replaced `any` type with proper interface for response objects
|
|
||||||
- Improves IDE autocomplete, catches type errors at compile time
|
|
||||||
- Better code maintainability and refactoring safety
|
|
||||||
|
|
||||||
**2. 1MB Response Size Validation**
|
|
||||||
- Implements size check before adding `structuredContent` (src/http-server.ts:434-449)
|
|
||||||
- Prevents memory exhaustion and potential DoS attacks
|
|
||||||
- Matches STDIO server behavior (src/mcp/server.ts:515-520)
|
|
||||||
- **Logic:**
|
|
||||||
- Check response size: `responseText.length`
|
|
||||||
- If > 1MB: Truncate and skip structuredContent
|
|
||||||
- If <= 1MB: Include structuredContent (normal case)
|
|
||||||
|
|
||||||
**3. Warning Logs for Large Responses**
|
|
||||||
- Logs warnings when validation responses exceed 1MB (src/http-server.ts:438-442)
|
|
||||||
- Includes actual size in logs for debugging
|
|
||||||
- Helps identify performance issues and potential problems
|
|
||||||
- **Example:** `Validation tool validate_workflow response is very large (1500000 chars). Truncating for HTTP transport safety.`
|
|
||||||
|
|
||||||
**4. Response Truncation for Safety**
|
|
||||||
- Truncates responses larger than 1MB to 999KB + message (src/http-server.ts:443-444)
|
|
||||||
- Prevents HTTP transport issues with very large payloads
|
|
||||||
- Ensures client stability even with pathological inputs
|
|
||||||
- **Message:** `[Response truncated due to size limits]`
|
|
||||||
|
|
||||||
#### Technical Details
|
|
||||||
|
|
||||||
**Size Validation Flow:**
|
|
||||||
```typescript
|
|
||||||
// 1. Convert result to JSON
|
|
||||||
let responseText = JSON.stringify(result, null, 2);
|
|
||||||
|
|
||||||
// 2. Check size for validation tools
|
|
||||||
if (toolName.startsWith('validate_')) {
|
|
||||||
const resultSize = responseText.length;
|
|
||||||
|
|
||||||
// 3. Apply 1MB limit
|
|
||||||
if (resultSize > 1000000) {
|
|
||||||
// Large response: truncate and warn
|
|
||||||
logger.warn(`Validation tool ${toolName} response is very large...`);
|
|
||||||
mcpResult.content[0].text = responseText.substring(0, 999000) +
|
|
||||||
'\n\n[Response truncated due to size limits]';
|
|
||||||
// Don't include structuredContent
|
|
||||||
} else {
|
|
||||||
// Normal case: include structured content
|
|
||||||
mcpResult.structuredContent = result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**STDIO Parity:**
|
|
||||||
- HTTP server now matches STDIO server safety features
|
|
||||||
- Same 1MB limit (STDIO: src/mcp/server.ts:516)
|
|
||||||
- Same truncation behavior
|
|
||||||
- Same warning logs (STDIO: src/mcp/server.ts:517)
|
|
||||||
- **Result:** Consistent behavior across both transports
|
|
||||||
|
|
||||||
#### Benefits
|
|
||||||
|
|
||||||
1. **Prevents DoS Attacks** - Size limits prevent malicious large responses from exhausting memory
|
|
||||||
2. **Improves HTTP Transport Stability** - Truncation prevents transport layer issues
|
|
||||||
3. **Better Observability** - Warning logs help identify and debug problems
|
|
||||||
4. **Type Safety** - Interface prevents type-related bugs during development
|
|
||||||
5. **Full STDIO Parity** - Consistent safety features across all transports
|
|
||||||
|
|
||||||
#### Impact
|
|
||||||
|
|
||||||
- **Risk Level:** LOW (only adds safety checks, no logic changes)
|
|
||||||
- **Breaking Changes:** NONE (backward compatible, only adds truncation for edge cases)
|
|
||||||
- **Performance Impact:** Negligible (single length check: O(1))
|
|
||||||
- **Memory Safety:** Significantly improved (prevents unbounded growth)
|
|
||||||
|
|
||||||
#### Testing
|
|
||||||
|
|
||||||
- ✅ TypeScript compilation passes
|
|
||||||
- ✅ Type checking passes (`npm run typecheck`)
|
|
||||||
- ✅ Build succeeds (`npm run build`)
|
|
||||||
- ✅ No breaking changes to existing functionality
|
|
||||||
- ✅ All HTTP validation tools continue working normally
|
|
||||||
|
|
||||||
#### Documentation
|
|
||||||
|
|
||||||
**New Documentation:**
|
|
||||||
- `docs/CI_TEST_INFRASTRUCTURE.md` - Documents known CI test infrastructure issues
|
|
||||||
- Explains why external contributor PRs have integration test failures
|
|
||||||
- Clarifies that these are infrastructure issues, not code quality issues
|
|
||||||
- Provides workarounds and testing strategies
|
|
||||||
- References PR #343 as example
|
|
||||||
|
|
||||||
**Why CI Tests Fail for External PRs:**
|
|
||||||
- GitHub Actions doesn't expose secrets to external contributor PRs (security)
|
|
||||||
- MSW (Mock Service Worker) doesn't intercept requests properly in CI
|
|
||||||
- Integration tests expect mock n8n server that isn't responding
|
|
||||||
- **NOT a code quality issue** - the actual code changes are correct
|
|
||||||
- Local tests work fine, CI infrastructure needs separate fix
|
|
||||||
|
|
||||||
#### Related
|
|
||||||
|
|
||||||
- **Builds on:** PR #343 - fix: add structuredContent to HTTP wrapper for validation tools
|
|
||||||
- **Fixes:** None (enhancement only)
|
|
||||||
- **References:** MCP protocol specification for tools with outputSchema
|
|
||||||
- **CI Issue:** External PR integration test failures documented (infrastructure issue)
|
|
||||||
|
|
||||||
#### Files Changed
|
|
||||||
|
|
||||||
**Code (1 file):**
|
|
||||||
- `src/http-server.ts` - Enhanced with safety features (interface, size validation, logging)
|
|
||||||
|
|
||||||
**Documentation (1 file):**
|
|
||||||
- `docs/CI_TEST_INFRASTRUCTURE.md` - Documents CI test infrastructure known issues (NEW)
|
|
||||||
|
|
||||||
**Configuration (1 file):**
|
|
||||||
- `package.json` - Version bump to 2.20.4
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## [2.20.3] - 2025-10-19
|
## [2.20.3] - 2025-10-19
|
||||||
|
|
||||||
### 🔍 Enhanced Error Messages & Documentation
|
### 🔍 Enhanced Error Messages & Documentation
|
||||||
|
|||||||
@@ -1,111 +0,0 @@
|
|||||||
# CI Test Infrastructure - Known Issues
|
|
||||||
|
|
||||||
## Integration Test Failures for External Contributor PRs
|
|
||||||
|
|
||||||
### Issue Summary
|
|
||||||
|
|
||||||
Integration tests fail for external contributor PRs with "No response from n8n server" errors, despite the code changes being correct. This is a **test infrastructure issue**, not a code quality issue.
|
|
||||||
|
|
||||||
### Root Cause
|
|
||||||
|
|
||||||
1. **GitHub Actions Security**: External contributor PRs don't get access to repository secrets (`N8N_API_URL`, `N8N_API_KEY`, etc.)
|
|
||||||
2. **MSW Mock Server**: Mock Service Worker (MSW) is not properly intercepting HTTP requests in the CI environment
|
|
||||||
3. **Test Configuration**: Integration tests expect `http://localhost:3001/mock-api` but the mock server isn't responding
|
|
||||||
|
|
||||||
### Evidence
|
|
||||||
|
|
||||||
From CI logs (PR #343):
|
|
||||||
```
|
|
||||||
[CI-DEBUG] Global setup complete, N8N_API_URL: http://localhost:3001/mock-api
|
|
||||||
❌ No response from n8n server (repeated 60+ times across 20 tests)
|
|
||||||
```
|
|
||||||
|
|
||||||
The tests ARE using the correct mock URL, but MSW isn't intercepting the requests.
|
|
||||||
|
|
||||||
### Why This Happens
|
|
||||||
|
|
||||||
**For External PRs:**
|
|
||||||
- GitHub Actions doesn't expose repository secrets for security reasons
|
|
||||||
- Prevents malicious PRs from exfiltrating secrets
|
|
||||||
- MSW setup runs but requests don't get intercepted in CI
|
|
||||||
|
|
||||||
**Test Configuration:**
|
|
||||||
- `.env.test` line 19: `N8N_API_URL=http://localhost:3001/mock-api`
|
|
||||||
- `.env.test` line 67: `MSW_ENABLED=true`
|
|
||||||
- CI workflow line 75-80: Secrets set but empty for external PRs
|
|
||||||
|
|
||||||
### Impact
|
|
||||||
|
|
||||||
- ✅ **Code Quality**: NOT affected - the actual code changes are correct
|
|
||||||
- ✅ **Local Testing**: Works fine - MSW intercepts requests locally
|
|
||||||
- ❌ **CI for External PRs**: Integration tests fail (infrastructure issue)
|
|
||||||
- ✅ **CI for Internal PRs**: Works fine (has access to secrets)
|
|
||||||
|
|
||||||
### Current Workarounds
|
|
||||||
|
|
||||||
1. **For Maintainers**: Use `--admin` flag to merge despite failing tests when code is verified correct
|
|
||||||
2. **For Contributors**: Run tests locally where MSW works properly
|
|
||||||
3. **For CI**: Unit tests pass (don't require n8n API), integration tests fail
|
|
||||||
|
|
||||||
### Files Affected
|
|
||||||
|
|
||||||
- `tests/integration/setup/integration-setup.ts` - MSW server setup
|
|
||||||
- `tests/setup/msw-setup.ts` - MSW configuration
|
|
||||||
- `tests/mocks/n8n-api/handlers.ts` - Mock request handlers
|
|
||||||
- `.github/workflows/test.yml` - CI configuration
|
|
||||||
- `.env.test` - Test environment configuration
|
|
||||||
|
|
||||||
### Potential Solutions (Not Implemented)
|
|
||||||
|
|
||||||
1. **Separate Unit/Integration Runs**
|
|
||||||
- Run integration tests only for internal PRs
|
|
||||||
- Skip integration tests for external PRs
|
|
||||||
- Rely on unit tests for external PR validation
|
|
||||||
|
|
||||||
2. **MSW CI Debugging**
|
|
||||||
- Add extensive logging to MSW setup
|
|
||||||
- Check if MSW server actually starts in CI
|
|
||||||
- Verify request interception is working
|
|
||||||
|
|
||||||
3. **Mock Server Process**
|
|
||||||
- Start actual HTTP server in CI instead of MSW
|
|
||||||
- More reliable but adds complexity
|
|
||||||
- Would require test infrastructure refactoring
|
|
||||||
|
|
||||||
4. **Public Test Instance**
|
|
||||||
- Use publicly accessible test n8n instance
|
|
||||||
- Exposes test data, security concerns
|
|
||||||
- Would work for external PRs
|
|
||||||
|
|
||||||
### Decision
|
|
||||||
|
|
||||||
**Status**: Documented but not fixed
|
|
||||||
|
|
||||||
**Rationale**:
|
|
||||||
- Integration test infrastructure refactoring is separate concern from code quality
|
|
||||||
- External PRs are relatively rare compared to internal development
|
|
||||||
- Unit tests provide sufficient coverage for most changes
|
|
||||||
- Maintainers can verify integration tests locally before merging
|
|
||||||
|
|
||||||
### Testing Strategy
|
|
||||||
|
|
||||||
**For External Contributor PRs:**
|
|
||||||
1. ✅ Unit tests must pass
|
|
||||||
2. ✅ TypeScript compilation must pass
|
|
||||||
3. ✅ Build must succeed
|
|
||||||
4. ⚠️ Integration test failures are expected (infrastructure issue)
|
|
||||||
5. ✅ Maintainer verifies locally before merge
|
|
||||||
|
|
||||||
**For Internal PRs:**
|
|
||||||
1. ✅ All tests must pass (unit + integration)
|
|
||||||
2. ✅ Full CI validation
|
|
||||||
|
|
||||||
### References
|
|
||||||
|
|
||||||
- PR #343: First occurrence of this issue
|
|
||||||
- PR #345: Documented the infrastructure issue
|
|
||||||
- Issue: External PRs don't get secrets (GitHub Actions security)
|
|
||||||
|
|
||||||
### Last Updated
|
|
||||||
|
|
||||||
2025-10-21 - Documented as part of PR #345 investigation
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "n8n-mcp",
|
"name": "n8n-mcp",
|
||||||
"version": "2.20.4",
|
"version": "2.20.3",
|
||||||
"description": "Integration between n8n workflow automation and Model Context Protocol (MCP)",
|
"description": "Integration between n8n workflow automation and Model Context Protocol (MCP)",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
"types": "dist/index.d.ts",
|
"types": "dist/index.d.ts",
|
||||||
|
|||||||
@@ -23,17 +23,6 @@ import {
|
|||||||
|
|
||||||
dotenv.config();
|
dotenv.config();
|
||||||
|
|
||||||
/**
|
|
||||||
* MCP tool response format with optional structured content
|
|
||||||
*/
|
|
||||||
interface MCPToolResponse {
|
|
||||||
content: Array<{
|
|
||||||
type: 'text';
|
|
||||||
text: string;
|
|
||||||
}>;
|
|
||||||
structuredContent?: unknown;
|
|
||||||
}
|
|
||||||
|
|
||||||
let expressServer: any;
|
let expressServer: any;
|
||||||
let authToken: string | null = null;
|
let authToken: string | null = null;
|
||||||
|
|
||||||
@@ -412,46 +401,19 @@ export async function startFixedHTTPServer() {
|
|||||||
// Delegate to the MCP server
|
// Delegate to the MCP server
|
||||||
const toolName = jsonRpcRequest.params?.name;
|
const toolName = jsonRpcRequest.params?.name;
|
||||||
const toolArgs = jsonRpcRequest.params?.arguments || {};
|
const toolArgs = jsonRpcRequest.params?.arguments || {};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const result = await mcpServer.executeTool(toolName, toolArgs);
|
const result = await mcpServer.executeTool(toolName, toolArgs);
|
||||||
|
|
||||||
// Convert result to JSON text for content field
|
|
||||||
let responseText = JSON.stringify(result, null, 2);
|
|
||||||
|
|
||||||
// Build MCP-compliant response with structuredContent for validation tools
|
|
||||||
const mcpResult: MCPToolResponse = {
|
|
||||||
content: [
|
|
||||||
{
|
|
||||||
type: 'text',
|
|
||||||
text: responseText
|
|
||||||
}
|
|
||||||
]
|
|
||||||
};
|
|
||||||
|
|
||||||
// Add structuredContent for validation tools (they have outputSchema)
|
|
||||||
// Apply 1MB safety limit to prevent memory issues (matches STDIO server behavior)
|
|
||||||
if (toolName.startsWith('validate_')) {
|
|
||||||
const resultSize = responseText.length;
|
|
||||||
|
|
||||||
if (resultSize > 1000000) {
|
|
||||||
// Response is too large - truncate and warn
|
|
||||||
logger.warn(
|
|
||||||
`Validation tool ${toolName} response is very large (${resultSize} chars). ` +
|
|
||||||
`Truncating for HTTP transport safety.`
|
|
||||||
);
|
|
||||||
mcpResult.content[0].text = responseText.substring(0, 999000) +
|
|
||||||
'\n\n[Response truncated due to size limits]';
|
|
||||||
// Don't include structuredContent for truncated responses
|
|
||||||
} else {
|
|
||||||
// Normal case - include structured content for MCP protocol compliance
|
|
||||||
mcpResult.structuredContent = result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
response = {
|
response = {
|
||||||
jsonrpc: '2.0',
|
jsonrpc: '2.0',
|
||||||
result: mcpResult,
|
result: {
|
||||||
|
content: [
|
||||||
|
{
|
||||||
|
type: 'text',
|
||||||
|
text: JSON.stringify(result, null, 2)
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
id: jsonRpcRequest.id
|
id: jsonRpcRequest.id
|
||||||
};
|
};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
Reference in New Issue
Block a user