{ "name": "Memento MCP — Reminder Bot", "nodes": [ { "parameters": { "rule": { "interval": [ { "field": "cronExpression", "expression": "0 */30 * * * *" } ] } }, "id": "schedule-trigger", "name": "Every 30 Minutes", "type": "n8n-nodes-base.scheduleTrigger", "typeVersion": 1.2, "position": [240, 300] }, { "parameters": { "method": "POST", "url": "http://memento-mcp:3001/mcp", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Content-Type", "value": "application/json" }, { "name": "x-api-key", "value": "={{ $vars.MEMENTO_API_KEY }}" } ] }, "sendBody": true, "specifyBody": "json", "jsonBody": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"tools/call\",\n \"params\": {\n \"name\": \"get_due_reminders\",\n \"arguments\": {}\n }\n}" }, "id": "mcp-get-reminders", "name": "MCP — Get Due Reminders", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [480, 300] }, { "parameters": { "jsCode": "// Parse MCP response\nconst response = $input.item.json;\nconst result = JSON.parse(response.result?.content?.[0]?.text || '[]');\n\nif (!Array.isArray(result) || result.length === 0) {\n return [];\n}\n\nreturn result.map(note => ({\n json: {\n noteId: note.id,\n title: note.title || 'Untitled reminder',\n reminder: note.reminder,\n reminderFormatted: new Date(note.reminder).toLocaleString('en-GB'),\n content: (note.content || '').substring(0, 200),\n labels: Array.isArray(note.labels) ? note.labels.join(', ') : ''\n }\n}));" }, "id": "parse-reminders", "name": "Parse Reminders", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [720, 300] }, { "parameters": { "conditions": { "options": { "caseSensitive": true }, "conditions": [ { "id": "has-items", "leftValue": "={{ $items().length }}", "rightValue": 0, "operator": { "type": "number", "operation": "gt" } } ], "combinator": "and" } }, "id": "check-has-reminders", "name": "Has Reminders?", "type": "n8n-nodes-base.if", "typeVersion": 2.1, "position": [960, 300] }, { "parameters": { "chatId": "={{ $vars.TELEGRAM_CHAT_ID }}", "text": "ā° *Reminder — Memento*\n\nšŸ“Œ *{{ $json.title }}*\nšŸ• {{ $json.reminderFormatted }}\n\n{{ $json.content }}{{ $json.labels ? '\nšŸ·ļø ' + $json.labels : '' }}", "additionalFields": { "parse_mode": "Markdown" } }, "id": "send-telegram", "name": "Send Telegram Notification", "type": "n8n-nodes-base.telegram", "typeVersion": 1.2, "position": [1200, 200], "continueOnFail": true }, { "parameters": { "method": "POST", "url": "http://memento-mcp:3001/mcp", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Content-Type", "value": "application/json" }, { "name": "x-api-key", "value": "={{ $vars.MEMENTO_API_KEY }}" } ] }, "sendBody": true, "specifyBody": "json", "jsonBody": "={\n \"jsonrpc\": \"2.0\",\n \"id\": 2,\n \"method\": \"tools/call\",\n \"params\": {\n \"name\": \"update_note\",\n \"arguments\": {\n \"id\": \"{{ $json.noteId }}\",\n \"isReminderDone\": true\n }\n }\n}" }, "id": "mcp-mark-done", "name": "MCP — Mark Reminder Done", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [1440, 200], "continueOnFail": true } ], "connections": { "Every 30 Minutes": { "main": [[{ "node": "MCP — Get Due Reminders", "type": "main", "index": 0 }]] }, "MCP — Get Due Reminders": { "main": [[{ "node": "Parse Reminders", "type": "main", "index": 0 }]] }, "Parse Reminders": { "main": [[{ "node": "Has Reminders?", "type": "main", "index": 0 }]] }, "Has Reminders?": { "main": [ [{ "node": "Send Telegram Notification", "type": "main", "index": 0 }], [] ] }, "Send Telegram Notification": { "main": [[{ "node": "MCP — Mark Reminder Done", "type": "main", "index": 0 }]] } }, "pinData": {}, "settings": { "executionOrder": "v1" }, "staticData": null, "tags": [{ "id": "memento-mcp", "name": "Memento MCP" }], "triggerCount": 1, "updatedAt": "2026-05-03T00:00:00.000Z", "versionId": "1" }