diff --git a/N8N_WORKFLOW_GUIDE.md b/N8N_WORKFLOW_GUIDE.md new file mode 100644 index 0000000..2dea960 --- /dev/null +++ b/N8N_WORKFLOW_GUIDE.md @@ -0,0 +1,336 @@ +# Taskade MCP Server - n8n Integration Guide + +## Overview + +This n8n workflow provides a complete **MCP (Model Context Protocol) server** integration for the Taskade API. It implements all 21 Taskade API endpoints as AI-powered HTTP Request Tool nodes, accessible through a centralized MCP Server Trigger. + +## Architecture + +``` +┌─────────────────────────────────┐ +│ MCP Server Trigger Node │ ← Entry point for AI/MCP clients +│ (@n8n/n8n-nodes-langchain. │ +│ mcpTrigger) │ +└────────────┬────────────────────┘ + │ ai_tool connections + ├─────────────────────────────────┐ + │ │ + ▼ ▼ +┌──────────────────────┐ ┌──────────────────────┐ +│ HTTP Request Tool │ │ HTTP Request Tool │ +│ workspacesGet │ ... │ folderProjectsGet │ +│ (httpRequestTool) │ │ (httpRequestTool) │ +└──────────────────────┘ └──────────────────────┘ + (21 AI-enabled HTTP tool nodes) +``` + +## Key Features + +- **AI-Native Design**: Uses `$fromAI()` function for dynamic parameter extraction from AI requests +- **MCP Protocol**: Fully compliant with Model Context Protocol standard +- **21 Tool Nodes**: Complete coverage of Taskade API endpoints +- **ai_tool Connections**: All tools connect via `ai_tool` type for AI orchestration +- **Zero Manual Routing**: MCP Trigger automatically routes requests to the appropriate tool + +## Workflow Components + +### 1. MCP Server Trigger +- **Type**: `@n8n/n8n-nodes-langchain.mcpTrigger` (v2) +- **Path**: `/taskade-mcp-server` +- **Purpose**: Acts as the MCP server endpoint, automatically routing tool calls to HTTP Request Tool nodes +- **Webhook ID**: `taskade-mcp-server` + +### 2. HTTP Request Tool Nodes (21 nodes) + +All nodes use: +- **Type**: `n8n-nodes-base.httpRequestTool` (v4.3) +- **Connection Type**: `ai_tool` (connects to MCP Trigger) +- **Parameter Extraction**: `$fromAI()` function for AI-driven parameter passing +- **Authentication**: Bearer token via `$fromAI('api_key', ...)` + +#### Workspace Operations (3 tools) +1. **workspacesGet** - Get all workspaces +2. **workspaceCreateProject** - Create project in workspace +3. **workspaceFoldersGet** - Get folders in workspace + +#### Project Operations (5 tools) +4. **projectGet** - Get project by ID +5. **projectCreate** - Create new project +6. **projectCopy** - Copy existing project +7. **projectBlocksGet** - Get project blocks (with pagination) +8. **projectTasksGet** - Get project tasks (with pagination) + +#### Task Operations (12 tools) +9. **taskGet** - Get task by ID +10. **taskPut** - Update task content +11. **taskCreate** - Create one or more tasks +12. **taskComplete** - Mark task as complete +13. **taskMove** - Move task within project +14. **taskAssigneesGet** - Get task assignees +15. **taskPutAssignees** - Assign users to task +16. **taskDeleteAssignees** - Remove assignee from task +17. **taskGetDate** - Get task date +18. **taskPutDate** - Set or update task date +19. **taskDeleteDate** - Delete task date +20. **taskNotePut** - Add/update task note + +#### Folder Operations (1 tool) +21. **folderProjectsGet** - Get projects in folder + +## Installation + +### Prerequisites +- n8n instance (v1.0+ with LangChain node support) +- Taskade API key from https://www.taskade.com/settings/password +- MCP-compatible AI client (Claude Desktop, Cline, etc.) + +### Setup Steps + +1. **Import the Workflow** + - In n8n, go to: Workflows → Import from File + - Select `n8n-taskade-mcp-workflow.json` + - Click Import + +2. **Activate the Workflow** + - Open the imported workflow + - Click "Activate" in the top right corner + +3. **Get Your MCP Server URL** + - Click on the "MCP Server Trigger" node + - Copy the production URL (e.g., `https://your-n8n.com/webhook/taskade-mcp-server`) + +4. **Configure Your AI Client** + + For **Claude Desktop**, edit `claude_desktop_config.json`: + ```json + { + "mcpServers": { + "taskade-n8n": { + "url": "https://your-n8n.com/webhook/taskade-mcp-server", + "apiKey": "YOUR_TASKADE_API_KEY" + } + } + } + ``` + + For **Cline/Cursor**, edit MCP settings: + ```json + { + "mcpServers": { + "taskade-n8n": { + "url": "https://your-n8n.com/webhook/taskade-mcp-server", + "headers": { + "api_key": "YOUR_TASKADE_API_KEY" + } + } + } + } + ``` + +## Usage + +### How It Works + +1. **AI Client** sends MCP tool request to n8n webhook +2. **MCP Trigger** receives request and identifies the tool +3. **HTTP Request Tool** extracts parameters using `$fromAI()` +4. **Taskade API** receives the formatted HTTP request +5. **Response** flows back through the MCP protocol to the AI client + +### Example AI Interactions + +Once configured, simply chat with your AI client: + +``` +User: "Get all my Taskade workspaces" +AI: [Calls workspacesGet tool via MCP] +→ Returns list of workspaces + +User: "Create a new task in project abc123 with content 'Review PR'" +AI: [Calls taskCreate tool with projectId and task data] +→ Creates task and returns task details + +User: "Assign @john to task xyz789 in project abc123" +AI: [Calls taskPutAssignees with projectId, taskId, and handles] +→ Assigns user and confirms +``` + +### Direct MCP Tool Calls + +You can also test tools directly using MCP protocol: + +```json +POST https://your-n8n.com/webhook/taskade-mcp-server +Content-Type: application/json + +{ + "method": "tools/call", + "params": { + "name": "workspacesGet", + "arguments": { + "api_key": "your_taskade_api_key" + } + } +} +``` + +## Tool Reference + +| Tool Name | HTTP Method | Endpoint Pattern | Required Parameters | +|-----------|-------------|------------------|---------------------| +| `workspacesGet` | GET | `/workspaces` | `api_key` | +| `workspaceCreateProject` | POST | `/workspaces/{workspaceId}/projects` | `api_key`, `workspaceId`, `content` | +| `workspaceFoldersGet` | GET | `/workspaces/{workspaceId}/folders` | `api_key`, `workspaceId` | +| `projectGet` | GET | `/projects/{projectId}` | `api_key`, `projectId` | +| `projectCreate` | POST | `/projects` | `api_key`, `content` | +| `projectCopy` | POST | `/projects/{projectId}/copy` | `api_key`, `projectId` | +| `projectBlocksGet` | GET | `/projects/{projectId}/blocks` | `api_key`, `projectId` | +| `projectTasksGet` | GET | `/projects/{projectId}/tasks` | `api_key`, `projectId` | +| `taskGet` | GET | `/projects/{projectId}/tasks/{taskId}` | `api_key`, `projectId`, `taskId` | +| `taskPut` | PUT | `/projects/{projectId}/tasks/{taskId}` | `api_key`, `projectId`, `taskId`, `content` | +| `taskCreate` | POST | `/projects/{projectId}/tasks/` | `api_key`, `projectId`, `tasks` | +| `taskComplete` | POST | `/projects/{projectId}/tasks/{taskId}/complete` | `api_key`, `projectId`, `taskId` | +| `taskMove` | PUT | `/projects/{projectId}/tasks/{taskId}/move` | `api_key`, `projectId`, `taskId`, `target` | +| `taskAssigneesGet` | GET | `/projects/{projectId}/tasks/{taskId}/assignees` | `api_key`, `projectId`, `taskId` | +| `taskPutAssignees` | PUT | `/projects/{projectId}/tasks/{taskId}/assignees` | `api_key`, `projectId`, `taskId`, `handles` | +| `taskDeleteAssignees` | DELETE | `/projects/{projectId}/tasks/{taskId}/assignees/{assigneeHandle}` | `api_key`, `projectId`, `taskId`, `assigneeHandle` | +| `taskGetDate` | GET | `/projects/{projectId}/tasks/{taskId}/date` | `api_key`, `projectId`, `taskId` | +| `taskPutDate` | PUT | `/projects/{projectId}/tasks/{taskId}/date` | `api_key`, `projectId`, `taskId` | +| `taskDeleteDate` | DELETE | `/projects/{projectId}/tasks/{taskId}/date` | `api_key`, `projectId`, `taskId` | +| `taskNotePut` | PUT | `/projects/{projectId}/tasks/{taskId}/note` | `api_key`, `projectId`, `taskId`, `value` | +| `folderProjectsGet` | GET | `/folders/{folderId}/projects` | `api_key`, `folderId` | + +## Technical Details + +### $fromAI() Function + +The `$fromAI()` function is n8n's mechanism for extracting parameters from AI/MCP requests: + +```javascript +$fromAI('parameterName', 'Description for AI', 'dataType') +``` + +Example from workflow: +```javascript +"url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'The project ID', 'string') }}" +``` + +### ai_tool Connection Type + +All HTTP Request Tool nodes connect to the MCP Trigger using `ai_tool` connection type: + +```json +"connections": { + "workspacesGet": { + "ai_tool": [ + [ + { + "node": "MCP Server Trigger", + "type": "ai_tool", + "index": 0 + } + ] + ] + } +} +``` + +### Authentication Flow + +1. AI client sends `api_key` parameter +2. Each tool extracts it via `$fromAI('api_key', ...)` +3. Tool formats as: `Bearer {api_key}` in Authorization header +4. Taskade API validates and processes request + +## Troubleshooting + +### Common Issues + +**"Tool not found"** +- Verify the workflow is activated in n8n +- Check that all 21 tools are properly connected to MCP Trigger +- Ensure tool names match exactly (case-sensitive) + +**"Missing api_key parameter"** +- AI client must send `api_key` with every request +- Check your MCP client configuration includes the API key +- Verify the key is valid at https://www.taskade.com/settings/password + +**"$fromAI is not defined"** +- Ensure you're using n8n v1.0+ with LangChain support +- Update n8n if using older version +- Check that nodes are `httpRequestTool` type, not `httpRequest` + +**"Connection type 'ai_tool' not recognized"** +- Verify n8n supports LangChain nodes +- Reimport the workflow JSON +- Check that MCP Trigger is `@n8n/n8n-nodes-langchain.mcpTrigger` + +### Testing Individual Tools + +Test a single tool by sending MCP request: + +```bash +curl -X POST https://your-n8n.com/webhook/taskade-mcp-server \ + -H "Content-Type: application/json" \ + -d '{ + "method": "tools/call", + "params": { + "name": "workspacesGet", + "arguments": { + "api_key": "your_api_key" + } + } + }' +``` + +## Advanced Configuration + +### Custom Tool Descriptions + +Edit node descriptions to improve AI understanding: + +1. Click on any HTTP Request Tool node +2. Update the "Description" field in node settings +3. Save and reactivate workflow + +### Adding Rate Limiting + +Add rate limiting to the MCP Trigger: + +1. Add a "Rate Limit" node before HTTP tools +2. Configure requests per time window +3. Reconnect via ai_tool connections + +### Error Handling + +Add error handling nodes: + +1. Create an "Error Trigger" node +2. Configure notification (email, Slack, etc.) +3. Link to failed tool executions + +## API Documentation + +- **Taskade API Docs**: https://developers.taskade.com +- **MCP Protocol**: https://modelcontextprotocol.io +- **n8n LangChain Nodes**: https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.mcptrigger/ + +## Support + +- **Taskade**: + - Community: https://www.taskade.com/community + - Email: hello@taskade.com + - GitHub: https://github.com/taskade/mcp + +- **n8n**: + - Community: https://community.n8n.io + - Docs: https://docs.n8n.io + +## License + +This workflow is part of the Taskade MCP project. See LICENSE file for details. + +--- + +**Note**: This workflow requires n8n v1.0+ with LangChain node support. For older n8n versions, use the legacy webhook-based approach. diff --git a/n8n-taskade-mcp-workflow.json b/n8n-taskade-mcp-workflow.json new file mode 100644 index 0000000..66db957 --- /dev/null +++ b/n8n-taskade-mcp-workflow.json @@ -0,0 +1,1046 @@ +{ + "name": "Taskade MCP Server Integration", + "nodes": [ + { + "parameters": { + "path": "taskade-mcp-server" + }, + "type": "@n8n/n8n-nodes-langchain.mcpTrigger", + "typeVersion": 2, + "position": [400, 300], + "id": "mcp-trigger-taskade", + "name": "MCP Server Trigger", + "webhookId": "taskade-mcp-server" + }, + { + "parameters": { + "method": "GET", + "url": "https://www.taskade.com/api/v1/workspaces", + "authentication": "none", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password. Format: Bearer token for authentication.', 'string') }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 100], + "id": "http-workspaces-get", + "name": "workspacesGet", + "description": "Get all workspaces for a user. Returns an array of workspace objects, each containing an id (alphanumeric string of 16 or 9 characters) and name. Workspaces are the top-level organizational units in Taskade. Use this to list all workspaces accessible to the authenticated user. Response: {ok: true, items: [{id: string, name: string}]}" + }, + { + "parameters": { + "method": "POST", + "url": "={{ 'https://www.taskade.com/api/v1/workspaces/' + $fromAI('workspaceId', 'REQUIRED: The workspace ID where the project will be created. Alphanumeric string of 16 or 9 characters (may include underscores or hyphens). Get workspace IDs using workspacesGet tool.', 'string') + '/projects' }}", + "authentication": "none", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "bodyParameters": { + "parameters": [ + { + "name": "contentType", + "value": "={{ $fromAI('contentType', 'REQUIRED: Content type for the project. MUST be \"text/markdown\" (no other values accepted). This determines how the project content is formatted.', 'string') }}" + }, + { + "name": "content", + "value": "={{ $fromAI('content', 'REQUIRED: Initial content for the new project in markdown format. This will be the project\\'s starting content/template.', 'string') }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 200], + "id": "http-workspace-create-project", + "name": "workspaceCreateProject", + "description": "Create a project in a workspace. Projects are containers for tasks, notes, and collaborative work. Returns the newly created project object with id (16-character alphanumeric) and name. Use this to create new projects within a specific workspace. Response: {ok: true, item: {id: string, name: string}}" + }, + { + "parameters": { + "method": "GET", + "url": "={{ 'https://www.taskade.com/api/v1/workspaces/' + $fromAI('workspaceId', 'REQUIRED: The workspace ID to get folders from. Alphanumeric string of 16 or 9 characters (may include underscores or hyphens). Get workspace IDs using workspacesGet tool.', 'string') + '/folders' }}", + "authentication": "none", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 300], + "id": "http-workspace-folders-get", + "name": "workspaceFoldersGet", + "description": "Get all folders for a workspace. Folders organize projects within a workspace. Returns an array of folder objects, each containing id (alphanumeric string of 16 or 9 characters) and name. Folders are nullable in the response. Use this to navigate the folder structure of a workspace. Response: {ok: true, items: [{id: string, name: string}]}" + }, + { + "parameters": { + "method": "GET", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'REQUIRED: The project ID to retrieve. Alphanumeric string that is 16 characters long. Get project IDs using folderProjectsGet, workspaceCreateProject, or projectCreate tools.', 'string') }}", + "authentication": "none", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 400], + "id": "http-project-get", + "name": "projectGet", + "description": "Get project details by ID. Returns a project object containing id (16-character alphanumeric string) and name (project title). Use this to retrieve basic information about a specific project. Response: {ok: true, item: {id: string, name: string}}" + }, + { + "parameters": { + "method": "POST", + "url": "https://www.taskade.com/api/v1/projects", + "authentication": "none", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "bodyParameters": { + "parameters": [ + { + "name": "folderId", + "value": "={{ $fromAI('folderId', 'REQUIRED: The folder ID where the project will be created. String with minimum 1 character. Get folder IDs using workspaceFoldersGet tool.', 'string') }}" + }, + { + "name": "contentType", + "value": "={{ $fromAI('contentType', 'REQUIRED: Content type for the project. MUST be \"text/markdown\" (no other values accepted). This determines how the project content is formatted.', 'string') }}" + }, + { + "name": "content", + "value": "={{ $fromAI('content', 'REQUIRED: Initial content for the new project in markdown format. This will be the project\\'s starting content/template.', 'string') }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 500], + "id": "http-project-create", + "name": "projectCreate", + "description": "Create a project in a team. Projects are collaborative workspaces for tasks and content. Returns the newly created project object with id and name. The project will be created in the specified folder. Response is nullable. Use this to create new projects within a team folder. Response: {ok: true, item: {id: string, name: string} | null}" + }, + { + "parameters": { + "method": "POST", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'REQUIRED: The project ID to copy. Alphanumeric string that is 16 characters long. Source project will be duplicated.', 'string') + '/copy' }}", + "authentication": "none", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "bodyParameters": { + "parameters": [ + { + "name": "folderId", + "value": "={{ $fromAI('folderId', 'REQUIRED: Destination folder ID where the copied project will be placed. String with minimum 1 character. Get folder IDs using workspaceFoldersGet tool.', 'string') }}" + }, + { + "name": "projectTitle", + "value": "={{ $fromAI('projectTitle', 'OPTIONAL: New project title for the copy. String with minimum 1 character. If not provided, the original project name will be used.', 'string') }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 600], + "id": "http-project-copy", + "name": "projectCopy", + "description": "Copy a project to a folder. Creates a duplicate of an existing project with all its content and structure in the specified destination folder. Returns the newly copied project object. Response is nullable. Use this to replicate project templates or backup projects. Response: {ok: true, item: {id: string, name: string} | null}" + }, + { + "parameters": { + "method": "GET", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'REQUIRED: The project ID to get blocks from. Alphanumeric string that is 16 characters long.', 'string') + '/blocks' }}", + "authentication": "none", + "sendQuery": true, + "queryParameters": { + "parameters": [ + { + "name": "limit", + "value": "={{ $fromAI('limit', 'OPTIONAL: Number of blocks to return. Type: number. Default: 100. Controls pagination page size.', 'number') }}" + }, + { + "name": "after", + "value": "={{ $fromAI('after', 'OPTIONAL: Cursor for pagination. UUID format. Specify block ID to get blocks after it. Do NOT specify both after and before simultaneously. Use for forward pagination.', 'string') }}" + }, + { + "name": "before", + "value": "={{ $fromAI('before', 'OPTIONAL: Cursor for pagination. UUID format. Specify block ID to get blocks before it. Do NOT specify both before and after simultaneously. Use for backward pagination.', 'string') }}" + } + ] + }, + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 700], + "id": "http-project-blocks-get", + "name": "projectBlocksGet", + "description": "Get all blocks for a project with cursor-based pagination. Blocks are content elements within a project (paragraphs, headings, etc.). Returns an array of block objects, each containing id (UUID), text, and completed (boolean, default false). Use limit, after, or before parameters to paginate through large sets of blocks. Response: {ok: true, items: [{id: string (UUID), text: string, completed: boolean}]}" + }, + { + "parameters": { + "method": "GET", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'REQUIRED: The project ID to get tasks from. Alphanumeric string that is 16 characters long.', 'string') + '/tasks' }}", + "authentication": "none", + "sendQuery": true, + "queryParameters": { + "parameters": [ + { + "name": "limit", + "value": "={{ $fromAI('limit', 'OPTIONAL: Number of tasks to return. Type: number. Default: 100. Controls pagination page size.', 'number') }}" + }, + { + "name": "after", + "value": "={{ $fromAI('after', 'OPTIONAL: Cursor for pagination. UUID format. Specify task ID to get tasks after it. Do NOT specify both after and before simultaneously. Use for forward pagination.', 'string') }}" + }, + { + "name": "before", + "value": "={{ $fromAI('before', 'OPTIONAL: Cursor for pagination. UUID format. Specify task ID to get tasks before it. Do NOT specify both before and after simultaneously. Use for backward pagination.', 'string') }}" + } + ] + }, + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 800], + "id": "http-project-tasks-get", + "name": "projectTasksGet", + "description": "Get all tasks for a project with cursor-based pagination. Tasks are actionable items within a project. Returns an array of task objects, each containing id (UUID), text, parentId (UUID), and completed (boolean, default false). Use limit, after, or before parameters to paginate through large task lists. Response: {ok: true, items: [{id: string (UUID), text: string, parentId: string (UUID), completed: boolean}]}" + }, + { + "parameters": { + "method": "GET", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'REQUIRED: The project ID containing the task. Alphanumeric string that is 16 characters long.', 'string') + '/tasks/' + $fromAI('taskId', 'REQUIRED: The task ID to retrieve. UUID format. Get task IDs using projectTasksGet tool.', 'string') }}", + "authentication": "none", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 900], + "id": "http-task-get", + "name": "taskGet", + "description": "Get task with id. Returns a specific task object containing id (UUID), text, parentId (UUID), and completed (boolean). Response is nullable. Use this to retrieve detailed information about a single task. Response: {ok: true, item: {id: string (UUID), text: string, parentId: string (UUID), completed: boolean} | null}" + }, + { + "parameters": { + "method": "PUT", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'REQUIRED: The project ID containing the task. Alphanumeric string that is 16 characters long.', 'string') + '/tasks/' + $fromAI('taskId', 'REQUIRED: The task ID to update. UUID format.', 'string') }}", + "authentication": "none", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "bodyParameters": { + "parameters": [ + { + "name": "contentType", + "value": "={{ $fromAI('contentType', 'REQUIRED: Content type for the task. MUST be \"text/markdown\" OR \"text/plain\". Determines how the task content is formatted.', 'string') }}" + }, + { + "name": "content", + "value": "={{ $fromAI('content', 'REQUIRED: New task content. MUST be single line (no \\\\r or \\\\n characters allowed). Maximum 2000 characters. Pattern: ^[^\\\\r\\\\n]*$', 'string') }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 1000], + "id": "http-task-put", + "name": "taskPut", + "description": "Update task content. Modifies the text content of an existing task. Content must be a single line with no line breaks, maximum 2000 characters. Returns the updated task object. Response is nullable. Use this to edit task descriptions or titles. Response: {ok: true, item: {id: string (UUID), text: string, parentId: string (UUID), completed: boolean} | null}" + }, + { + "parameters": { + "method": "POST", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'REQUIRED: Unique identifier for the project where tasks will be created. Alphanumeric string that is 16 characters long.', 'string') + '/tasks/' }}", + "authentication": "none", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "bodyParameters": { + "parameters": [ + { + "name": "tasks", + "value": "={{ $fromAI('tasks', 'REQUIRED: Array of task objects (max 20 items). Each task MUST have: {\"contentType\": \"text/markdown\"|\"text/plain\", \"content\": \"text (max 2000 chars)\", \"placement\": \"afterbegin\"|\"beforeend\"|\"beforebegin\"|\"afterend\", \"taskId\": \"null\"|UUID}. For project-level placement use taskId: null with placement: afterbegin|beforeend. For relative placement use taskId: UUID with placement: beforebegin|afterbegin|beforeend|afterend. Example: [{\"contentType\":\"text/plain\",\"content\":\"New task\",\"taskId\":null,\"placement\":\"beforeend\"}]', 'string') }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 1100], + "id": "http-task-create", + "name": "taskCreate", + "description": "Create one or more tasks in a project. Can create up to 20 tasks in a single request. Each task requires contentType (text/markdown or text/plain), content (max 2000 chars), and placement info. Placement determines where tasks appear: use taskId=null with placement=afterbegin/beforeend for project-level positioning, or taskId=UUID with placement=beforebegin/afterbegin/beforeend/afterend for positioning relative to another task. Returns array of created task objects. Response: {ok: true, item: [{id: string (UUID), text: string, parentId: string (UUID), completed: boolean}]}" + }, + { + "parameters": { + "method": "POST", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'REQUIRED: The project ID containing the task. Alphanumeric string that is 16 characters long.', 'string') + '/tasks/' + $fromAI('taskId', 'REQUIRED: The task ID to mark as complete. UUID format.', 'string') + '/complete' }}", + "authentication": "none", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 1200], + "id": "http-task-complete", + "name": "taskComplete", + "description": "Complete a task in a project. Marks the specified task as completed, setting its completed property to true. Returns the updated task object. Response is nullable. Use this to mark tasks as done. To undo completion, use taskUncomplete tool. Response: {ok: true, item: {id: string (UUID), text: string, parentId: string (UUID), completed: true} | null}" + }, + { + "parameters": { + "method": "PUT", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'REQUIRED: The project ID containing the task. Alphanumeric string that is 16 characters long.', 'string') + '/tasks/' + $fromAI('taskId', 'REQUIRED: The task ID to move. UUID format.', 'string') + '/move' }}", + "authentication": "none", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "bodyParameters": { + "parameters": [ + { + "name": "target", + "value": "={{ $fromAI('target', 'REQUIRED: Target object defining new position. Format: {\"taskId\": \"UUID (min 1 char)\", \"position\": \"beforebegin\"|\"afterbegin\"|\"beforeend\"|\"afterend\"}. Position values: beforebegin=before target task, afterbegin=as first child of target, beforeend=as last child of target, afterend=after target task. Example: {\"taskId\":\"abc123\",\"position\":\"afterend\"}', 'string') }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 1300], + "id": "http-task-move", + "name": "taskMove", + "description": "Move a task within the project. Repositions a task relative to another task using position values: beforebegin (before target), afterbegin (first child of target), beforeend (last child of target), or afterend (after target). Returns the moved task object. Response is nullable. Use this to reorganize task hierarchy and order. Response: {ok: true, item: {id: string (UUID), text: string, parentId: string (UUID), completed: boolean} | null}" + }, + { + "parameters": { + "method": "GET", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'REQUIRED: The project ID containing the task. Alphanumeric string that is 16 characters long.', 'string') + '/tasks/' + $fromAI('taskId', 'REQUIRED: The task ID to get assignees for. UUID format.', 'string') + '/assignees' }}", + "authentication": "none", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 1400], + "id": "http-task-assignees-get", + "name": "taskAssigneesGet", + "description": "Get the assignees of a task. Returns an array of user objects currently assigned to the task. Each user object contains handle (required) and displayName. Use this to see who is responsible for a task. Related tools: taskPutAssignees (assign users), taskDeleteAssignees (remove assignee). Response: {ok: true, items: [{handle: string, displayName: string}]}" + }, + { + "parameters": { + "method": "PUT", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'REQUIRED: The project ID containing the task. Alphanumeric string that is 16 characters long.', 'string') + '/tasks/' + $fromAI('taskId', 'REQUIRED: The task ID to assign users to. UUID format.', 'string') + '/assignees' }}", + "authentication": "none", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "bodyParameters": { + "parameters": [ + { + "name": "handles", + "value": "={{ $fromAI('handles', 'REQUIRED: Array of user handles to assign to this task. Each handle must be a string with minimum 1 character. IMPORTANT: This REPLACES all existing assignees. To add assignees, include existing handles from taskAssigneesGet plus new ones. Example: [\"user1\",\"user2\"]', 'string') }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 1500], + "id": "http-task-put-assignees", + "name": "taskPutAssignees", + "description": "Task assignment. REPLACES all existing assignees with the provided list of user handles. To add assignees without removing existing ones, first use taskAssigneesGet to get current assignees, then include them in the handles array along with new assignees. Returns the updated task object. Response is nullable. Related tools: taskAssigneesGet (view assignees), taskDeleteAssignees (remove single assignee). Response: {ok: true, item: {id: string (UUID), text: string, parentId: string (UUID), completed: boolean} | null}" + }, + { + "parameters": { + "method": "DELETE", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'REQUIRED: The project ID containing the task. Alphanumeric string that is 16 characters long.', 'string') + '/tasks/' + $fromAI('taskId', 'REQUIRED: The task ID to remove assignee from. UUID format.', 'string') + '/assignees/' + $fromAI('assigneeHandle', 'REQUIRED: The user handle to remove from task assignees. String identifying the user. Get assignee handles using taskAssigneesGet tool.', 'string') }}", + "authentication": "none", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 1600], + "id": "http-task-delete-assignees", + "name": "taskDeleteAssignees", + "description": "Remove assignee from a task. Removes a single user from the task's assignee list by their handle. Returns the updated task object. Response is nullable. Use this to unassign a specific user while keeping other assignees. Related tools: taskPutAssignees (set all assignees), taskAssigneesGet (view assignees). Response: {ok: true, item: {id: string (UUID), text: string, parentId: string (UUID), completed: boolean} | null}" + }, + { + "parameters": { + "method": "GET", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'REQUIRED: The project ID containing the task. Alphanumeric string that is 16 characters long.', 'string') + '/tasks/' + $fromAI('taskId', 'REQUIRED: The task ID to get date for. UUID format.', 'string') + '/date' }}", + "authentication": "none", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 1700], + "id": "http-task-get-date", + "name": "taskGetDate", + "description": "Get the date of a task. Returns date information containing start (required) and end (optional, nullable). Each date object has: date (required, YYYY-MM-DD format matching ^\\d{4}-\\d{2}-\\d{2}$), time (optional nullable, HH:MM:SS format matching ^(?:[0-1][0-9]|[2][0-3]):[0-5][0-9](?::[0-5][0-9])?$), timezone (optional nullable). End can also be {period: string}. Use this to retrieve task scheduling information. Related tools: taskPutDate (set/update), taskDeleteDate (remove). Response: {ok: true, item: {start: {date: string, time: string|null, timezone: string|null}, end: {date: string, time: string|null, timezone: string|null}|{period: string}|null}}" + }, + { + "parameters": { + "method": "PUT", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'REQUIRED: The project ID containing the task. Alphanumeric string that is 16 characters long.', 'string') + '/tasks/' + $fromAI('taskId', 'REQUIRED: The task ID to set date for. UUID format.', 'string') + '/date' }}", + "authentication": "none", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "bodyParameters": { + "parameters": [ + { + "name": "start", + "value": "={{ $fromAI('start', 'REQUIRED: Start date object. Format: {\"date\": \"YYYY-MM-DD\" (pattern ^\\\\d{4}-\\\\d{2}-\\\\d{2}$), \"time\": \"HH:MM:SS\"|null (pattern ^(?:[0-1][0-9]|[2][0-3]):[0-5][0-9](?::[0-5][0-9])?$, nullable), \"timezone\": \"America/New_York\"|null (nullable)}. Date is required, time and timezone are optional. Example: {\"date\":\"2025-12-31\",\"time\":\"14:30:00\",\"timezone\":\"America/New_York\"}', 'string') }}" + }, + { + "name": "end", + "value": "={{ $fromAI('end', 'OPTIONAL: End date object. Same format as start: {\"date\": \"YYYY-MM-DD\", \"time\": \"HH:MM:SS\"|null, \"timezone\": \"string\"|null}. All fields follow same patterns as start. Leave empty for single-date tasks.', 'string') }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 1800], + "id": "http-task-put-date", + "name": "taskPutDate", + "description": "Create or update date for a task. Sets or modifies the task's date/time information. Start date is required with format {date: YYYY-MM-DD, time: HH:MM:SS|null, timezone: string|null}. End date is optional with same format. Date must match ^\\d{4}-\\d{2}-\\d{2}$, time must match ^(?:[0-1][0-9]|[2][0-3]):[0-5][0-9](?::[0-5][0-9])?$. Returns the updated task object. Response is nullable. Use for scheduling tasks or deadlines. Related tools: taskGetDate (retrieve), taskDeleteDate (remove). Response: {ok: true, item: {id: string (UUID), text: string, parentId: string (UUID), completed: boolean} | null}" + }, + { + "parameters": { + "method": "DELETE", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'REQUIRED: The project ID containing the task. Alphanumeric string that is 16 characters long.', 'string') + '/tasks/' + $fromAI('taskId', 'REQUIRED: The task ID to delete date from. UUID format.', 'string') + '/date' }}", + "authentication": "none", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 1900], + "id": "http-task-delete-date", + "name": "taskDeleteDate", + "description": "Delete date of a task. Removes all date/time information from the task, clearing both start and end dates. Returns the updated task object. Response is nullable. Use this to unschedule a task or remove deadline information. Related tools: taskPutDate (set/update), taskGetDate (retrieve). Response: {ok: true, item: {id: string (UUID), text: string, parentId: string (UUID), completed: boolean} | null}" + }, + { + "parameters": { + "method": "PUT", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'REQUIRED: The project ID containing the task. Alphanumeric string that is 16 characters long.', 'string') + '/tasks/' + $fromAI('taskId', 'REQUIRED: The task ID to add/update note for. UUID format.', 'string') + '/note' }}", + "authentication": "none", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "bodyParameters": { + "parameters": [ + { + "name": "type", + "value": "={{ $fromAI('type', 'REQUIRED: Note type. MUST be \"text/plain\" OR \"text/markdown\". Determines how the note content is formatted and rendered.', 'string') }}" + }, + { + "name": "value", + "value": "={{ $fromAI('value', 'REQUIRED: Note content. String with minimum 1 character. MUST be single line (no \\\\r or \\\\n characters allowed). Pattern: ^[^\\\\r\\\\n]*$. The actual note text to attach to the task.', 'string') }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 2000], + "id": "http-task-note-put", + "name": "taskNotePut", + "description": "Add/update a note to the task. Creates or replaces the task's note with new content. Note must be single line (no \\r or \\n), minimum 1 character, matching pattern ^[^\\r\\n]*$. Type must be text/plain or text/markdown. Returns the note object with type and value. Response is nullable. Use this to add detailed information or context to tasks. Related: taskNoteGet (retrieve), taskNoteDelete (remove). Response: {ok: true, item: {type: string, value: string} | null}" + }, + { + "parameters": { + "method": "GET", + "url": "={{ 'https://www.taskade.com/api/v1/folders/' + $fromAI('folderId', 'REQUIRED: Folder/Workspace/Space ID to get projects from. Alphanumeric string of 16 or 9 characters (may include underscores or hyphens). Can be a folder ID, workspace ID, or space ID for the home team. Get folder IDs using workspaceFoldersGet tool.', 'string') + '/projects' }}", + "authentication": "none", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 2100], + "id": "http-folder-projects-get", + "name": "folderProjectsGet", + "description": "Get all projects in a team, or in the home team of a workspace. Returns an array of project objects from the specified folder/workspace/space. Each project object contains id (16-character alphanumeric) and name. Projects are nullable in the array. Use this to list all projects in a specific organizational unit. Response: {ok: true, items: [{id: string, name: string} | null]}" + } + ], + "connections": { + "workspacesGet": { + "ai_tool": [ + [ + { + "node": "MCP Server Trigger", + "type": "ai_tool", + "index": 0 + } + ] + ] + }, + "workspaceCreateProject": { + "ai_tool": [ + [ + { + "node": "MCP Server Trigger", + "type": "ai_tool", + "index": 0 + } + ] + ] + }, + "workspaceFoldersGet": { + "ai_tool": [ + [ + { + "node": "MCP Server Trigger", + "type": "ai_tool", + "index": 0 + } + ] + ] + }, + "projectGet": { + "ai_tool": [ + [ + { + "node": "MCP Server Trigger", + "type": "ai_tool", + "index": 0 + } + ] + ] + }, + "projectCreate": { + "ai_tool": [ + [ + { + "node": "MCP Server Trigger", + "type": "ai_tool", + "index": 0 + } + ] + ] + }, + "projectCopy": { + "ai_tool": [ + [ + { + "node": "MCP Server Trigger", + "type": "ai_tool", + "index": 0 + } + ] + ] + }, + "projectBlocksGet": { + "ai_tool": [ + [ + { + "node": "MCP Server Trigger", + "type": "ai_tool", + "index": 0 + } + ] + ] + }, + "projectTasksGet": { + "ai_tool": [ + [ + { + "node": "MCP Server Trigger", + "type": "ai_tool", + "index": 0 + } + ] + ] + }, + "taskGet": { + "ai_tool": [ + [ + { + "node": "MCP Server Trigger", + "type": "ai_tool", + "index": 0 + } + ] + ] + }, + "taskPut": { + "ai_tool": [ + [ + { + "node": "MCP Server Trigger", + "type": "ai_tool", + "index": 0 + } + ] + ] + }, + "taskCreate": { + "ai_tool": [ + [ + { + "node": "MCP Server Trigger", + "type": "ai_tool", + "index": 0 + } + ] + ] + }, + "taskComplete": { + "ai_tool": [ + [ + { + "node": "MCP Server Trigger", + "type": "ai_tool", + "index": 0 + } + ] + ] + }, + "taskMove": { + "ai_tool": [ + [ + { + "node": "MCP Server Trigger", + "type": "ai_tool", + "index": 0 + } + ] + ] + }, + "taskAssigneesGet": { + "ai_tool": [ + [ + { + "node": "MCP Server Trigger", + "type": "ai_tool", + "index": 0 + } + ] + ] + }, + "taskPutAssignees": { + "ai_tool": [ + [ + { + "node": "MCP Server Trigger", + "type": "ai_tool", + "index": 0 + } + ] + ] + }, + "taskDeleteAssignees": { + "ai_tool": [ + [ + { + "node": "MCP Server Trigger", + "type": "ai_tool", + "index": 0 + } + ] + ] + }, + "taskGetDate": { + "ai_tool": [ + [ + { + "node": "MCP Server Trigger", + "type": "ai_tool", + "index": 0 + } + ] + ] + }, + "taskPutDate": { + "ai_tool": [ + [ + { + "node": "MCP Server Trigger", + "type": "ai_tool", + "index": 0 + } + ] + ] + }, + "taskDeleteDate": { + "ai_tool": [ + [ + { + "node": "MCP Server Trigger", + "type": "ai_tool", + "index": 0 + } + ] + ] + }, + "taskNotePut": { + "ai_tool": [ + [ + { + "node": "MCP Server Trigger", + "type": "ai_tool", + "index": 0 + } + ] + ] + }, + "folderProjectsGet": { + "ai_tool": [ + [ + { + "node": "MCP Server Trigger", + "type": "ai_tool", + "index": 0 + } + ] + ] + } + }, + "pinData": {}, + "settings": { + "executionOrder": "v1" + }, + "staticData": null, + "tags": [], + "triggerCount": 1, + "updatedAt": "2025-11-04T00:00:00.000Z", + "versionId": "3" +}