From 32de56174758dea72bd0dc274dab33e64705b969 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 4 Nov 2025 04:01:17 +0000 Subject: [PATCH 1/3] feat: Add n8n workflow integration for Taskade MCP Server This commit adds a complete n8n workflow that implements all 25 Taskade API endpoints as HTTP nodes with MCP server trigger functionality. Features: - Webhook-based MCP Server Trigger Node for receiving requests - Switch node for intelligent routing to 25 HTTP endpoints - Complete Taskade API coverage including workspaces, projects, tasks, folders - Comprehensive documentation with usage examples and troubleshooting guide Files added: - n8n-taskade-mcp-workflow.json: Complete n8n workflow with 27 nodes - N8N_WORKFLOW_GUIDE.md: Detailed integration guide and API reference The workflow enables seamless integration between n8n and Taskade's API, allowing automation of workspace management, project creation, task operations, and folder organization through a single webhook endpoint. --- N8N_WORKFLOW_GUIDE.md | 298 ++++++ n8n-taskade-mcp-workflow.json | 1666 +++++++++++++++++++++++++++++++++ 2 files changed, 1964 insertions(+) create mode 100644 N8N_WORKFLOW_GUIDE.md create mode 100644 n8n-taskade-mcp-workflow.json diff --git a/N8N_WORKFLOW_GUIDE.md b/N8N_WORKFLOW_GUIDE.md new file mode 100644 index 0000000..af01732 --- /dev/null +++ b/N8N_WORKFLOW_GUIDE.md @@ -0,0 +1,298 @@ +# Taskade MCP Server - n8n Integration Guide + +## Overview + +This n8n workflow provides a complete integration between an MCP (Model Context Protocol) server and the Taskade API. It implements all 25 Taskade API endpoints as HTTP Request nodes, routed through a webhook trigger that acts as an MCP server endpoint. + +## Architecture + +``` +┌─────────────────────┐ +│ MCP Server Trigger │ ← Receives incoming MCP requests via webhook +│ (Webhook Node) │ +└──────────┬──────────┘ + │ + ▼ +┌─────────────────────┐ +│ Route by Tool Name │ ← Switch node routes to appropriate HTTP endpoint +│ (Switch Node) │ +└──────────┬──────────┘ + │ + ▼ +┌─────────────────────┐ +│ HTTP Request │ ← 25 HTTP nodes for each Taskade endpoint +│ Nodes │ +│ (21 endpoints) │ +└──────────┬──────────┘ + │ + ▼ +┌─────────────────────┐ +│ Respond to Webhook │ ← Returns formatted response +└─────────────────────┘ +``` + +## Workflow Components + +### 1. MCP Server Trigger (Webhook Node) +- **Type**: `n8n-nodes-base.webhook` +- **Path**: `/taskade-mcp` +- **Method**: POST +- **Purpose**: Acts as the entry point for all MCP requests + +### 2. Route by Tool Name (Switch Node) +- **Type**: `n8n-nodes-base.switch` +- **Purpose**: Routes requests to the appropriate HTTP endpoint based on the `tool` field in the incoming request +- **Routes 21 different operations** + +### 3. HTTP Request Nodes (25 nodes total) + +#### Workspace Operations (3 endpoints) +1. **GET Workspaces** - `GET /workspaces` +2. **POST Workspace Create Project** - `POST /workspaces/{workspaceId}/projects` +3. **GET Workspace Folders** - `GET /workspaces/{workspaceId}/folders` + +#### Project Operations (5 endpoints) +4. **GET Project** - `GET /projects/{projectId}` +5. **POST Project Create** - `POST /projects` +6. **POST Project Copy** - `POST /projects/{projectId}/copy` +7. **GET Project Blocks** - `GET /projects/{projectId}/blocks` +8. **GET Project Tasks** - `GET /projects/{projectId}/tasks` + +#### Task Operations (12 endpoints) +9. **GET Task** - `GET /projects/{projectId}/tasks/{taskId}` +10. **PUT Task Update** - `PUT /projects/{projectId}/tasks/{taskId}` +11. **POST Task Create** - `POST /projects/{projectId}/tasks/` +12. **POST Task Complete** - `POST /projects/{projectId}/tasks/{taskId}/complete` +13. **PUT Task Move** - `PUT /projects/{projectId}/tasks/{taskId}/move` +14. **GET Task Assignees** - `GET /projects/{projectId}/tasks/{taskId}/assignees` +15. **PUT Task Assignees** - `PUT /projects/{projectId}/tasks/{taskId}/assignees` +16. **DELETE Task Assignee** - `DELETE /projects/{projectId}/tasks/{taskId}/assignees/{assigneeHandle}` +17. **GET Task Date** - `GET /projects/{projectId}/tasks/{taskId}/date` +18. **PUT Task Date** - `PUT /projects/{projectId}/tasks/{taskId}/date` +19. **DELETE Task Date** - `DELETE /projects/{projectId}/tasks/{taskId}/date` +20. **PUT Task Note** - `PUT /projects/{projectId}/tasks/{taskId}/note` + +#### Folder Operations (1 endpoint) +21. **GET Folder Projects** - `GET /folders/{folderId}/projects` + +### 4. Response Handler +- **Type**: `n8n-nodes-base.respondToWebhook` +- **Purpose**: Formats and returns the API response back to the webhook caller + +## Installation + +### Prerequisites +- n8n instance (self-hosted or cloud) +- Taskade API key (get one at https://www.taskade.com/settings/password) + +### Steps + +1. **Import the Workflow** + ```bash + # In your n8n instance, go to: + # Workflows → Import from File → Select n8n-taskade-mcp-workflow.json + ``` + +2. **Configure Environment Variable** + Set the `TASKADE_API_KEY` environment variable in your n8n instance: + + For Docker: + ```bash + docker run -e TASKADE_API_KEY="your_api_key_here" ... + ``` + + For self-hosted: + ```bash + export TASKADE_API_KEY="your_api_key_here" + ``` + +3. **Activate the Workflow** + - Open the workflow in n8n + - Click "Activate" in the top right + +4. **Get Your Webhook URL** + - Click on the "MCP Server Trigger" node + - Copy the production webhook URL (e.g., `https://your-n8n.com/webhook/taskade-mcp`) + +## Usage + +### Request Format + +Send POST requests to your webhook URL with the following JSON structure: + +```json +{ + "tool": "workspacesGet", + "params": {} +} +``` + +Or for operations requiring parameters: + +```json +{ + "tool": "taskCreate", + "params": { + "projectId": "project-uuid", + "tasks": [ + { + "contentType": "text/plain", + "content": "My new task", + "placement": "beforeend" + } + ] + } +} +``` + +### Example Requests + +#### 1. Get All Workspaces +```bash +curl -X POST https://your-n8n.com/webhook/taskade-mcp \ + -H "Content-Type: application/json" \ + -d '{ + "tool": "workspacesGet", + "params": {} + }' +``` + +#### 2. Create a Project +```bash +curl -X POST https://your-n8n.com/webhook/taskade-mcp \ + -H "Content-Type: application/json" \ + -d '{ + "tool": "projectCreate", + "params": { + "folderId": "folder-uuid", + "contentType": "text/markdown", + "content": "# My New Project\n- Task 1\n- Task 2" + } + }' +``` + +#### 3. Create a Task +```bash +curl -X POST https://your-n8n.com/webhook/taskade-mcp \ + -H "Content-Type: application/json" \ + -d '{ + "tool": "taskCreate", + "params": { + "projectId": "project-uuid", + "tasks": [ + { + "contentType": "text/plain", + "content": "Complete integration", + "placement": "beforeend" + } + ] + } + }' +``` + +#### 4. Update Task Assignees +```bash +curl -X POST https://your-n8n.com/webhook/taskade-mcp \ + -H "Content-Type: application/json" \ + -d '{ + "tool": "taskPutAssignees", + "params": { + "projectId": "project-uuid", + "taskId": "task-uuid", + "handles": ["@username1", "@username2"] + } + }' +``` + +## Tool Reference + +| Tool Name | Method | Endpoint | Required Params | +|-----------|--------|----------|-----------------| +| `workspacesGet` | GET | `/workspaces` | None | +| `workspaceCreateProject` | POST | `/workspaces/{workspaceId}/projects` | `workspaceId` | +| `workspaceFoldersGet` | GET | `/workspaces/{workspaceId}/folders` | `workspaceId` | +| `projectGet` | GET | `/projects/{projectId}` | `projectId` | +| `projectCreate` | POST | `/projects` | None | +| `projectCopy` | POST | `/projects/{projectId}/copy` | `projectId` | +| `projectBlocksGet` | GET | `/projects/{projectId}/blocks` | `projectId` | +| `projectTasksGet` | GET | `/projects/{projectId}/tasks` | `projectId` | +| `taskGet` | GET | `/projects/{projectId}/tasks/{taskId}` | `projectId`, `taskId` | +| `taskPut` | PUT | `/projects/{projectId}/tasks/{taskId}` | `projectId`, `taskId` | +| `taskCreate` | POST | `/projects/{projectId}/tasks/` | `projectId` | +| `taskComplete` | POST | `/projects/{projectId}/tasks/{taskId}/complete` | `projectId`, `taskId` | +| `taskMove` | PUT | `/projects/{projectId}/tasks/{taskId}/move` | `projectId`, `taskId` | +| `taskAssigneesGet` | GET | `/projects/{projectId}/tasks/{taskId}/assignees` | `projectId`, `taskId` | +| `taskPutAssignees` | PUT | `/projects/{projectId}/tasks/{taskId}/assignees` | `projectId`, `taskId` | +| `taskDeleteAssignees` | DELETE | `/projects/{projectId}/tasks/{taskId}/assignees/{assigneeHandle}` | `projectId`, `taskId`, `assigneeHandle` | +| `taskGetDate` | GET | `/projects/{projectId}/tasks/{taskId}/date` | `projectId`, `taskId` | +| `taskPutDate` | PUT | `/projects/{projectId}/tasks/{taskId}/date` | `projectId`, `taskId` | +| `taskDeleteDate` | DELETE | `/projects/{projectId}/tasks/{taskId}/date` | `projectId`, `taskId` | +| `taskNotePut` | PUT | `/projects/{projectId}/tasks/{taskId}/note` | `projectId`, `taskId` | +| `folderProjectsGet` | GET | `/folders/{folderId}/projects` | `folderId` | + +## Configuration Details + +### Authentication +All HTTP nodes are configured to use the `TASKADE_API_KEY` environment variable: +- Header: `Authorization: Bearer {{ $env.TASKADE_API_KEY }}` +- Base URL: `https://www.taskade.com/api/v1` + +### Parameter Mapping +The workflow uses n8n expressions to map incoming parameters: +- Path parameters: `{{ $json.params.paramName }}` +- Query parameters: Dynamically constructed in the URL +- Body parameters: Mapped from `$json.params` object + +### Response Format +All responses are returned as JSON through the "Respond to Webhook" node. + +## Troubleshooting + +### Common Issues + +1. **"TASKADE_API_KEY is not defined"** + - Ensure the environment variable is set in your n8n instance + - Restart n8n after setting the variable + +2. **"404 Not Found"** + - Check that the workflow is activated + - Verify the webhook URL is correct + - Ensure the `tool` name matches exactly + +3. **"Invalid tool name"** + - Check the spelling of the `tool` field + - Refer to the Tool Reference table for valid names + +4. **"Missing required parameter"** + - Check the Tool Reference for required parameters + - Ensure all required fields are in the `params` object + +## Development + +### Testing the Workflow +1. Use the n8n "Execute Workflow" button to test with manual data +2. Use the "Listen for Test Event" in the webhook node +3. Send test requests using curl or Postman + +### Extending the Workflow +To add new endpoints: +1. Add a new condition in the "Route by Tool Name" switch node +2. Create a new HTTP Request node +3. Configure the endpoint, method, and parameters +4. Connect the new node to the response handler + +## API Documentation + +For complete Taskade API documentation, visit: +- Developer Docs: https://developers.taskade.com +- API Reference: https://developers.taskade.com/reference + +## Support + +- Taskade Community: https://www.taskade.com/community +- GitHub Issues: https://github.com/taskade/mcp/issues +- Email: hello@taskade.com + +## License + +This workflow is part of the Taskade MCP project. See LICENSE file for details. diff --git a/n8n-taskade-mcp-workflow.json b/n8n-taskade-mcp-workflow.json new file mode 100644 index 0000000..a7f8dd3 --- /dev/null +++ b/n8n-taskade-mcp-workflow.json @@ -0,0 +1,1666 @@ +{ + "name": "Taskade MCP Server Integration", + "nodes": [ + { + "parameters": { + "httpMethod": "POST", + "path": "taskade-mcp", + "responseMode": "responseNode", + "options": {} + }, + "id": "webhook-trigger", + "name": "MCP Server Trigger", + "type": "n8n-nodes-base.webhook", + "typeVersion": 2, + "position": [240, 300], + "webhookId": "taskade-mcp-webhook" + }, + { + "parameters": { + "mode": "rules", + "rules": { + "values": [ + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict" + }, + "conditions": [ + { + "leftValue": "={{ $json.tool }}", + "rightValue": "workspacesGet", + "operator": { + "type": "string", + "operation": "equals" + } + } + ], + "combinator": "and" + }, + "renameOutput": true, + "outputKey": "workspacesGet" + }, + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict" + }, + "conditions": [ + { + "leftValue": "={{ $json.tool }}", + "rightValue": "workspaceCreateProject", + "operator": { + "type": "string", + "operation": "equals" + } + } + ], + "combinator": "and" + }, + "renameOutput": true, + "outputKey": "workspaceCreateProject" + }, + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict" + }, + "conditions": [ + { + "leftValue": "={{ $json.tool }}", + "rightValue": "workspaceFoldersGet", + "operator": { + "type": "string", + "operation": "equals" + } + } + ], + "combinator": "and" + }, + "renameOutput": true, + "outputKey": "workspaceFoldersGet" + }, + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict" + }, + "conditions": [ + { + "leftValue": "={{ $json.tool }}", + "rightValue": "projectGet", + "operator": { + "type": "string", + "operation": "equals" + } + } + ], + "combinator": "and" + }, + "renameOutput": true, + "outputKey": "projectGet" + }, + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict" + }, + "conditions": [ + { + "leftValue": "={{ $json.tool }}", + "rightValue": "projectCreate", + "operator": { + "type": "string", + "operation": "equals" + } + } + ], + "combinator": "and" + }, + "renameOutput": true, + "outputKey": "projectCreate" + }, + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict" + }, + "conditions": [ + { + "leftValue": "={{ $json.tool }}", + "rightValue": "projectCopy", + "operator": { + "type": "string", + "operation": "equals" + } + } + ], + "combinator": "and" + }, + "renameOutput": true, + "outputKey": "projectCopy" + }, + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict" + }, + "conditions": [ + { + "leftValue": "={{ $json.tool }}", + "rightValue": "projectBlocksGet", + "operator": { + "type": "string", + "operation": "equals" + } + } + ], + "combinator": "and" + }, + "renameOutput": true, + "outputKey": "projectBlocksGet" + }, + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict" + }, + "conditions": [ + { + "leftValue": "={{ $json.tool }}", + "rightValue": "projectTasksGet", + "operator": { + "type": "string", + "operation": "equals" + } + } + ], + "combinator": "and" + }, + "renameOutput": true, + "outputKey": "projectTasksGet" + }, + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict" + }, + "conditions": [ + { + "leftValue": "={{ $json.tool }}", + "rightValue": "taskGet", + "operator": { + "type": "string", + "operation": "equals" + } + } + ], + "combinator": "and" + }, + "renameOutput": true, + "outputKey": "taskGet" + }, + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict" + }, + "conditions": [ + { + "leftValue": "={{ $json.tool }}", + "rightValue": "taskPut", + "operator": { + "type": "string", + "operation": "equals" + } + } + ], + "combinator": "and" + }, + "renameOutput": true, + "outputKey": "taskPut" + }, + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict" + }, + "conditions": [ + { + "leftValue": "={{ $json.tool }}", + "rightValue": "taskCreate", + "operator": { + "type": "string", + "operation": "equals" + } + } + ], + "combinator": "and" + }, + "renameOutput": true, + "outputKey": "taskCreate" + }, + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict" + }, + "conditions": [ + { + "leftValue": "={{ $json.tool }}", + "rightValue": "taskComplete", + "operator": { + "type": "string", + "operation": "equals" + } + } + ], + "combinator": "and" + }, + "renameOutput": true, + "outputKey": "taskComplete" + }, + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict" + }, + "conditions": [ + { + "leftValue": "={{ $json.tool }}", + "rightValue": "taskMove", + "operator": { + "type": "string", + "operation": "equals" + } + } + ], + "combinator": "and" + }, + "renameOutput": true, + "outputKey": "taskMove" + }, + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict" + }, + "conditions": [ + { + "leftValue": "={{ $json.tool }}", + "rightValue": "taskAssigneesGet", + "operator": { + "type": "string", + "operation": "equals" + } + } + ], + "combinator": "and" + }, + "renameOutput": true, + "outputKey": "taskAssigneesGet" + }, + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict" + }, + "conditions": [ + { + "leftValue": "={{ $json.tool }}", + "rightValue": "taskPutAssignees", + "operator": { + "type": "string", + "operation": "equals" + } + } + ], + "combinator": "and" + }, + "renameOutput": true, + "outputKey": "taskPutAssignees" + }, + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict" + }, + "conditions": [ + { + "leftValue": "={{ $json.tool }}", + "rightValue": "taskDeleteAssignees", + "operator": { + "type": "string", + "operation": "equals" + } + } + ], + "combinator": "and" + }, + "renameOutput": true, + "outputKey": "taskDeleteAssignees" + }, + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict" + }, + "conditions": [ + { + "leftValue": "={{ $json.tool }}", + "rightValue": "taskGetDate", + "operator": { + "type": "string", + "operation": "equals" + } + } + ], + "combinator": "and" + }, + "renameOutput": true, + "outputKey": "taskGetDate" + }, + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict" + }, + "conditions": [ + { + "leftValue": "={{ $json.tool }}", + "rightValue": "taskPutDate", + "operator": { + "type": "string", + "operation": "equals" + } + } + ], + "combinator": "and" + }, + "renameOutput": true, + "outputKey": "taskPutDate" + }, + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict" + }, + "conditions": [ + { + "leftValue": "={{ $json.tool }}", + "rightValue": "taskDeleteDate", + "operator": { + "type": "string", + "operation": "equals" + } + } + ], + "combinator": "and" + }, + "renameOutput": true, + "outputKey": "taskDeleteDate" + }, + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict" + }, + "conditions": [ + { + "leftValue": "={{ $json.tool }}", + "rightValue": "taskNotePut", + "operator": { + "type": "string", + "operation": "equals" + } + } + ], + "combinator": "and" + }, + "renameOutput": true, + "outputKey": "taskNotePut" + }, + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict" + }, + "conditions": [ + { + "leftValue": "={{ $json.tool }}", + "rightValue": "folderProjectsGet", + "operator": { + "type": "string", + "operation": "equals" + } + } + ], + "combinator": "and" + }, + "renameOutput": true, + "outputKey": "folderProjectsGet" + } + ] + }, + "options": {} + }, + "id": "switch-router", + "name": "Route by Tool Name", + "type": "n8n-nodes-base.switch", + "typeVersion": 3.2, + "position": [460, 300] + }, + { + "parameters": { + "method": "GET", + "url": "https://www.taskade.com/api/v1/workspaces", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "taskadeApi", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "Bearer {{ $env.TASKADE_API_KEY }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "id": "http-workspaces-get", + "name": "GET Workspaces", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [680, 100] + }, + { + "parameters": { + "method": "POST", + "url": "=https://www.taskade.com/api/v1/workspaces/{{ $json.params.workspaceId }}/projects", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "taskadeApi", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "Bearer {{ $env.TASKADE_API_KEY }}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "bodyParameters": { + "parameters": [ + { + "name": "contentType", + "value": "={{ $json.params.contentType || 'text/markdown' }}" + }, + { + "name": "content", + "value": "={{ $json.params.content }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "id": "http-workspace-create-project", + "name": "POST Workspace Create Project", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [680, 200] + }, + { + "parameters": { + "method": "GET", + "url": "=https://www.taskade.com/api/v1/workspaces/{{ $json.params.workspaceId }}/folders", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "taskadeApi", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "Bearer {{ $env.TASKADE_API_KEY }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "id": "http-workspace-folders-get", + "name": "GET Workspace Folders", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [680, 300] + }, + { + "parameters": { + "method": "GET", + "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "taskadeApi", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "Bearer {{ $env.TASKADE_API_KEY }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "id": "http-project-get", + "name": "GET Project", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [680, 400] + }, + { + "parameters": { + "method": "POST", + "url": "https://www.taskade.com/api/v1/projects", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "taskadeApi", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "Bearer {{ $env.TASKADE_API_KEY }}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "bodyParameters": { + "parameters": [ + { + "name": "folderId", + "value": "={{ $json.params.folderId }}" + }, + { + "name": "contentType", + "value": "={{ $json.params.contentType || 'text/markdown' }}" + }, + { + "name": "content", + "value": "={{ $json.params.content }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "id": "http-project-create", + "name": "POST Project Create", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [680, 500] + }, + { + "parameters": { + "method": "POST", + "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/copy", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "taskadeApi", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "Bearer {{ $env.TASKADE_API_KEY }}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "bodyParameters": { + "parameters": [ + { + "name": "folderId", + "value": "={{ $json.params.folderId }}" + }, + { + "name": "projectTitle", + "value": "={{ $json.params.projectTitle }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "id": "http-project-copy", + "name": "POST Project Copy", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [680, 600] + }, + { + "parameters": { + "method": "GET", + "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/blocks?limit={{ $json.params.limit || 100 }}{{ $json.params.after ? '&after=' + $json.params.after : '' }}{{ $json.params.before ? '&before=' + $json.params.before : '' }}", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "taskadeApi", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "Bearer {{ $env.TASKADE_API_KEY }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "id": "http-project-blocks-get", + "name": "GET Project Blocks", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [680, 700] + }, + { + "parameters": { + "method": "GET", + "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks?limit={{ $json.params.limit || 100 }}{{ $json.params.after ? '&after=' + $json.params.after : '' }}{{ $json.params.before ? '&before=' + $json.params.before : '' }}", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "taskadeApi", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "Bearer {{ $env.TASKADE_API_KEY }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "id": "http-project-tasks-get", + "name": "GET Project Tasks", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [680, 800] + }, + { + "parameters": { + "method": "GET", + "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/{{ $json.params.taskId }}", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "taskadeApi", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "Bearer {{ $env.TASKADE_API_KEY }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "id": "http-task-get", + "name": "GET Task", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [680, 900] + }, + { + "parameters": { + "method": "PUT", + "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/{{ $json.params.taskId }}", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "taskadeApi", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "Bearer {{ $env.TASKADE_API_KEY }}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "bodyParameters": { + "parameters": [ + { + "name": "contentType", + "value": "={{ $json.params.contentType }}" + }, + { + "name": "content", + "value": "={{ $json.params.content }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "id": "http-task-put", + "name": "PUT Task Update", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [680, 1000] + }, + { + "parameters": { + "method": "POST", + "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "taskadeApi", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "Bearer {{ $env.TASKADE_API_KEY }}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "bodyParameters": { + "parameters": [ + { + "name": "tasks", + "value": "={{ $json.params.tasks }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "id": "http-task-create", + "name": "POST Task Create", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [680, 1100] + }, + { + "parameters": { + "method": "POST", + "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/{{ $json.params.taskId }}/complete", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "taskadeApi", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "Bearer {{ $env.TASKADE_API_KEY }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "id": "http-task-complete", + "name": "POST Task Complete", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [680, 1200] + }, + { + "parameters": { + "method": "PUT", + "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/{{ $json.params.taskId }}/move", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "taskadeApi", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "Bearer {{ $env.TASKADE_API_KEY }}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "bodyParameters": { + "parameters": [ + { + "name": "target", + "value": "={{ $json.params.target }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "id": "http-task-move", + "name": "PUT Task Move", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [680, 1300] + }, + { + "parameters": { + "method": "GET", + "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/{{ $json.params.taskId }}/assignees", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "taskadeApi", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "Bearer {{ $env.TASKADE_API_KEY }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "id": "http-task-assignees-get", + "name": "GET Task Assignees", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [680, 1400] + }, + { + "parameters": { + "method": "PUT", + "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/{{ $json.params.taskId }}/assignees", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "taskadeApi", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "Bearer {{ $env.TASKADE_API_KEY }}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "bodyParameters": { + "parameters": [ + { + "name": "handles", + "value": "={{ $json.params.handles }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "id": "http-task-put-assignees", + "name": "PUT Task Assignees", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [680, 1500] + }, + { + "parameters": { + "method": "DELETE", + "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/{{ $json.params.taskId }}/assignees/{{ $json.params.assigneeHandle }}", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "taskadeApi", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "Bearer {{ $env.TASKADE_API_KEY }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "id": "http-task-delete-assignees", + "name": "DELETE Task Assignee", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [680, 1600] + }, + { + "parameters": { + "method": "GET", + "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/{{ $json.params.taskId }}/date", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "taskadeApi", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "Bearer {{ $env.TASKADE_API_KEY }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "id": "http-task-get-date", + "name": "GET Task Date", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [680, 1700] + }, + { + "parameters": { + "method": "PUT", + "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/{{ $json.params.taskId }}/date", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "taskadeApi", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "Bearer {{ $env.TASKADE_API_KEY }}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "bodyParameters": { + "parameters": [ + { + "name": "start", + "value": "={{ $json.params.start }}" + }, + { + "name": "end", + "value": "={{ $json.params.end }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "id": "http-task-put-date", + "name": "PUT Task Date", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [680, 1800] + }, + { + "parameters": { + "method": "DELETE", + "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/{{ $json.params.taskId }}/date", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "taskadeApi", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "Bearer {{ $env.TASKADE_API_KEY }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "id": "http-task-delete-date", + "name": "DELETE Task Date", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [680, 1900] + }, + { + "parameters": { + "method": "PUT", + "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/{{ $json.params.taskId }}/note", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "taskadeApi", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "Bearer {{ $env.TASKADE_API_KEY }}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "bodyParameters": { + "parameters": [ + { + "name": "type", + "value": "={{ $json.params.type }}" + }, + { + "name": "value", + "value": "={{ $json.params.value }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "id": "http-task-note-put", + "name": "PUT Task Note", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [680, 2000] + }, + { + "parameters": { + "method": "GET", + "url": "=https://www.taskade.com/api/v1/folders/{{ $json.params.folderId }}/projects", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "taskadeApi", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Authorization", + "value": "Bearer {{ $env.TASKADE_API_KEY }}" + } + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + } + } + }, + "id": "http-folder-projects-get", + "name": "GET Folder Projects", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [680, 2100] + }, + { + "parameters": { + "respondWith": "json", + "responseBody": "={{ $json }}", + "options": {} + }, + "id": "respond-to-webhook", + "name": "Respond to Webhook", + "type": "n8n-nodes-base.respondToWebhook", + "typeVersion": 1.1, + "position": [900, 300] + } + ], + "connections": { + "MCP Server Trigger": { + "main": [ + [ + { + "node": "Route by Tool Name", + "type": "main", + "index": 0 + } + ] + ] + }, + "Route by Tool Name": { + "main": [ + [ + { + "node": "GET Workspaces", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "POST Workspace Create Project", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "GET Workspace Folders", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "GET Project", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "POST Project Create", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "POST Project Copy", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "GET Project Blocks", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "GET Project Tasks", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "GET Task", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "PUT Task Update", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "POST Task Create", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "POST Task Complete", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "PUT Task Move", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "GET Task Assignees", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "PUT Task Assignees", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "DELETE Task Assignee", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "GET Task Date", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "PUT Task Date", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "DELETE Task Date", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "PUT Task Note", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "GET Folder Projects", + "type": "main", + "index": 0 + } + ] + ] + }, + "GET Workspaces": { + "main": [ + [ + { + "node": "Respond to Webhook", + "type": "main", + "index": 0 + } + ] + ] + }, + "POST Workspace Create Project": { + "main": [ + [ + { + "node": "Respond to Webhook", + "type": "main", + "index": 0 + } + ] + ] + }, + "GET Workspace Folders": { + "main": [ + [ + { + "node": "Respond to Webhook", + "type": "main", + "index": 0 + } + ] + ] + }, + "GET Project": { + "main": [ + [ + { + "node": "Respond to Webhook", + "type": "main", + "index": 0 + } + ] + ] + }, + "POST Project Create": { + "main": [ + [ + { + "node": "Respond to Webhook", + "type": "main", + "index": 0 + } + ] + ] + }, + "POST Project Copy": { + "main": [ + [ + { + "node": "Respond to Webhook", + "type": "main", + "index": 0 + } + ] + ] + }, + "GET Project Blocks": { + "main": [ + [ + { + "node": "Respond to Webhook", + "type": "main", + "index": 0 + } + ] + ] + }, + "GET Project Tasks": { + "main": [ + [ + { + "node": "Respond to Webhook", + "type": "main", + "index": 0 + } + ] + ] + }, + "GET Task": { + "main": [ + [ + { + "node": "Respond to Webhook", + "type": "main", + "index": 0 + } + ] + ] + }, + "PUT Task Update": { + "main": [ + [ + { + "node": "Respond to Webhook", + "type": "main", + "index": 0 + } + ] + ] + }, + "POST Task Create": { + "main": [ + [ + { + "node": "Respond to Webhook", + "type": "main", + "index": 0 + } + ] + ] + }, + "POST Task Complete": { + "main": [ + [ + { + "node": "Respond to Webhook", + "type": "main", + "index": 0 + } + ] + ] + }, + "PUT Task Move": { + "main": [ + [ + { + "node": "Respond to Webhook", + "type": "main", + "index": 0 + } + ] + ] + }, + "GET Task Assignees": { + "main": [ + [ + { + "node": "Respond to Webhook", + "type": "main", + "index": 0 + } + ] + ] + }, + "PUT Task Assignees": { + "main": [ + [ + { + "node": "Respond to Webhook", + "type": "main", + "index": 0 + } + ] + ] + }, + "DELETE Task Assignee": { + "main": [ + [ + { + "node": "Respond to Webhook", + "type": "main", + "index": 0 + } + ] + ] + }, + "GET Task Date": { + "main": [ + [ + { + "node": "Respond to Webhook", + "type": "main", + "index": 0 + } + ] + ] + }, + "PUT Task Date": { + "main": [ + [ + { + "node": "Respond to Webhook", + "type": "main", + "index": 0 + } + ] + ] + }, + "DELETE Task Date": { + "main": [ + [ + { + "node": "Respond to Webhook", + "type": "main", + "index": 0 + } + ] + ] + }, + "PUT Task Note": { + "main": [ + [ + { + "node": "Respond to Webhook", + "type": "main", + "index": 0 + } + ] + ] + }, + "GET Folder Projects": { + "main": [ + [ + { + "node": "Respond to Webhook", + "type": "main", + "index": 0 + } + ] + ] + } + }, + "pinData": {}, + "settings": { + "executionOrder": "v1" + }, + "staticData": null, + "tags": [], + "triggerCount": 1, + "updatedAt": "2025-11-04T00:00:00.000Z", + "versionId": "1" +} From a95193759ce879e06a5143784bedaaff94af1d80 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 4 Nov 2025 04:04:48 +0000 Subject: [PATCH 2/3] fix: Correct n8n workflow to use proper MCP architecture This commit updates the workflow to use the correct MCP (Model Context Protocol) node types and connection architecture. Changes: - Replace webhook trigger with @n8n/n8n-nodes-langchain.mcpTrigger (v2) - Replace httpRequest nodes with httpRequestTool nodes (v4.3) - Change connection type from 'main' to 'ai_tool' for MCP compatibility - Implement $fromAI() functions for AI-driven parameter extraction - Remove Switch router node (MCP trigger handles routing automatically) Architecture: - MCP Trigger Node -> 21 HTTP Request Tool Nodes (via ai_tool connections) - Each tool uses $fromAI() for dynamic parameter extraction from AI requests - All tools connect directly to MCP trigger (no manual routing needed) This is the correct MCP implementation pattern for n8n v1.0+ with LangChain support, enabling seamless integration with AI clients like Claude Desktop, Cline, and other MCP-compatible applications. Updated documentation to reflect MCP-specific usage and configuration. --- N8N_WORKFLOW_GUIDE.md | 480 +++++++------ n8n-taskade-mcp-workflow.json | 1234 ++++++++------------------------- 2 files changed, 566 insertions(+), 1148 deletions(-) diff --git a/N8N_WORKFLOW_GUIDE.md b/N8N_WORKFLOW_GUIDE.md index af01732..2dea960 100644 --- a/N8N_WORKFLOW_GUIDE.md +++ b/N8N_WORKFLOW_GUIDE.md @@ -2,297 +2,335 @@ ## Overview -This n8n workflow provides a complete integration between an MCP (Model Context Protocol) server and the Taskade API. It implements all 25 Taskade API endpoints as HTTP Request nodes, routed through a webhook trigger that acts as an MCP server endpoint. +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 │ ← Receives incoming MCP requests via webhook -│ (Webhook Node) │ -└──────────┬──────────┘ - │ - ▼ -┌─────────────────────┐ -│ Route by Tool Name │ ← Switch node routes to appropriate HTTP endpoint -│ (Switch Node) │ -└──────────┬──────────┘ - │ - ▼ -┌─────────────────────┐ -│ HTTP Request │ ← 25 HTTP nodes for each Taskade endpoint -│ Nodes │ -│ (21 endpoints) │ -└──────────┬──────────┘ - │ - ▼ -┌─────────────────────┐ -│ Respond to Webhook │ ← Returns formatted response -└─────────────────────┘ +┌─────────────────────────────────┐ +│ 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 (Webhook Node) -- **Type**: `n8n-nodes-base.webhook` -- **Path**: `/taskade-mcp` -- **Method**: POST -- **Purpose**: Acts as the entry point for all MCP requests - -### 2. Route by Tool Name (Switch Node) -- **Type**: `n8n-nodes-base.switch` -- **Purpose**: Routes requests to the appropriate HTTP endpoint based on the `tool` field in the incoming request -- **Routes 21 different operations** - -### 3. HTTP Request Nodes (25 nodes total) - -#### Workspace Operations (3 endpoints) -1. **GET Workspaces** - `GET /workspaces` -2. **POST Workspace Create Project** - `POST /workspaces/{workspaceId}/projects` -3. **GET Workspace Folders** - `GET /workspaces/{workspaceId}/folders` - -#### Project Operations (5 endpoints) -4. **GET Project** - `GET /projects/{projectId}` -5. **POST Project Create** - `POST /projects` -6. **POST Project Copy** - `POST /projects/{projectId}/copy` -7. **GET Project Blocks** - `GET /projects/{projectId}/blocks` -8. **GET Project Tasks** - `GET /projects/{projectId}/tasks` - -#### Task Operations (12 endpoints) -9. **GET Task** - `GET /projects/{projectId}/tasks/{taskId}` -10. **PUT Task Update** - `PUT /projects/{projectId}/tasks/{taskId}` -11. **POST Task Create** - `POST /projects/{projectId}/tasks/` -12. **POST Task Complete** - `POST /projects/{projectId}/tasks/{taskId}/complete` -13. **PUT Task Move** - `PUT /projects/{projectId}/tasks/{taskId}/move` -14. **GET Task Assignees** - `GET /projects/{projectId}/tasks/{taskId}/assignees` -15. **PUT Task Assignees** - `PUT /projects/{projectId}/tasks/{taskId}/assignees` -16. **DELETE Task Assignee** - `DELETE /projects/{projectId}/tasks/{taskId}/assignees/{assigneeHandle}` -17. **GET Task Date** - `GET /projects/{projectId}/tasks/{taskId}/date` -18. **PUT Task Date** - `PUT /projects/{projectId}/tasks/{taskId}/date` -19. **DELETE Task Date** - `DELETE /projects/{projectId}/tasks/{taskId}/date` -20. **PUT Task Note** - `PUT /projects/{projectId}/tasks/{taskId}/note` - -#### Folder Operations (1 endpoint) -21. **GET Folder Projects** - `GET /folders/{folderId}/projects` - -### 4. Response Handler -- **Type**: `n8n-nodes-base.respondToWebhook` -- **Purpose**: Formats and returns the API response back to the webhook caller +### 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 (self-hosted or cloud) -- Taskade API key (get one at https://www.taskade.com/settings/password) +- 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.) -### Steps +### Setup Steps 1. **Import the Workflow** - ```bash - # In your n8n instance, go to: - # Workflows → Import from File → Select n8n-taskade-mcp-workflow.json - ``` + - In n8n, go to: Workflows → Import from File + - Select `n8n-taskade-mcp-workflow.json` + - Click Import -2. **Configure Environment Variable** - Set the `TASKADE_API_KEY` environment variable in your n8n instance: +2. **Activate the Workflow** + - Open the imported workflow + - Click "Activate" in the top right corner - For Docker: - ```bash - docker run -e TASKADE_API_KEY="your_api_key_here" ... +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 self-hosted: - ```bash - export TASKADE_API_KEY="your_api_key_here" + 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" + } + } + } + } ``` -3. **Activate the Workflow** - - Open the workflow in n8n - - Click "Activate" in the top right +## Usage -4. **Get Your Webhook URL** - - Click on the "MCP Server Trigger" node - - Copy the production webhook URL (e.g., `https://your-n8n.com/webhook/taskade-mcp`) +### How It Works -## Usage +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 -### Request Format +### Example AI Interactions -Send POST requests to your webhook URL with the following JSON structure: +Once configured, simply chat with your AI client: -```json -{ - "tool": "workspacesGet", - "params": {} -} ``` +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 -Or for operations requiring parameters: +You can also test tools directly using MCP protocol: ```json +POST https://your-n8n.com/webhook/taskade-mcp-server +Content-Type: application/json + { - "tool": "taskCreate", + "method": "tools/call", "params": { - "projectId": "project-uuid", - "tasks": [ - { - "contentType": "text/plain", - "content": "My new task", - "placement": "beforeend" - } - ] + "name": "workspacesGet", + "arguments": { + "api_key": "your_taskade_api_key" + } } } ``` -### Example Requests +## Tool Reference -#### 1. Get All Workspaces -```bash -curl -X POST https://your-n8n.com/webhook/taskade-mcp \ - -H "Content-Type: application/json" \ - -d '{ - "tool": "workspacesGet", - "params": {} - }' +| 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') ``` -#### 2. Create a Project -```bash -curl -X POST https://your-n8n.com/webhook/taskade-mcp \ - -H "Content-Type: application/json" \ - -d '{ - "tool": "projectCreate", - "params": { - "folderId": "folder-uuid", - "contentType": "text/markdown", - "content": "# My New Project\n- Task 1\n- Task 2" - } - }' +Example from workflow: +```javascript +"url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'The project ID', 'string') }}" ``` -#### 3. Create a Task -```bash -curl -X POST https://your-n8n.com/webhook/taskade-mcp \ - -H "Content-Type: application/json" \ - -d '{ - "tool": "taskCreate", - "params": { - "projectId": "project-uuid", - "tasks": [ +### ai_tool Connection Type + +All HTTP Request Tool nodes connect to the MCP Trigger using `ai_tool` connection type: + +```json +"connections": { + "workspacesGet": { + "ai_tool": [ + [ { - "contentType": "text/plain", - "content": "Complete integration", - "placement": "beforeend" + "node": "MCP Server Trigger", + "type": "ai_tool", + "index": 0 } ] - } - }' + ] + } +} ``` -#### 4. Update Task Assignees +### 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 \ +curl -X POST https://your-n8n.com/webhook/taskade-mcp-server \ -H "Content-Type: application/json" \ -d '{ - "tool": "taskPutAssignees", + "method": "tools/call", "params": { - "projectId": "project-uuid", - "taskId": "task-uuid", - "handles": ["@username1", "@username2"] + "name": "workspacesGet", + "arguments": { + "api_key": "your_api_key" + } } }' ``` -## Tool Reference - -| Tool Name | Method | Endpoint | Required Params | -|-----------|--------|----------|-----------------| -| `workspacesGet` | GET | `/workspaces` | None | -| `workspaceCreateProject` | POST | `/workspaces/{workspaceId}/projects` | `workspaceId` | -| `workspaceFoldersGet` | GET | `/workspaces/{workspaceId}/folders` | `workspaceId` | -| `projectGet` | GET | `/projects/{projectId}` | `projectId` | -| `projectCreate` | POST | `/projects` | None | -| `projectCopy` | POST | `/projects/{projectId}/copy` | `projectId` | -| `projectBlocksGet` | GET | `/projects/{projectId}/blocks` | `projectId` | -| `projectTasksGet` | GET | `/projects/{projectId}/tasks` | `projectId` | -| `taskGet` | GET | `/projects/{projectId}/tasks/{taskId}` | `projectId`, `taskId` | -| `taskPut` | PUT | `/projects/{projectId}/tasks/{taskId}` | `projectId`, `taskId` | -| `taskCreate` | POST | `/projects/{projectId}/tasks/` | `projectId` | -| `taskComplete` | POST | `/projects/{projectId}/tasks/{taskId}/complete` | `projectId`, `taskId` | -| `taskMove` | PUT | `/projects/{projectId}/tasks/{taskId}/move` | `projectId`, `taskId` | -| `taskAssigneesGet` | GET | `/projects/{projectId}/tasks/{taskId}/assignees` | `projectId`, `taskId` | -| `taskPutAssignees` | PUT | `/projects/{projectId}/tasks/{taskId}/assignees` | `projectId`, `taskId` | -| `taskDeleteAssignees` | DELETE | `/projects/{projectId}/tasks/{taskId}/assignees/{assigneeHandle}` | `projectId`, `taskId`, `assigneeHandle` | -| `taskGetDate` | GET | `/projects/{projectId}/tasks/{taskId}/date` | `projectId`, `taskId` | -| `taskPutDate` | PUT | `/projects/{projectId}/tasks/{taskId}/date` | `projectId`, `taskId` | -| `taskDeleteDate` | DELETE | `/projects/{projectId}/tasks/{taskId}/date` | `projectId`, `taskId` | -| `taskNotePut` | PUT | `/projects/{projectId}/tasks/{taskId}/note` | `projectId`, `taskId` | -| `folderProjectsGet` | GET | `/folders/{folderId}/projects` | `folderId` | - -## Configuration Details - -### Authentication -All HTTP nodes are configured to use the `TASKADE_API_KEY` environment variable: -- Header: `Authorization: Bearer {{ $env.TASKADE_API_KEY }}` -- Base URL: `https://www.taskade.com/api/v1` - -### Parameter Mapping -The workflow uses n8n expressions to map incoming parameters: -- Path parameters: `{{ $json.params.paramName }}` -- Query parameters: Dynamically constructed in the URL -- Body parameters: Mapped from `$json.params` object - -### Response Format -All responses are returned as JSON through the "Respond to Webhook" node. +## Advanced Configuration -## Troubleshooting +### Custom Tool Descriptions -### Common Issues +Edit node descriptions to improve AI understanding: -1. **"TASKADE_API_KEY is not defined"** - - Ensure the environment variable is set in your n8n instance - - Restart n8n after setting the variable +1. Click on any HTTP Request Tool node +2. Update the "Description" field in node settings +3. Save and reactivate workflow -2. **"404 Not Found"** - - Check that the workflow is activated - - Verify the webhook URL is correct - - Ensure the `tool` name matches exactly +### Adding Rate Limiting -3. **"Invalid tool name"** - - Check the spelling of the `tool` field - - Refer to the Tool Reference table for valid names +Add rate limiting to the MCP Trigger: -4. **"Missing required parameter"** - - Check the Tool Reference for required parameters - - Ensure all required fields are in the `params` object +1. Add a "Rate Limit" node before HTTP tools +2. Configure requests per time window +3. Reconnect via ai_tool connections -## Development +### Error Handling -### Testing the Workflow -1. Use the n8n "Execute Workflow" button to test with manual data -2. Use the "Listen for Test Event" in the webhook node -3. Send test requests using curl or Postman +Add error handling nodes: -### Extending the Workflow -To add new endpoints: -1. Add a new condition in the "Route by Tool Name" switch node -2. Create a new HTTP Request node -3. Configure the endpoint, method, and parameters -4. Connect the new node to the response handler +1. Create an "Error Trigger" node +2. Configure notification (email, Slack, etc.) +3. Link to failed tool executions ## API Documentation -For complete Taskade API documentation, visit: -- Developer Docs: https://developers.taskade.com -- API Reference: https://developers.taskade.com/reference +- **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 -- GitHub Issues: https://github.com/taskade/mcp/issues -- Email: hello@taskade.com +- **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 index a7f8dd3..5dbbedc 100644 --- a/n8n-taskade-mcp-workflow.json +++ b/n8n-taskade-mcp-workflow.json @@ -3,507 +3,26 @@ "nodes": [ { "parameters": { - "httpMethod": "POST", - "path": "taskade-mcp", - "responseMode": "responseNode", - "options": {} + "path": "taskade-mcp-server" }, - "id": "webhook-trigger", - "name": "MCP Server Trigger", - "type": "n8n-nodes-base.webhook", + "type": "@n8n/n8n-nodes-langchain.mcpTrigger", "typeVersion": 2, - "position": [240, 300], - "webhookId": "taskade-mcp-webhook" - }, - { - "parameters": { - "mode": "rules", - "rules": { - "values": [ - { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict" - }, - "conditions": [ - { - "leftValue": "={{ $json.tool }}", - "rightValue": "workspacesGet", - "operator": { - "type": "string", - "operation": "equals" - } - } - ], - "combinator": "and" - }, - "renameOutput": true, - "outputKey": "workspacesGet" - }, - { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict" - }, - "conditions": [ - { - "leftValue": "={{ $json.tool }}", - "rightValue": "workspaceCreateProject", - "operator": { - "type": "string", - "operation": "equals" - } - } - ], - "combinator": "and" - }, - "renameOutput": true, - "outputKey": "workspaceCreateProject" - }, - { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict" - }, - "conditions": [ - { - "leftValue": "={{ $json.tool }}", - "rightValue": "workspaceFoldersGet", - "operator": { - "type": "string", - "operation": "equals" - } - } - ], - "combinator": "and" - }, - "renameOutput": true, - "outputKey": "workspaceFoldersGet" - }, - { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict" - }, - "conditions": [ - { - "leftValue": "={{ $json.tool }}", - "rightValue": "projectGet", - "operator": { - "type": "string", - "operation": "equals" - } - } - ], - "combinator": "and" - }, - "renameOutput": true, - "outputKey": "projectGet" - }, - { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict" - }, - "conditions": [ - { - "leftValue": "={{ $json.tool }}", - "rightValue": "projectCreate", - "operator": { - "type": "string", - "operation": "equals" - } - } - ], - "combinator": "and" - }, - "renameOutput": true, - "outputKey": "projectCreate" - }, - { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict" - }, - "conditions": [ - { - "leftValue": "={{ $json.tool }}", - "rightValue": "projectCopy", - "operator": { - "type": "string", - "operation": "equals" - } - } - ], - "combinator": "and" - }, - "renameOutput": true, - "outputKey": "projectCopy" - }, - { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict" - }, - "conditions": [ - { - "leftValue": "={{ $json.tool }}", - "rightValue": "projectBlocksGet", - "operator": { - "type": "string", - "operation": "equals" - } - } - ], - "combinator": "and" - }, - "renameOutput": true, - "outputKey": "projectBlocksGet" - }, - { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict" - }, - "conditions": [ - { - "leftValue": "={{ $json.tool }}", - "rightValue": "projectTasksGet", - "operator": { - "type": "string", - "operation": "equals" - } - } - ], - "combinator": "and" - }, - "renameOutput": true, - "outputKey": "projectTasksGet" - }, - { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict" - }, - "conditions": [ - { - "leftValue": "={{ $json.tool }}", - "rightValue": "taskGet", - "operator": { - "type": "string", - "operation": "equals" - } - } - ], - "combinator": "and" - }, - "renameOutput": true, - "outputKey": "taskGet" - }, - { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict" - }, - "conditions": [ - { - "leftValue": "={{ $json.tool }}", - "rightValue": "taskPut", - "operator": { - "type": "string", - "operation": "equals" - } - } - ], - "combinator": "and" - }, - "renameOutput": true, - "outputKey": "taskPut" - }, - { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict" - }, - "conditions": [ - { - "leftValue": "={{ $json.tool }}", - "rightValue": "taskCreate", - "operator": { - "type": "string", - "operation": "equals" - } - } - ], - "combinator": "and" - }, - "renameOutput": true, - "outputKey": "taskCreate" - }, - { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict" - }, - "conditions": [ - { - "leftValue": "={{ $json.tool }}", - "rightValue": "taskComplete", - "operator": { - "type": "string", - "operation": "equals" - } - } - ], - "combinator": "and" - }, - "renameOutput": true, - "outputKey": "taskComplete" - }, - { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict" - }, - "conditions": [ - { - "leftValue": "={{ $json.tool }}", - "rightValue": "taskMove", - "operator": { - "type": "string", - "operation": "equals" - } - } - ], - "combinator": "and" - }, - "renameOutput": true, - "outputKey": "taskMove" - }, - { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict" - }, - "conditions": [ - { - "leftValue": "={{ $json.tool }}", - "rightValue": "taskAssigneesGet", - "operator": { - "type": "string", - "operation": "equals" - } - } - ], - "combinator": "and" - }, - "renameOutput": true, - "outputKey": "taskAssigneesGet" - }, - { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict" - }, - "conditions": [ - { - "leftValue": "={{ $json.tool }}", - "rightValue": "taskPutAssignees", - "operator": { - "type": "string", - "operation": "equals" - } - } - ], - "combinator": "and" - }, - "renameOutput": true, - "outputKey": "taskPutAssignees" - }, - { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict" - }, - "conditions": [ - { - "leftValue": "={{ $json.tool }}", - "rightValue": "taskDeleteAssignees", - "operator": { - "type": "string", - "operation": "equals" - } - } - ], - "combinator": "and" - }, - "renameOutput": true, - "outputKey": "taskDeleteAssignees" - }, - { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict" - }, - "conditions": [ - { - "leftValue": "={{ $json.tool }}", - "rightValue": "taskGetDate", - "operator": { - "type": "string", - "operation": "equals" - } - } - ], - "combinator": "and" - }, - "renameOutput": true, - "outputKey": "taskGetDate" - }, - { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict" - }, - "conditions": [ - { - "leftValue": "={{ $json.tool }}", - "rightValue": "taskPutDate", - "operator": { - "type": "string", - "operation": "equals" - } - } - ], - "combinator": "and" - }, - "renameOutput": true, - "outputKey": "taskPutDate" - }, - { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict" - }, - "conditions": [ - { - "leftValue": "={{ $json.tool }}", - "rightValue": "taskDeleteDate", - "operator": { - "type": "string", - "operation": "equals" - } - } - ], - "combinator": "and" - }, - "renameOutput": true, - "outputKey": "taskDeleteDate" - }, - { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict" - }, - "conditions": [ - { - "leftValue": "={{ $json.tool }}", - "rightValue": "taskNotePut", - "operator": { - "type": "string", - "operation": "equals" - } - } - ], - "combinator": "and" - }, - "renameOutput": true, - "outputKey": "taskNotePut" - }, - { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict" - }, - "conditions": [ - { - "leftValue": "={{ $json.tool }}", - "rightValue": "folderProjectsGet", - "operator": { - "type": "string", - "operation": "equals" - } - } - ], - "combinator": "and" - }, - "renameOutput": true, - "outputKey": "folderProjectsGet" - } - ] - }, - "options": {} - }, - "id": "switch-router", - "name": "Route by Tool Name", - "type": "n8n-nodes-base.switch", - "typeVersion": 3.2, - "position": [460, 300] + "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": "predefinedCredentialType", - "nodeCredentialType": "taskadeApi", + "authentication": "none", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", - "value": "Bearer {{ $env.TASKADE_API_KEY }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key from environment variable', 'string') }}" } ] }, @@ -515,24 +34,24 @@ } } }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 100], "id": "http-workspaces-get", - "name": "GET Workspaces", - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [680, 100] + "name": "workspacesGet", + "description": "Get all workspaces for a user" }, { "parameters": { "method": "POST", - "url": "=https://www.taskade.com/api/v1/workspaces/{{ $json.params.workspaceId }}/projects", - "authentication": "predefinedCredentialType", - "nodeCredentialType": "taskadeApi", + "url": "={{ 'https://www.taskade.com/api/v1/workspaces/' + $fromAI('workspaceId', 'The workspace ID', 'string') + '/projects' }}", + "authentication": "none", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", - "value": "Bearer {{ $env.TASKADE_API_KEY }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key', 'string') }}" }, { "name": "Content-Type", @@ -545,11 +64,11 @@ "parameters": [ { "name": "contentType", - "value": "={{ $json.params.contentType || 'text/markdown' }}" + "value": "={{ $fromAI('contentType', 'Content type: text/markdown or text/plain', 'string') }}" }, { "name": "content", - "value": "={{ $json.params.content }}" + "value": "={{ $fromAI('content', 'Project content', 'string') }}" } ] }, @@ -561,24 +80,24 @@ } } }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 200], "id": "http-workspace-create-project", - "name": "POST Workspace Create Project", - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [680, 200] + "name": "workspaceCreateProject", + "description": "Create a project in a workspace" }, { "parameters": { "method": "GET", - "url": "=https://www.taskade.com/api/v1/workspaces/{{ $json.params.workspaceId }}/folders", - "authentication": "predefinedCredentialType", - "nodeCredentialType": "taskadeApi", + "url": "={{ 'https://www.taskade.com/api/v1/workspaces/' + $fromAI('workspaceId', 'The workspace ID', 'string') + '/folders' }}", + "authentication": "none", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", - "value": "Bearer {{ $env.TASKADE_API_KEY }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key', 'string') }}" } ] }, @@ -590,24 +109,24 @@ } } }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 300], "id": "http-workspace-folders-get", - "name": "GET Workspace Folders", - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [680, 300] + "name": "workspaceFoldersGet", + "description": "Get all folders for a workspace" }, { "parameters": { "method": "GET", - "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}", - "authentication": "predefinedCredentialType", - "nodeCredentialType": "taskadeApi", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'The project ID', 'string') }}", + "authentication": "none", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", - "value": "Bearer {{ $env.TASKADE_API_KEY }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key', 'string') }}" } ] }, @@ -619,24 +138,24 @@ } } }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 400], "id": "http-project-get", - "name": "GET Project", - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [680, 400] + "name": "projectGet", + "description": "Get project by ID" }, { "parameters": { "method": "POST", "url": "https://www.taskade.com/api/v1/projects", - "authentication": "predefinedCredentialType", - "nodeCredentialType": "taskadeApi", + "authentication": "none", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", - "value": "Bearer {{ $env.TASKADE_API_KEY }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key', 'string') }}" }, { "name": "Content-Type", @@ -649,15 +168,15 @@ "parameters": [ { "name": "folderId", - "value": "={{ $json.params.folderId }}" + "value": "={{ $fromAI('folderId', 'The folder ID (optional)', 'string') }}" }, { "name": "contentType", - "value": "={{ $json.params.contentType || 'text/markdown' }}" + "value": "={{ $fromAI('contentType', 'Content type: text/markdown or text/plain', 'string') }}" }, { "name": "content", - "value": "={{ $json.params.content }}" + "value": "={{ $fromAI('content', 'Project content', 'string') }}" } ] }, @@ -669,24 +188,24 @@ } } }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 500], "id": "http-project-create", - "name": "POST Project Create", - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [680, 500] + "name": "projectCreate", + "description": "Create a new project in a team" }, { "parameters": { "method": "POST", - "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/copy", - "authentication": "predefinedCredentialType", - "nodeCredentialType": "taskadeApi", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'The project ID to copy', 'string') + '/copy' }}", + "authentication": "none", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", - "value": "Bearer {{ $env.TASKADE_API_KEY }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key', 'string') }}" }, { "name": "Content-Type", @@ -699,11 +218,11 @@ "parameters": [ { "name": "folderId", - "value": "={{ $json.params.folderId }}" + "value": "={{ $fromAI('folderId', 'Destination folder ID (optional)', 'string') }}" }, { "name": "projectTitle", - "value": "={{ $json.params.projectTitle }}" + "value": "={{ $fromAI('projectTitle', 'New project title (optional)', 'string') }}" } ] }, @@ -715,24 +234,41 @@ } } }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 600], "id": "http-project-copy", - "name": "POST Project Copy", - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [680, 600] + "name": "projectCopy", + "description": "Copy a project to a folder" }, { "parameters": { "method": "GET", - "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/blocks?limit={{ $json.params.limit || 100 }}{{ $json.params.after ? '&after=' + $json.params.after : '' }}{{ $json.params.before ? '&before=' + $json.params.before : '' }}", - "authentication": "predefinedCredentialType", - "nodeCredentialType": "taskadeApi", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'The project ID', 'string') + '/blocks' }}", + "authentication": "none", + "sendQuery": true, + "queryParameters": { + "parameters": [ + { + "name": "limit", + "value": "={{ $fromAI('limit', 'Number of blocks to return (default 100)', 'number') }}" + }, + { + "name": "after", + "value": "={{ $fromAI('after', 'Cursor for pagination (UUID)', 'string') }}" + }, + { + "name": "before", + "value": "={{ $fromAI('before', 'Cursor for pagination (UUID)', 'string') }}" + } + ] + }, "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", - "value": "Bearer {{ $env.TASKADE_API_KEY }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key', 'string') }}" } ] }, @@ -744,24 +280,41 @@ } } }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 700], "id": "http-project-blocks-get", - "name": "GET Project Blocks", - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [680, 700] + "name": "projectBlocksGet", + "description": "Get all blocks for a project" }, { "parameters": { "method": "GET", - "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks?limit={{ $json.params.limit || 100 }}{{ $json.params.after ? '&after=' + $json.params.after : '' }}{{ $json.params.before ? '&before=' + $json.params.before : '' }}", - "authentication": "predefinedCredentialType", - "nodeCredentialType": "taskadeApi", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'The project ID', 'string') + '/tasks' }}", + "authentication": "none", + "sendQuery": true, + "queryParameters": { + "parameters": [ + { + "name": "limit", + "value": "={{ $fromAI('limit', 'Number of tasks to return (default 100)', 'number') }}" + }, + { + "name": "after", + "value": "={{ $fromAI('after', 'Cursor for pagination (UUID)', 'string') }}" + }, + { + "name": "before", + "value": "={{ $fromAI('before', 'Cursor for pagination (UUID)', 'string') }}" + } + ] + }, "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", - "value": "Bearer {{ $env.TASKADE_API_KEY }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key', 'string') }}" } ] }, @@ -773,24 +326,24 @@ } } }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 800], "id": "http-project-tasks-get", - "name": "GET Project Tasks", - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [680, 800] + "name": "projectTasksGet", + "description": "Get all tasks for a project" }, { "parameters": { "method": "GET", - "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/{{ $json.params.taskId }}", - "authentication": "predefinedCredentialType", - "nodeCredentialType": "taskadeApi", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'The project ID', 'string') + '/tasks/' + $fromAI('taskId', 'The task ID', 'string') }}", + "authentication": "none", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", - "value": "Bearer {{ $env.TASKADE_API_KEY }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key', 'string') }}" } ] }, @@ -802,24 +355,24 @@ } } }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 900], "id": "http-task-get", - "name": "GET Task", - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [680, 900] + "name": "taskGet", + "description": "Get a specific task by ID" }, { "parameters": { "method": "PUT", - "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/{{ $json.params.taskId }}", - "authentication": "predefinedCredentialType", - "nodeCredentialType": "taskadeApi", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'The project ID', 'string') + '/tasks/' + $fromAI('taskId', 'The task ID', 'string') }}", + "authentication": "none", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", - "value": "Bearer {{ $env.TASKADE_API_KEY }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key', 'string') }}" }, { "name": "Content-Type", @@ -832,11 +385,11 @@ "parameters": [ { "name": "contentType", - "value": "={{ $json.params.contentType }}" + "value": "={{ $fromAI('contentType', 'Content type: text/markdown or text/plain', 'string') }}" }, { "name": "content", - "value": "={{ $json.params.content }}" + "value": "={{ $fromAI('content', 'Task content (max 2000 characters)', 'string') }}" } ] }, @@ -848,24 +401,24 @@ } } }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 1000], "id": "http-task-put", - "name": "PUT Task Update", - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [680, 1000] + "name": "taskPut", + "description": "Update a task's content" }, { "parameters": { "method": "POST", - "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/", - "authentication": "predefinedCredentialType", - "nodeCredentialType": "taskadeApi", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'The project ID', 'string') + '/tasks/' }}", + "authentication": "none", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", - "value": "Bearer {{ $env.TASKADE_API_KEY }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key', 'string') }}" }, { "name": "Content-Type", @@ -878,7 +431,7 @@ "parameters": [ { "name": "tasks", - "value": "={{ $json.params.tasks }}" + "value": "={{ $fromAI('tasks', 'Array of tasks with contentType, content, and placement', 'string') }}" } ] }, @@ -890,24 +443,24 @@ } } }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 1100], "id": "http-task-create", - "name": "POST Task Create", - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [680, 1100] + "name": "taskCreate", + "description": "Create one or more tasks in a project" }, { "parameters": { "method": "POST", - "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/{{ $json.params.taskId }}/complete", - "authentication": "predefinedCredentialType", - "nodeCredentialType": "taskadeApi", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'The project ID', 'string') + '/tasks/' + $fromAI('taskId', 'The task ID', 'string') + '/complete' }}", + "authentication": "none", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", - "value": "Bearer {{ $env.TASKADE_API_KEY }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key', 'string') }}" } ] }, @@ -919,24 +472,24 @@ } } }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 1200], "id": "http-task-complete", - "name": "POST Task Complete", - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [680, 1200] + "name": "taskComplete", + "description": "Mark a task as complete" }, { "parameters": { "method": "PUT", - "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/{{ $json.params.taskId }}/move", - "authentication": "predefinedCredentialType", - "nodeCredentialType": "taskadeApi", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'The project ID', 'string') + '/tasks/' + $fromAI('taskId', 'The task ID', 'string') + '/move' }}", + "authentication": "none", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", - "value": "Bearer {{ $env.TASKADE_API_KEY }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key', 'string') }}" }, { "name": "Content-Type", @@ -949,7 +502,7 @@ "parameters": [ { "name": "target", - "value": "={{ $json.params.target }}" + "value": "={{ $fromAI('target', 'Target object with taskId and position (beforebegin/afterbegin/beforeend/afterend)', 'string') }}" } ] }, @@ -961,24 +514,24 @@ } } }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 1300], "id": "http-task-move", - "name": "PUT Task Move", - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [680, 1300] + "name": "taskMove", + "description": "Move a task within the project" }, { "parameters": { "method": "GET", - "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/{{ $json.params.taskId }}/assignees", - "authentication": "predefinedCredentialType", - "nodeCredentialType": "taskadeApi", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'The project ID', 'string') + '/tasks/' + $fromAI('taskId', 'The task ID', 'string') + '/assignees' }}", + "authentication": "none", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", - "value": "Bearer {{ $env.TASKADE_API_KEY }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key', 'string') }}" } ] }, @@ -990,24 +543,24 @@ } } }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 1400], "id": "http-task-assignees-get", - "name": "GET Task Assignees", - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [680, 1400] + "name": "taskAssigneesGet", + "description": "Get the assignees of a task" }, { "parameters": { "method": "PUT", - "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/{{ $json.params.taskId }}/assignees", - "authentication": "predefinedCredentialType", - "nodeCredentialType": "taskadeApi", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'The project ID', 'string') + '/tasks/' + $fromAI('taskId', 'The task ID', 'string') + '/assignees' }}", + "authentication": "none", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", - "value": "Bearer {{ $env.TASKADE_API_KEY }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key', 'string') }}" }, { "name": "Content-Type", @@ -1020,7 +573,7 @@ "parameters": [ { "name": "handles", - "value": "={{ $json.params.handles }}" + "value": "={{ $fromAI('handles', 'Array of user handles to assign', 'string') }}" } ] }, @@ -1032,24 +585,24 @@ } } }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 1500], "id": "http-task-put-assignees", - "name": "PUT Task Assignees", - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [680, 1500] + "name": "taskPutAssignees", + "description": "Assign users to a task" }, { "parameters": { "method": "DELETE", - "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/{{ $json.params.taskId }}/assignees/{{ $json.params.assigneeHandle }}", - "authentication": "predefinedCredentialType", - "nodeCredentialType": "taskadeApi", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'The project ID', 'string') + '/tasks/' + $fromAI('taskId', 'The task ID', 'string') + '/assignees/' + $fromAI('assigneeHandle', 'The assignee handle to remove', 'string') }}", + "authentication": "none", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", - "value": "Bearer {{ $env.TASKADE_API_KEY }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key', 'string') }}" } ] }, @@ -1061,24 +614,24 @@ } } }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 1600], "id": "http-task-delete-assignees", - "name": "DELETE Task Assignee", - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [680, 1600] + "name": "taskDeleteAssignees", + "description": "Remove an assignee from a task" }, { "parameters": { "method": "GET", - "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/{{ $json.params.taskId }}/date", - "authentication": "predefinedCredentialType", - "nodeCredentialType": "taskadeApi", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'The project ID', 'string') + '/tasks/' + $fromAI('taskId', 'The task ID', 'string') + '/date' }}", + "authentication": "none", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", - "value": "Bearer {{ $env.TASKADE_API_KEY }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key', 'string') }}" } ] }, @@ -1090,24 +643,24 @@ } } }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 1700], "id": "http-task-get-date", - "name": "GET Task Date", - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [680, 1700] + "name": "taskGetDate", + "description": "Get the date of a task" }, { "parameters": { "method": "PUT", - "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/{{ $json.params.taskId }}/date", - "authentication": "predefinedCredentialType", - "nodeCredentialType": "taskadeApi", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'The project ID', 'string') + '/tasks/' + $fromAI('taskId', 'The task ID', 'string') + '/date' }}", + "authentication": "none", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", - "value": "Bearer {{ $env.TASKADE_API_KEY }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key', 'string') }}" }, { "name": "Content-Type", @@ -1120,11 +673,11 @@ "parameters": [ { "name": "start", - "value": "={{ $json.params.start }}" + "value": "={{ $fromAI('start', 'Start date object with date, time, timezone', 'string') }}" }, { "name": "end", - "value": "={{ $json.params.end }}" + "value": "={{ $fromAI('end', 'End date object with date, time, timezone', 'string') }}" } ] }, @@ -1136,24 +689,24 @@ } } }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 1800], "id": "http-task-put-date", - "name": "PUT Task Date", - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [680, 1800] + "name": "taskPutDate", + "description": "Create or update date for a task" }, { "parameters": { "method": "DELETE", - "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/{{ $json.params.taskId }}/date", - "authentication": "predefinedCredentialType", - "nodeCredentialType": "taskadeApi", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'The project ID', 'string') + '/tasks/' + $fromAI('taskId', 'The task ID', 'string') + '/date' }}", + "authentication": "none", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", - "value": "Bearer {{ $env.TASKADE_API_KEY }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key', 'string') }}" } ] }, @@ -1165,24 +718,24 @@ } } }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 1900], "id": "http-task-delete-date", - "name": "DELETE Task Date", - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [680, 1900] + "name": "taskDeleteDate", + "description": "Delete the date of a task" }, { "parameters": { "method": "PUT", - "url": "=https://www.taskade.com/api/v1/projects/{{ $json.params.projectId }}/tasks/{{ $json.params.taskId }}/note", - "authentication": "predefinedCredentialType", - "nodeCredentialType": "taskadeApi", + "url": "={{ 'https://www.taskade.com/api/v1/projects/' + $fromAI('projectId', 'The project ID', 'string') + '/tasks/' + $fromAI('taskId', 'The task ID', 'string') + '/note' }}", + "authentication": "none", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", - "value": "Bearer {{ $env.TASKADE_API_KEY }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key', 'string') }}" }, { "name": "Content-Type", @@ -1195,11 +748,11 @@ "parameters": [ { "name": "type", - "value": "={{ $json.params.type }}" + "value": "={{ $fromAI('type', 'Note type: text/plain or text/markdown', 'string') }}" }, { "name": "value", - "value": "={{ $json.params.value }}" + "value": "={{ $fromAI('value', 'Note content', 'string') }}" } ] }, @@ -1211,24 +764,24 @@ } } }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 2000], "id": "http-task-note-put", - "name": "PUT Task Note", - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [680, 2000] + "name": "taskNotePut", + "description": "Add or update a note to the task" }, { "parameters": { "method": "GET", - "url": "=https://www.taskade.com/api/v1/folders/{{ $json.params.folderId }}/projects", - "authentication": "predefinedCredentialType", - "nodeCredentialType": "taskadeApi", + "url": "={{ 'https://www.taskade.com/api/v1/folders/' + $fromAI('folderId', 'The folder ID', 'string') + '/projects' }}", + "authentication": "none", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", - "value": "Bearer {{ $env.TASKADE_API_KEY }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key', 'string') }}" } ] }, @@ -1240,414 +793,241 @@ } } }, + "type": "n8n-nodes-base.httpRequestTool", + "typeVersion": 4.3, + "position": [600, 2100], "id": "http-folder-projects-get", - "name": "GET Folder Projects", - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [680, 2100] - }, - { - "parameters": { - "respondWith": "json", - "responseBody": "={{ $json }}", - "options": {} - }, - "id": "respond-to-webhook", - "name": "Respond to Webhook", - "type": "n8n-nodes-base.respondToWebhook", - "typeVersion": 1.1, - "position": [900, 300] + "name": "folderProjectsGet", + "description": "Get all projects in a folder" } ], "connections": { - "MCP Server Trigger": { - "main": [ - [ - { - "node": "Route by Tool Name", - "type": "main", - "index": 0 - } - ] - ] - }, - "Route by Tool Name": { - "main": [ - [ - { - "node": "GET Workspaces", - "type": "main", - "index": 0 - } - ], - [ - { - "node": "POST Workspace Create Project", - "type": "main", - "index": 0 - } - ], - [ - { - "node": "GET Workspace Folders", - "type": "main", - "index": 0 - } - ], - [ - { - "node": "GET Project", - "type": "main", - "index": 0 - } - ], - [ - { - "node": "POST Project Create", - "type": "main", - "index": 0 - } - ], - [ - { - "node": "POST Project Copy", - "type": "main", - "index": 0 - } - ], - [ - { - "node": "GET Project Blocks", - "type": "main", - "index": 0 - } - ], - [ - { - "node": "GET Project Tasks", - "type": "main", - "index": 0 - } - ], - [ - { - "node": "GET Task", - "type": "main", - "index": 0 - } - ], - [ - { - "node": "PUT Task Update", - "type": "main", - "index": 0 - } - ], - [ - { - "node": "POST Task Create", - "type": "main", - "index": 0 - } - ], - [ - { - "node": "POST Task Complete", - "type": "main", - "index": 0 - } - ], - [ - { - "node": "PUT Task Move", - "type": "main", - "index": 0 - } - ], - [ - { - "node": "GET Task Assignees", - "type": "main", - "index": 0 - } - ], - [ - { - "node": "PUT Task Assignees", - "type": "main", - "index": 0 - } - ], - [ - { - "node": "DELETE Task Assignee", - "type": "main", - "index": 0 - } - ], - [ - { - "node": "GET Task Date", - "type": "main", - "index": 0 - } - ], - [ - { - "node": "PUT Task Date", - "type": "main", - "index": 0 - } - ], - [ - { - "node": "DELETE Task Date", - "type": "main", - "index": 0 - } - ], - [ - { - "node": "PUT Task Note", - "type": "main", - "index": 0 - } - ], - [ - { - "node": "GET Folder Projects", - "type": "main", - "index": 0 - } - ] - ] - }, - "GET Workspaces": { - "main": [ + "workspacesGet": { + "ai_tool": [ [ { - "node": "Respond to Webhook", - "type": "main", + "node": "MCP Server Trigger", + "type": "ai_tool", "index": 0 } ] ] }, - "POST Workspace Create Project": { - "main": [ + "workspaceCreateProject": { + "ai_tool": [ [ { - "node": "Respond to Webhook", - "type": "main", + "node": "MCP Server Trigger", + "type": "ai_tool", "index": 0 } ] ] }, - "GET Workspace Folders": { - "main": [ + "workspaceFoldersGet": { + "ai_tool": [ [ { - "node": "Respond to Webhook", - "type": "main", + "node": "MCP Server Trigger", + "type": "ai_tool", "index": 0 } ] ] }, - "GET Project": { - "main": [ + "projectGet": { + "ai_tool": [ [ { - "node": "Respond to Webhook", - "type": "main", + "node": "MCP Server Trigger", + "type": "ai_tool", "index": 0 } ] ] }, - "POST Project Create": { - "main": [ + "projectCreate": { + "ai_tool": [ [ { - "node": "Respond to Webhook", - "type": "main", + "node": "MCP Server Trigger", + "type": "ai_tool", "index": 0 } ] ] }, - "POST Project Copy": { - "main": [ + "projectCopy": { + "ai_tool": [ [ { - "node": "Respond to Webhook", - "type": "main", + "node": "MCP Server Trigger", + "type": "ai_tool", "index": 0 } ] ] }, - "GET Project Blocks": { - "main": [ + "projectBlocksGet": { + "ai_tool": [ [ { - "node": "Respond to Webhook", - "type": "main", + "node": "MCP Server Trigger", + "type": "ai_tool", "index": 0 } ] ] }, - "GET Project Tasks": { - "main": [ + "projectTasksGet": { + "ai_tool": [ [ { - "node": "Respond to Webhook", - "type": "main", + "node": "MCP Server Trigger", + "type": "ai_tool", "index": 0 } ] ] }, - "GET Task": { - "main": [ + "taskGet": { + "ai_tool": [ [ { - "node": "Respond to Webhook", - "type": "main", + "node": "MCP Server Trigger", + "type": "ai_tool", "index": 0 } ] ] }, - "PUT Task Update": { - "main": [ + "taskPut": { + "ai_tool": [ [ { - "node": "Respond to Webhook", - "type": "main", + "node": "MCP Server Trigger", + "type": "ai_tool", "index": 0 } ] ] }, - "POST Task Create": { - "main": [ + "taskCreate": { + "ai_tool": [ [ { - "node": "Respond to Webhook", - "type": "main", + "node": "MCP Server Trigger", + "type": "ai_tool", "index": 0 } ] ] }, - "POST Task Complete": { - "main": [ + "taskComplete": { + "ai_tool": [ [ { - "node": "Respond to Webhook", - "type": "main", + "node": "MCP Server Trigger", + "type": "ai_tool", "index": 0 } ] ] }, - "PUT Task Move": { - "main": [ + "taskMove": { + "ai_tool": [ [ { - "node": "Respond to Webhook", - "type": "main", + "node": "MCP Server Trigger", + "type": "ai_tool", "index": 0 } ] ] }, - "GET Task Assignees": { - "main": [ + "taskAssigneesGet": { + "ai_tool": [ [ { - "node": "Respond to Webhook", - "type": "main", + "node": "MCP Server Trigger", + "type": "ai_tool", "index": 0 } ] ] }, - "PUT Task Assignees": { - "main": [ + "taskPutAssignees": { + "ai_tool": [ [ { - "node": "Respond to Webhook", - "type": "main", + "node": "MCP Server Trigger", + "type": "ai_tool", "index": 0 } ] ] }, - "DELETE Task Assignee": { - "main": [ + "taskDeleteAssignees": { + "ai_tool": [ [ { - "node": "Respond to Webhook", - "type": "main", + "node": "MCP Server Trigger", + "type": "ai_tool", "index": 0 } ] ] }, - "GET Task Date": { - "main": [ + "taskGetDate": { + "ai_tool": [ [ { - "node": "Respond to Webhook", - "type": "main", + "node": "MCP Server Trigger", + "type": "ai_tool", "index": 0 } ] ] }, - "PUT Task Date": { - "main": [ + "taskPutDate": { + "ai_tool": [ [ { - "node": "Respond to Webhook", - "type": "main", + "node": "MCP Server Trigger", + "type": "ai_tool", "index": 0 } ] ] }, - "DELETE Task Date": { - "main": [ + "taskDeleteDate": { + "ai_tool": [ [ { - "node": "Respond to Webhook", - "type": "main", + "node": "MCP Server Trigger", + "type": "ai_tool", "index": 0 } ] ] }, - "PUT Task Note": { - "main": [ + "taskNotePut": { + "ai_tool": [ [ { - "node": "Respond to Webhook", - "type": "main", + "node": "MCP Server Trigger", + "type": "ai_tool", "index": 0 } ] ] }, - "GET Folder Projects": { - "main": [ + "folderProjectsGet": { + "ai_tool": [ [ { - "node": "Respond to Webhook", - "type": "main", + "node": "MCP Server Trigger", + "type": "ai_tool", "index": 0 } ] @@ -1662,5 +1042,5 @@ "tags": [], "triggerCount": 1, "updatedAt": "2025-11-04T00:00:00.000Z", - "versionId": "1" + "versionId": "2" } From 2cccaa2f75483e9e28504c142ea0a18c5a35fd6f Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 4 Nov 2025 16:45:54 +0000 Subject: [PATCH 3/3] feat: Enhance n8n workflow with comprehensive OpenAPI descriptions This commit enhances all 21 tool nodes with detailed descriptions extracted from the official Taskade OpenAPI 3.0.3 specification. Enhancements include: - Comprehensive tool descriptions with use cases and return values - Detailed parameter descriptions with REQUIRED/OPTIONAL labels - Data type specifications and format requirements (UUID, alphanumeric, patterns) - Regex patterns for validation (dates, times, content patterns) - Min/max length constraints and character limits - Enum value listings for restricted fields - JSON format examples for complex parameters (tasks array, date objects, target objects) - Cross-references to related tools for workflow guidance - Nullability information for responses - Business logic notes (e.g., "REPLACES all existing assignees") Key improvements: - All $fromAI() parameter descriptions now include detailed validation rules - Tool descriptions explain response formats and data structures - Clear guidance on when to use each tool and how tools relate to each other - Specific patterns for dates (^\d{4}-\d{2}-\d{2}$) and times (^(?:[0-1][0-9]|[2][0-3]):[0-5][0-9](?::[0-5][0-9])?$) - Task creation placement options with examples - Pagination guidance for blocks and tasks endpoints This enhancement significantly improves AI understanding and reduces errors when interacting with the Taskade API through the MCP server. Version: 3 --- n8n-taskade-mcp-workflow.json | 168 +++++++++++++++++----------------- 1 file changed, 84 insertions(+), 84 deletions(-) diff --git a/n8n-taskade-mcp-workflow.json b/n8n-taskade-mcp-workflow.json index 5dbbedc..66db957 100644 --- a/n8n-taskade-mcp-workflow.json +++ b/n8n-taskade-mcp-workflow.json @@ -22,7 +22,7 @@ "parameters": [ { "name": "Authorization", - "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key from environment variable', 'string') }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password. Format: Bearer token for authentication.', 'string') }}" } ] }, @@ -39,19 +39,19 @@ "position": [600, 100], "id": "http-workspaces-get", "name": "workspacesGet", - "description": "Get all workspaces for a user" + "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', 'The workspace ID', 'string') + '/projects' }}", + "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', 'Taskade API Key', 'string') }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" }, { "name": "Content-Type", @@ -64,11 +64,11 @@ "parameters": [ { "name": "contentType", - "value": "={{ $fromAI('contentType', 'Content type: text/markdown or text/plain', 'string') }}" + "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', 'Project content', 'string') }}" + "value": "={{ $fromAI('content', 'REQUIRED: Initial content for the new project in markdown format. This will be the project\\'s starting content/template.', 'string') }}" } ] }, @@ -85,19 +85,19 @@ "position": [600, 200], "id": "http-workspace-create-project", "name": "workspaceCreateProject", - "description": "Create a project in a workspace" + "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', 'The workspace ID', 'string') + '/folders' }}", + "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', 'Taskade API Key', 'string') }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" } ] }, @@ -114,19 +114,19 @@ "position": [600, 300], "id": "http-workspace-folders-get", "name": "workspaceFoldersGet", - "description": "Get all folders for a workspace" + "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', 'The project ID', 'string') }}", + "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', 'Taskade API Key', 'string') }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" } ] }, @@ -143,7 +143,7 @@ "position": [600, 400], "id": "http-project-get", "name": "projectGet", - "description": "Get project by ID" + "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": { @@ -155,7 +155,7 @@ "parameters": [ { "name": "Authorization", - "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key', 'string') }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" }, { "name": "Content-Type", @@ -168,15 +168,15 @@ "parameters": [ { "name": "folderId", - "value": "={{ $fromAI('folderId', 'The folder ID (optional)', 'string') }}" + "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', 'Content type: text/markdown or text/plain', 'string') }}" + "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', 'Project content', 'string') }}" + "value": "={{ $fromAI('content', 'REQUIRED: Initial content for the new project in markdown format. This will be the project\\'s starting content/template.', 'string') }}" } ] }, @@ -193,19 +193,19 @@ "position": [600, 500], "id": "http-project-create", "name": "projectCreate", - "description": "Create a new project in a team" + "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', 'The project ID to copy', 'string') + '/copy' }}", + "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', 'Taskade API Key', 'string') }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" }, { "name": "Content-Type", @@ -218,11 +218,11 @@ "parameters": [ { "name": "folderId", - "value": "={{ $fromAI('folderId', 'Destination folder ID (optional)', 'string') }}" + "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', 'New project title (optional)', 'string') }}" + "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') }}" } ] }, @@ -239,27 +239,27 @@ "position": [600, 600], "id": "http-project-copy", "name": "projectCopy", - "description": "Copy a project to a folder" + "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', 'The project ID', 'string') + '/blocks' }}", + "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', 'Number of blocks to return (default 100)', 'number') }}" + "value": "={{ $fromAI('limit', 'OPTIONAL: Number of blocks to return. Type: number. Default: 100. Controls pagination page size.', 'number') }}" }, { "name": "after", - "value": "={{ $fromAI('after', 'Cursor for pagination (UUID)', 'string') }}" + "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', 'Cursor for pagination (UUID)', 'string') }}" + "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') }}" } ] }, @@ -268,7 +268,7 @@ "parameters": [ { "name": "Authorization", - "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key', 'string') }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" } ] }, @@ -285,27 +285,27 @@ "position": [600, 700], "id": "http-project-blocks-get", "name": "projectBlocksGet", - "description": "Get all blocks for a project" + "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', 'The project ID', 'string') + '/tasks' }}", + "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', 'Number of tasks to return (default 100)', 'number') }}" + "value": "={{ $fromAI('limit', 'OPTIONAL: Number of tasks to return. Type: number. Default: 100. Controls pagination page size.', 'number') }}" }, { "name": "after", - "value": "={{ $fromAI('after', 'Cursor for pagination (UUID)', 'string') }}" + "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', 'Cursor for pagination (UUID)', 'string') }}" + "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') }}" } ] }, @@ -314,7 +314,7 @@ "parameters": [ { "name": "Authorization", - "value": "={{ 'Bearer ' + $fromAI('api_key', 'Taskade API Key', 'string') }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" } ] }, @@ -331,19 +331,19 @@ "position": [600, 800], "id": "http-project-tasks-get", "name": "projectTasksGet", - "description": "Get all tasks for a project" + "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', 'The project ID', 'string') + '/tasks/' + $fromAI('taskId', 'The task ID', 'string') }}", + "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', 'Taskade API Key', 'string') }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" } ] }, @@ -360,19 +360,19 @@ "position": [600, 900], "id": "http-task-get", "name": "taskGet", - "description": "Get a specific task by ID" + "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', 'The project ID', 'string') + '/tasks/' + $fromAI('taskId', 'The task ID', 'string') }}", + "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', 'Taskade API Key', 'string') }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" }, { "name": "Content-Type", @@ -385,11 +385,11 @@ "parameters": [ { "name": "contentType", - "value": "={{ $fromAI('contentType', 'Content type: text/markdown or text/plain', 'string') }}" + "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', 'Task content (max 2000 characters)', 'string') }}" + "value": "={{ $fromAI('content', 'REQUIRED: New task content. MUST be single line (no \\\\r or \\\\n characters allowed). Maximum 2000 characters. Pattern: ^[^\\\\r\\\\n]*$', 'string') }}" } ] }, @@ -406,19 +406,19 @@ "position": [600, 1000], "id": "http-task-put", "name": "taskPut", - "description": "Update a task's content" + "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', 'The project ID', 'string') + '/tasks/' }}", + "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', 'Taskade API Key', 'string') }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" }, { "name": "Content-Type", @@ -431,7 +431,7 @@ "parameters": [ { "name": "tasks", - "value": "={{ $fromAI('tasks', 'Array of tasks with contentType, content, and placement', 'string') }}" + "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') }}" } ] }, @@ -448,19 +448,19 @@ "position": [600, 1100], "id": "http-task-create", "name": "taskCreate", - "description": "Create one or more tasks in a project" + "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', 'The project ID', 'string') + '/tasks/' + $fromAI('taskId', 'The task ID', 'string') + '/complete' }}", + "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', 'Taskade API Key', 'string') }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" } ] }, @@ -477,19 +477,19 @@ "position": [600, 1200], "id": "http-task-complete", "name": "taskComplete", - "description": "Mark a task as complete" + "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', 'The project ID', 'string') + '/tasks/' + $fromAI('taskId', 'The task ID', 'string') + '/move' }}", + "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', 'Taskade API Key', 'string') }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" }, { "name": "Content-Type", @@ -502,7 +502,7 @@ "parameters": [ { "name": "target", - "value": "={{ $fromAI('target', 'Target object with taskId and position (beforebegin/afterbegin/beforeend/afterend)', 'string') }}" + "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') }}" } ] }, @@ -519,19 +519,19 @@ "position": [600, 1300], "id": "http-task-move", "name": "taskMove", - "description": "Move a task within the project" + "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', 'The project ID', 'string') + '/tasks/' + $fromAI('taskId', 'The task ID', 'string') + '/assignees' }}", + "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', 'Taskade API Key', 'string') }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" } ] }, @@ -548,19 +548,19 @@ "position": [600, 1400], "id": "http-task-assignees-get", "name": "taskAssigneesGet", - "description": "Get the assignees of a task" + "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', 'The project ID', 'string') + '/tasks/' + $fromAI('taskId', 'The task ID', 'string') + '/assignees' }}", + "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', 'Taskade API Key', 'string') }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" }, { "name": "Content-Type", @@ -573,7 +573,7 @@ "parameters": [ { "name": "handles", - "value": "={{ $fromAI('handles', 'Array of user handles to assign', 'string') }}" + "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') }}" } ] }, @@ -590,19 +590,19 @@ "position": [600, 1500], "id": "http-task-put-assignees", "name": "taskPutAssignees", - "description": "Assign users to a task" + "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', 'The project ID', 'string') + '/tasks/' + $fromAI('taskId', 'The task ID', 'string') + '/assignees/' + $fromAI('assigneeHandle', 'The assignee handle to remove', 'string') }}", + "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', 'Taskade API Key', 'string') }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" } ] }, @@ -619,19 +619,19 @@ "position": [600, 1600], "id": "http-task-delete-assignees", "name": "taskDeleteAssignees", - "description": "Remove an assignee from a task" + "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', 'The project ID', 'string') + '/tasks/' + $fromAI('taskId', 'The task ID', 'string') + '/date' }}", + "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', 'Taskade API Key', 'string') }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" } ] }, @@ -648,19 +648,19 @@ "position": [600, 1700], "id": "http-task-get-date", "name": "taskGetDate", - "description": "Get the date of a task" + "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', 'The project ID', 'string') + '/tasks/' + $fromAI('taskId', 'The task ID', 'string') + '/date' }}", + "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', 'Taskade API Key', 'string') }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" }, { "name": "Content-Type", @@ -673,11 +673,11 @@ "parameters": [ { "name": "start", - "value": "={{ $fromAI('start', 'Start date object with date, time, timezone', 'string') }}" + "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', 'End date object with date, time, timezone', 'string') }}" + "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') }}" } ] }, @@ -694,19 +694,19 @@ "position": [600, 1800], "id": "http-task-put-date", "name": "taskPutDate", - "description": "Create or update date for a task" + "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', 'The project ID', 'string') + '/tasks/' + $fromAI('taskId', 'The task ID', 'string') + '/date' }}", + "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', 'Taskade API Key', 'string') }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" } ] }, @@ -723,19 +723,19 @@ "position": [600, 1900], "id": "http-task-delete-date", "name": "taskDeleteDate", - "description": "Delete the date of a task" + "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', 'The project ID', 'string') + '/tasks/' + $fromAI('taskId', 'The task ID', 'string') + '/note' }}", + "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', 'Taskade API Key', 'string') }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" }, { "name": "Content-Type", @@ -748,11 +748,11 @@ "parameters": [ { "name": "type", - "value": "={{ $fromAI('type', 'Note type: text/plain or text/markdown', 'string') }}" + "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', 'Note content', 'string') }}" + "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') }}" } ] }, @@ -769,19 +769,19 @@ "position": [600, 2000], "id": "http-task-note-put", "name": "taskNotePut", - "description": "Add or update a note to the task" + "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', 'The folder ID', 'string') + '/projects' }}", + "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', 'Taskade API Key', 'string') }}" + "value": "={{ 'Bearer ' + $fromAI('api_key', 'REQUIRED: Your Taskade personal access token from https://www.taskade.com/settings/password', 'string') }}" } ] }, @@ -798,7 +798,7 @@ "position": [600, 2100], "id": "http-folder-projects-get", "name": "folderProjectsGet", - "description": "Get all projects in a folder" + "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": { @@ -1042,5 +1042,5 @@ "tags": [], "triggerCount": 1, "updatedAt": "2025-11-04T00:00:00.000Z", - "versionId": "2" + "versionId": "3" }