mirror of
https://github.com/czlonkowski/n8n-mcp.git
synced 2026-01-30 06:22:04 +00:00
* feat: add n8n_deploy_template tool for one-click template deployment (v2.27.0) Add new MCP tool that deploys n8n.io workflow templates directly to user's n8n instance in a single operation. Features: - Fetch template from local database - Extract and report required credentials - Optionally strip credentials (default: true) - Optionally auto-upgrade node typeVersions (default: true) - Optionally validate before deployment (default: true) - Return workflow ID, URL, and setup guidance Parameters: - templateId (required): Template ID from n8n.io - name (optional): Custom workflow name - autoUpgradeVersions (default: true) - validate (default: true) - stripCredentials (default: true) 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: address code review findings for n8n_deploy_template - Fix health check tool count (12 → 13) to include new tool - Add templateId validation (must be positive integer) - Use deep copy of workflow to prevent template mutation - Expand unit tests with negative/zero/decimal validation cases 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> * docs: update README with n8n_deploy_template tool - Update management tools count from 12 to 13 - Add n8n_deploy_template to the tools list 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: prevent workflow validator from mutating node types The validator was incorrectly mutating node types from full form (n8n-nodes-base.*) to short form (nodes-base.*) during validation. This caused deployed workflows to show "?" icons in n8n UI because the API requires full form node types. Also updated SplitInBatches detection to check both node type forms since workflows may contain either format. Conceived by Romuald Członkowski - www.aiadvisors.pl/en 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * test: update tool counts in handlers-n8n-manager test Update expected managementTools count from 12 to 13 and totalAvailable from 19 to 20 to account for the new n8n_deploy_template tool. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * fix: pin MCP SDK and Zod versions to prevent Zod v4 resolution Fixes #440, #444, #446, #447, #450 Root cause: package.json declared `"@modelcontextprotocol/sdk": "^1.20.1"` which allowed npm to resolve to SDK 1.23.0. That version accepts `"zod": "^3.25 || ^4.0"`, causing npm to deduplicate to Zod v4. SDK 1.23.0's `isZ4Schema()` function crashes when called with undefined, which happens for plain JSON Schema objects. Changes: - Pin SDK to exact version 1.20.1 (removes ^ prefix) - Pin Zod to exact version 3.24.1 (removes ^ prefix) - Add CI workflow to verify fresh installs get compatible versions The new CI workflow: - Packs and installs package fresh (without lockfile) - Verifies SDK is exactly 1.20.1 - Verifies Zod is NOT v4 (blocks 4.x.x) - Runs weekly to catch upstream 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> * chore: improve dependency-check workflow based on code review - Add workflow_dispatch for manual triggering/debugging - Add explicit "not found" handling for version detection failures - Use regex pattern for Zod v4 check to catch pre-release versions - Add Zod error pattern detection in functionality test - Capture stderr output for comprehensive error checking 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>
223 lines
7.8 KiB
YAML
223 lines
7.8 KiB
YAML
name: Dependency Compatibility Check
|
|
|
|
# This workflow verifies that when users install n8n-mcp via npm (without lockfile),
|
|
# they get compatible dependency versions. This catches issues like #440, #444, #446, #447, #450
|
|
# where npm resolution gave users incompatible SDK/Zod versions.
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
paths:
|
|
- 'package.json'
|
|
- 'package-lock.json'
|
|
- '.github/workflows/dependency-check.yml'
|
|
pull_request:
|
|
branches: [main]
|
|
paths:
|
|
- 'package.json'
|
|
- 'package-lock.json'
|
|
- '.github/workflows/dependency-check.yml'
|
|
# Allow manual trigger for debugging
|
|
workflow_dispatch:
|
|
# Run weekly to catch upstream dependency changes
|
|
schedule:
|
|
- cron: '0 6 * * 1' # Every Monday at 6 AM UTC
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
fresh-install-check:
|
|
name: Fresh Install Dependency Check
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 10
|
|
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Setup Node.js
|
|
uses: actions/setup-node@v4
|
|
with:
|
|
node-version: 20
|
|
|
|
- name: Build package
|
|
run: |
|
|
npm ci
|
|
npm run build
|
|
|
|
- name: Pack package for testing
|
|
run: npm pack
|
|
|
|
- name: Create fresh install test directory
|
|
run: |
|
|
mkdir -p /tmp/fresh-install-test
|
|
cp n8n-mcp-*.tgz /tmp/fresh-install-test/
|
|
|
|
- name: Install package fresh (simulating user install)
|
|
working-directory: /tmp/fresh-install-test
|
|
run: |
|
|
npm init -y
|
|
# Install from tarball WITHOUT lockfile (simulates npm install n8n-mcp)
|
|
npm install ./n8n-mcp-*.tgz
|
|
|
|
- name: Verify critical dependency versions
|
|
working-directory: /tmp/fresh-install-test
|
|
run: |
|
|
echo "=== Dependency Version Check ==="
|
|
echo ""
|
|
|
|
# Get actual resolved versions
|
|
SDK_VERSION=$(npm list @modelcontextprotocol/sdk --json 2>/dev/null | jq -r '.dependencies["n8n-mcp"].dependencies["@modelcontextprotocol/sdk"].version // .dependencies["@modelcontextprotocol/sdk"].version // "not found"')
|
|
ZOD_VERSION=$(npm list zod --json 2>/dev/null | jq -r '.dependencies["n8n-mcp"].dependencies.zod.version // .dependencies.zod.version // "not found"')
|
|
|
|
echo "MCP SDK version: $SDK_VERSION"
|
|
echo "Zod version: $ZOD_VERSION"
|
|
echo ""
|
|
|
|
# Check MCP SDK version - must be exactly 1.20.1
|
|
if [[ "$SDK_VERSION" == "not found" ]]; then
|
|
echo "❌ FAILED: Could not determine MCP SDK version!"
|
|
echo " The dependency may not have been installed correctly."
|
|
exit 1
|
|
fi
|
|
if [[ "$SDK_VERSION" != "1.20.1" ]]; then
|
|
echo "❌ FAILED: MCP SDK version mismatch!"
|
|
echo " Expected: 1.20.1"
|
|
echo " Got: $SDK_VERSION"
|
|
echo ""
|
|
echo "This can cause runtime errors. See issues #440, #444, #446, #447, #450"
|
|
exit 1
|
|
fi
|
|
echo "✅ MCP SDK version is correct: $SDK_VERSION"
|
|
|
|
# Check Zod version - must be 3.x (not 4.x, including pre-releases)
|
|
if [[ "$ZOD_VERSION" == "not found" ]]; then
|
|
echo "❌ FAILED: Could not determine Zod version!"
|
|
echo " The dependency may not have been installed correctly."
|
|
exit 1
|
|
fi
|
|
if [[ "$ZOD_VERSION" =~ ^4\. ]]; then
|
|
echo "❌ FAILED: Zod v4 detected - incompatible with MCP SDK 1.20.1!"
|
|
echo " Expected: 3.x"
|
|
echo " Got: $ZOD_VERSION"
|
|
echo ""
|
|
echo "Zod v4 causes '_zod' property errors. See issues #440, #444, #446, #447, #450"
|
|
exit 1
|
|
fi
|
|
echo "✅ Zod version is compatible: $ZOD_VERSION"
|
|
|
|
echo ""
|
|
echo "=== All dependency checks passed ==="
|
|
|
|
- name: Test basic functionality
|
|
working-directory: /tmp/fresh-install-test
|
|
run: |
|
|
echo "=== Basic Functionality Test ==="
|
|
|
|
# Create a simple test script
|
|
cat > test-import.mjs << 'EOF'
|
|
import { spawn } from 'child_process';
|
|
import path from 'path';
|
|
import { fileURLToPath } from 'url';
|
|
|
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
|
|
// Test that the package can be required and basic tools work
|
|
async function test() {
|
|
console.log('Testing n8n-mcp package import...');
|
|
|
|
// Start the MCP server briefly to verify it initializes
|
|
const serverPath = path.join(__dirname, 'node_modules/n8n-mcp/dist/mcp/index.js');
|
|
|
|
const proc = spawn('node', [serverPath], {
|
|
env: { ...process.env, MCP_MODE: 'stdio' },
|
|
stdio: ['pipe', 'pipe', 'pipe']
|
|
});
|
|
|
|
// Send initialize request
|
|
const initRequest = JSON.stringify({
|
|
jsonrpc: '2.0',
|
|
id: 1,
|
|
method: 'initialize',
|
|
params: {
|
|
protocolVersion: '2024-11-05',
|
|
capabilities: {},
|
|
clientInfo: { name: 'test', version: '1.0.0' }
|
|
}
|
|
});
|
|
|
|
proc.stdin.write(initRequest + '\n');
|
|
|
|
// Wait for response or timeout
|
|
let output = '';
|
|
let stderrOutput = '';
|
|
proc.stdout.on('data', (data) => {
|
|
output += data.toString();
|
|
});
|
|
|
|
proc.stderr.on('data', (data) => {
|
|
stderrOutput += data.toString();
|
|
console.error('stderr:', data.toString());
|
|
});
|
|
|
|
// Give it 5 seconds to respond
|
|
await new Promise((resolve) => setTimeout(resolve, 5000));
|
|
|
|
proc.kill();
|
|
|
|
// Check for Zod v4 compatibility errors (the bug we're testing for)
|
|
const allOutput = output + stderrOutput;
|
|
if (allOutput.includes('_zod') || allOutput.includes('Cannot read properties of undefined')) {
|
|
console.error('❌ FAILED: Zod compatibility error detected!');
|
|
console.error('This indicates the SDK/Zod version fix is not working.');
|
|
console.error('See issues #440, #444, #446, #447, #450');
|
|
process.exit(1);
|
|
}
|
|
|
|
if (output.includes('"result"')) {
|
|
console.log('✅ MCP server initialized successfully');
|
|
return true;
|
|
} else {
|
|
console.log('Output received:', output.substring(0, 500));
|
|
// Server might not respond in stdio mode without proper framing
|
|
// But if we got here without crashing, that's still good
|
|
console.log('✅ MCP server started without errors');
|
|
return true;
|
|
}
|
|
}
|
|
|
|
test()
|
|
.then(() => {
|
|
console.log('=== Basic functionality test passed ===');
|
|
process.exit(0);
|
|
})
|
|
.catch((err) => {
|
|
console.error('❌ Test failed:', err.message);
|
|
process.exit(1);
|
|
});
|
|
EOF
|
|
|
|
node test-import.mjs
|
|
|
|
- name: Generate dependency report
|
|
if: always()
|
|
working-directory: /tmp/fresh-install-test
|
|
run: |
|
|
echo "=== Full Dependency Tree ===" > dependency-report.txt
|
|
npm list --all >> dependency-report.txt 2>&1 || true
|
|
|
|
echo "" >> dependency-report.txt
|
|
echo "=== Critical Dependencies ===" >> dependency-report.txt
|
|
npm list @modelcontextprotocol/sdk zod zod-to-json-schema >> dependency-report.txt 2>&1 || true
|
|
|
|
cat dependency-report.txt
|
|
|
|
- name: Upload dependency report
|
|
if: always()
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: dependency-report-${{ github.run_number }}
|
|
path: /tmp/fresh-install-test/dependency-report.txt
|
|
retention-days: 30
|