{"_id":"@democratize-technology/vikunja-mcp","_rev":"3-a3330c89388612699baa56f7e98c3b5a","name":"@democratize-technology/vikunja-mcp","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@democratize-technology/vikunja-mcp","version":"0.1.0","keywords":["mcp","vikunja","task-management","model-context-protocol","ai-assistant","todo","productivity","automation"],"author":{"name":"Jeremy Green"},"license":"MIT","_id":"@democratize-technology/vikunja-mcp@0.1.0","maintainers":[{"name":"jeremy-green","email":"hello@jeremy.green"}],"homepage":"https://github.com/democratize-technology/vikunja-mcp#readme","bugs":{"url":"https://github.com/democratize-technology/vikunja-mcp/issues"},"bin":{"vikunja-mcp":"dist/index.js"},"dist":{"shasum":"e4acb4278919858537c50853af4e5286901c4b6c","tarball":"https://registry.npmjs.org/@democratize-technology/vikunja-mcp/-/vikunja-mcp-0.1.0.tgz","fileCount":104,"integrity":"sha512-J3tWGhFB8a+/SI8b5w180Ge2N83reNMhEvbfIiWvKrab91Hyq//oafFKLLGHDpoZNb4BlHQbz8qdVd/6Gb/tdQ==","signatures":[{"sig":"MEQCIB+STG3gF0KHoyJxblrenErHyL7tXSMaDfTqiCVvFeR2AiAHUKVhqYEQxKyLSLRNY1HT3T3V9FpGVYEgNGNDCP359A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":625400},"jest":{"roots":["<rootDir>/src","<rootDir>/tests"],"preset":"ts-jest","testMatch":["**/__tests__/**/*.ts","**/?(*.)+(spec|test).ts"],"testEnvironment":"node","coverageThreshold":{"global":{"lines":95,"branches":90,"functions":98,"statements":95}},"collectCoverageFrom":["src/**/*.ts","!src/**/*.d.ts","!src/**/__tests__/**","!src/client.ts","!src/index.ts"]},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"641ea262d41ab5860cc74c2e5ceba57c3e04eca1","scripts":{"dev":"tsx watch src/index.ts","lint":"eslint src --ext .ts","test":"jest --silent","build":"tsc","format":"npm run format:src && npm run format:tests","prepare":"npm run build","typecheck":"tsc --noEmit","format:src":"prettier --write 'src/**/*.ts'","test:watch":"jest --watch --silent","format:tests":"prettier --write 'tests/**/*.ts'","test:coverage":"jest --coverage --silent","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run lint && npm run test && npm run build"},"_npmUser":{"name":"jeremy-green","email":"hello@jeremy.green"},"repository":{"url":"git+https://github.com/democratize-technology/vikunja-mcp.git","type":"git"},"_npmVersion":"10.8.2","description":"Model Context Protocol server for Vikunja task management","directories":{},"_nodeVersion":"20.19.1","dependencies":{"uuid":"^11.1.0","dotenv":"^16.0.0","node-fetch":"^2.7.0","node-vikunja":"^0.4.0","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","prettier":"^3.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@types/uuid":"^10.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/vikunja-mcp_0.1.0_1748528342479_0.2919290011244433","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@democratize-technology/vikunja-mcp","version":"0.1.1","keywords":["mcp","vikunja","task-management","model-context-protocol","ai-assistant","todo","productivity","automation"],"author":{"name":"Jeremy Green"},"license":"MIT","_id":"@democratize-technology/vikunja-mcp@0.1.1","maintainers":[{"name":"jeremy-green","email":"hello@jeremy.green"}],"homepage":"https://github.com/democratize-technology/vikunja-mcp#readme","bugs":{"url":"https://github.com/democratize-technology/vikunja-mcp/issues"},"bin":{"vikunja-mcp":"dist/index.js"},"dist":{"shasum":"9ba9208cff03894ad35c3e7ccd71d574a719625f","tarball":"https://registry.npmjs.org/@democratize-technology/vikunja-mcp/-/vikunja-mcp-0.1.1.tgz","fileCount":104,"integrity":"sha512-w7ZPgrOpHPi8PxK3RfuZaLCKIuKCgB7e9+VCLrcjdkvi5V6+oeMJUKIKb6H/TvoHxD9HT51l5HuAM/QBp+EVnQ==","signatures":[{"sig":"MEYCIQDHF3pgaxK4CtMJoewclvHeIWx4FiLqd+lrS5PsFVkzpQIhAMV441LjwQXTToNJ5FUCoYhkdx9PUYxWhgVKSeWC31ip","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":625400},"jest":{"roots":["<rootDir>/src","<rootDir>/tests"],"preset":"ts-jest","testMatch":["**/__tests__/**/*.ts","**/?(*.)+(spec|test).ts"],"testEnvironment":"node","coverageThreshold":{"global":{"lines":95,"branches":90,"functions":98,"statements":95}},"collectCoverageFrom":["src/**/*.ts","!src/**/*.d.ts","!src/**/__tests__/**","!src/client.ts","!src/index.ts"]},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"736eac1c713ce98a4c1f2218fe1c02f7e0b70569","scripts":{"dev":"tsx watch src/index.ts","lint":"eslint src --ext .ts","test":"jest --silent","build":"tsc","format":"npm run format:src && npm run format:tests","prepare":"npm run build","typecheck":"tsc --noEmit","format:src":"prettier --write 'src/**/*.ts'","test:watch":"jest --watch --silent","format:tests":"prettier --write 'tests/**/*.ts'","test:coverage":"jest --coverage --silent","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run lint && npm run test && npm run build"},"_npmUser":{"name":"jeremy-green","email":"hello@jeremy.green"},"repository":{"url":"git+https://github.com/democratize-technology/vikunja-mcp.git","type":"git"},"_npmVersion":"10.8.2","description":"Model Context Protocol server for Vikunja task management","directories":{},"_nodeVersion":"20.19.1","dependencies":{"uuid":"^11.1.0","dotenv":"^16.0.0","node-fetch":"^2.7.0","node-vikunja":"^0.4.0","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","prettier":"^3.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@types/uuid":"^10.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/vikunja-mcp_0.1.1_1748553503216_0.7585617534866043","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@democratize-technology/vikunja-mcp","version":"0.2.0","description":"Model Context Protocol server for Vikunja task management","main":"dist/index.js","types":"dist/index.d.ts","bin":{"vikunja-mcp":"dist/index.js"},"scripts":{"dev":"tsx watch src/index.ts","build":"tsc","test":"jest --silent","test:watch":"jest --watch --silent","test:coverage":"jest --coverage --silent","typecheck":"tsc --noEmit","lint":"eslint src --ext .ts","format:src":"prettier --write 'src/**/*.ts'","format:tests":"prettier --write 'tests/**/*.ts'","format":"npm run format:src && npm run format:tests","prepublishOnly":"npm run lint && npm run test && npm run build","prepare":"npm run build","version:patch":"npm version patch","version:minor":"npm version minor","version:major":"npm version major"},"keywords":["mcp","vikunja","task-management","model-context-protocol","ai-assistant","todo","productivity","automation"],"author":{"name":"Jeremy Green"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/democratize-technology/vikunja-mcp.git"},"bugs":{"url":"https://github.com/democratize-technology/vikunja-mcp/issues"},"homepage":"https://github.com/democratize-technology/vikunja-mcp#readme","publishConfig":{"access":"public"},"dependencies":{"@modelcontextprotocol/sdk":"^1.0.0","dotenv":"^16.0.0","node-fetch":"^2.7.0","node-vikunja":"^0.4.0","uuid":"^11.1.0"},"devDependencies":{"@types/jest":"^29.0.0","@types/node":"^20.0.0","@types/uuid":"^10.0.0","@typescript-eslint/eslint-plugin":"^6.0.0","@typescript-eslint/parser":"^6.0.0","eslint":"^8.0.0","jest":"^29.0.0","prettier":"^3.0.0","ts-jest":"^29.0.0","tsx":"^4.0.0","typescript":"^5.0.0"},"jest":{"preset":"ts-jest","testEnvironment":"node","roots":["<rootDir>/src","<rootDir>/tests"],"testMatch":["**/__tests__/**/*.ts","**/?(*.)+(spec|test).ts"],"collectCoverageFrom":["src/**/*.ts","!src/**/*.d.ts","!src/**/__tests__/**","!src/client.ts","!src/index.ts"],"coverageThreshold":{"global":{"branches":90,"functions":98,"lines":95,"statements":95}}},"engines":{"node":">=20.0.0"},"_id":"@democratize-technology/vikunja-mcp@0.2.0","gitHead":"3a997d4aceb2fa2e5e213df1240edc8c37e9b8e5","_nodeVersion":"20.19.4","_npmVersion":"10.8.2","dist":{"integrity":"sha512-atcE/3azM2TPgG9n1lzqg2x2SBmhnA7hErG2C2+KDJe20DArOXUsdiSikBLNKY96zkJ+4byZ153NK8P35jEeOw==","shasum":"bfba4a01207667aea55d2e267ac185ee16f54992","tarball":"https://registry.npmjs.org/@democratize-technology/vikunja-mcp/-/vikunja-mcp-0.2.0.tgz","fileCount":152,"unpackedSize":660343,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCTPHfszpY72V2A7Mqp/tZ1Ax4o2eibEIiKbsg3XY+/UgIgYSay3/hPFEvGp+FgYZGW8Pvl9Zn4KhaUgvnuqxuQEh0="}]},"_npmUser":{"name":"jeremy-green","email":"hello@jeremy.green"},"directories":{},"maintainers":[{"name":"jeremy-green","email":"hello@jeremy.green"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/vikunja-mcp_0.2.0_1755364642959_0.023253768012885034"},"_hasShrinkwrap":false}},"time":{"created":"2025-05-29T14:19:02.397Z","modified":"2025-08-16T17:17:23.351Z","0.1.0":"2025-05-29T14:19:02.677Z","0.1.1":"2025-05-29T21:18:23.447Z","0.2.0":"2025-08-16T17:17:23.154Z"},"bugs":{"url":"https://github.com/democratize-technology/vikunja-mcp/issues"},"author":{"name":"Jeremy Green"},"license":"MIT","homepage":"https://github.com/democratize-technology/vikunja-mcp#readme","keywords":["mcp","vikunja","task-management","model-context-protocol","ai-assistant","todo","productivity","automation"],"repository":{"type":"git","url":"git+https://github.com/democratize-technology/vikunja-mcp.git"},"description":"Model Context Protocol server for Vikunja task management","maintainers":[{"name":"jeremy-green","email":"hello@jeremy.green"}],"readme":"# Vikunja MCP Server\n\nA Model Context Protocol (MCP) server that enables AI assistants to interact with Vikunja task management instances.\n\n## Features\n\n- **Subcommand-based tools** for intuitive AI interactions\n- **Session-based authentication** with automatic token management\n- **Full task management** operations implemented\n- **Complete project management** with CRUD operations\n- **Label management** for organizing tasks\n- **Team operations** for collaboration (get/update/members limited by API)\n- **User management** with settings and search\n- **Webhook management** for project automation\n- **Batch import** tasks from CSV or JSON files\n- **Input validation** for dates, IDs, and hex colors\n- **Efficient diff-based updates** for assignees\n- **TypeScript with strict mode** for type safety\n- **Comprehensive error handling** with typed errors\n- **Automatic retry logic** with exponential backoff for transient failures\n\n## Requirements\n\n- Node.js 20+ (LTS versions only)\n- Vikunja instance with API access\n- API token (starting with `tk_`) or JWT token for authentication\n\n## Installation\n\n### Option 1: Install from NPM (Recommended)\n\nThe easiest way to use vikunja-mcp is through npx in your Claude Desktop or other MCP-compatible client configuration:\n\n```json\n{\n  \"vikunja\": {\n    \"command\": \"npx\",\n    \"args\": [\"-y\", \"@democratize-technology/vikunja-mcp\"],\n    \"env\": {\n      \"VIKUNJA_URL\": \"https://your-vikunja-instance.com/api/v1\",\n      \"VIKUNJA_API_TOKEN\": \"your-api-token\"\n    }\n  }\n}\n```\n\n### Option 2: Local Development\n\nFor development or customization:\n\n```bash\ngit clone https://github.com/democratize-technology/vikunja-mcp.git\ncd vikunja-mcp\nnpm install\nnpm run build\n```\n\nThen configure your MCP client:\n\n```json\n{\n  \"vikunja\": {\n    \"command\": \"node\",\n    \"args\": [\"/path/to/vikunja-mcp/dist/index.js\"],\n    \"env\": {\n      \"VIKUNJA_URL\": \"https://your-vikunja-instance.com/api/v1\",\n      \"VIKUNJA_API_TOKEN\": \"your-api-token\"\n    }\n  }\n}\n```\n\n## Configuration\n\n### Logging Configuration\n\nThe server includes a structured logging system. Configure it via environment variables:\n\n```bash\n# Enable debug logging (default: false)\nDEBUG=true\n\n# Set specific log level (error, warn, info, debug)\n# If not set, defaults to 'info' (or 'debug' if DEBUG=true)\nLOG_LEVEL=debug\n```\n\nLog output includes timestamps and log levels:\n```\n[2025-05-25T17:00:00.000Z] [INFO] Vikunja MCP server started\n[2025-05-25T17:00:00.100Z] [DEBUG] Executing tasks tool { subcommand: 'list', args: {...} }\n```\n\nAll logs are written to stderr to keep stdout reserved for MCP protocol communication.\n\n## Authentication Methods\n\nThe Vikunja MCP server supports two authentication methods, each with different capabilities:\n\n### API Token Authentication (Default)\n\nAPI tokens are the standard authentication method for Vikunja:\n\n- **How to obtain:** Go to Vikunja Settings → API Tokens → Create new token\n- **Token format:** Starts with `tk_` (e.g., `tk_abc123def456`)\n- **Capabilities:** Full access to tasks, projects, labels, teams, and webhooks\n- **Limitations:** Cannot access user-specific endpoints (user profile, settings, export)\n- **Best for:** Automation, CI/CD, and general task management\n\n### JWT Authentication (Advanced)\n\nJWT (JSON Web Token) authentication provides full access to all Vikunja endpoints:\n\n- **How to obtain:** Extract from your browser session (see instructions below)\n- **Token format:** Long string starting with `eyJ` (standard JWT format)\n- **Capabilities:** Full access to all endpoints including user management and export\n- **Limitations:** Tokens expire (typically after 24 hours)\n- **Best for:** User management, data export, and operations requiring user context\n\n#### How to Extract Your JWT Token\n\n1. **Log into Vikunja** in your web browser\n2. **Open Developer Tools** (F12 or right-click → Inspect)\n3. **Go to the Application/Storage tab**\n4. **Find the JWT token:**\n   - Look in Local Storage → your Vikunja domain\n   - Find the key named `token` or similar\n   - The value is your JWT token\n5. **Copy the entire token value** (it's quite long)\n\n#### Using JWT Authentication\n\n```typescript\n// Connect with JWT token - automatically detected!\nvikunja_auth.connect({\n  apiUrl: \"https://your-vikunja-instance.com/api/v1\",\n  apiToken: \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"\n})\n```\n\n**Important Notes:**\n- JWT tokens expire; you'll need to extract a new one when it expires\n- Token type is automatically detected based on format (no flag needed)\n- Some tools (users, export) are only available with JWT authentication\n\n## Quick Start\n\n1. **Set up authentication (if not using environment variables):**\n   ```typescript\n   vikunja_auth.connect({\n     apiUrl: \"https://your-vikunja-instance.com/api/v1\",\n     apiToken: \"your-api-token\"\n   })\n   ```\n\n2. **Create your first task:**\n   ```typescript\n   vikunja_tasks.create({\n     projectId: 1,\n     title: \"My first task via MCP!\"\n   })\n   ```\n\n3. **List all your tasks:**\n   ```typescript\n   vikunja_tasks.list({ allProjects: true })\n   ```\n\n## Usage\n\nThe MCP server exposes tools with subcommands. All operations require authentication first (either via environment variables or manual connection).\n\n### Authentication\n\n```typescript\n// Connect with API token (automatically detected)\nvikunja_auth.connect({\n  apiUrl: \"https://your-vikunja-instance.com/api/v1\",\n  apiToken: \"tk_your-api-token\"\n})\n\n// Connect with JWT token (automatically detected, enables additional tools: users, export)\nvikunja_auth.connect({\n  apiUrl: \"https://your-vikunja-instance.com/api/v1\",\n  apiToken: \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"\n})\n\n// Check authentication status\nvikunja_auth.status()\n\n// Disconnect and clean up resources\nvikunja_auth.disconnect()\n```\n\n### Task Management Examples\n\n```typescript\n// List all tasks across all projects\nvikunja_tasks.list({ allProjects: true })\n\n// List tasks for a specific project with pagination\nvikunja_tasks.list({\n  projectId: 1,\n  page: 1,\n  perPage: 20,\n  sort: \"due_date\"\n})\n\n// List tasks with filters (high priority, not done)\nvikunja_tasks.list({\n  filter: \"(priority >= 4 && done = false)\"\n})\n\n// List tasks with simple filter\nvikunja_tasks.list({\n  filter: \"priority >= 3\"\n})\n\n// List tasks with complex filter conditions\nvikunja_tasks.list({\n  filter: \"(priority >= 3 && priority <= 5) || (done = true && updated > '2024-01-01')\"\n})\n\n// Combine filter with search\nvikunja_tasks.list({\n  filter: \"priority >= 4\",\n  search: \"urgent\"\n})\n\n// Create a new task with labels and assignees\nvikunja_tasks.create({\n  projectId: 1,\n  title: \"Complete documentation\",\n  description: \"Update README with examples\",\n  dueDate: \"2024-12-31T23:59:59Z\",\n  priority: 3,\n  labels: [1, 2],      // Label IDs\n  assignees: [1, 3]    // User IDs\n})\n\n// Create a recurring task (repeats every week)\nvikunja_tasks.create({\n  projectId: 1,\n  title: \"Weekly team meeting\",\n  description: \"Sync up with the team\",\n  dueDate: \"2024-12-01T10:00:00Z\",\n  repeatAfter: 7,      // Number of units\n  repeatMode: \"day\"    // Unit: \"day\", \"week\", \"month\", or \"year\"\n})\n\n// Create a monthly recurring task\nvikunja_tasks.create({\n  projectId: 1,\n  title: \"Monthly report\",\n  repeatAfter: 1,\n  repeatMode: \"month\"\n})\n\n// Get detailed information about a task\nvikunja_tasks.get({ id: 123 })\n\n// Update a task (partial updates supported)\nvikunja_tasks.update({\n  id: 123,\n  done: true,\n  priority: 5\n})\n\n// Update recurring settings on an existing task\nvikunja_tasks.update({\n  id: 123,\n  repeatAfter: 14,     // Change to bi-weekly\n  repeatMode: \"day\"\n})\n\n// Update task assignees (uses efficient diff-based approach)\nvikunja_tasks.update({\n  id: 123,\n  assignees: [1, 2, 4]  // Only adds/removes differences\n})\n\n// Delete a task\nvikunja_tasks.delete({ id: 123 })\n\n// Bulk assign users to a task\nvikunja_tasks.assign({\n  id: 123,\n  assignees: [2, 3, 4]\n})\n\n// Remove users from a task\nvikunja_tasks.unassign({\n  id: 123,\n  assignees: [2, 4]  // Removes only these users\n})\n\n// List all assignees for a task\nvikunja_tasks.list-assignees({ id: 123 })\n\n// Add a comment to a task\nvikunja_tasks.comment({\n  id: 123,\n  comment: \"This task is now complete!\"\n})\n\n// List all comments on a task\nvikunja_tasks.comment({ id: 123 })\n\n// Create a task relation (e.g., subtask, blocking, related)\nvikunja_tasks.relate({\n  id: 123,\n  otherTaskId: 124,\n  relationKind: \"subtask\"  // 124 is a subtask of 123\n})\n\n// Available relation kinds:\n// - subtask: Other task is a subtask of this task\n// - parenttask: Other task is the parent of this task\n// - related: Tasks are related\n// - duplicateof: This task is a duplicate of the other\n// - duplicates: Other task is a duplicate of this one\n// - blocking: This task blocks the other\n// - blocked: This task is blocked by the other\n// - precedes: This task precedes the other\n// - follows: This task follows the other\n// - copiedfrom: This task was copied from the other\n// - copiedto: Other task was copied from this one\n\n// Remove a task relation\nvikunja_tasks.unrelate({\n  id: 123,\n  otherTaskId: 124,\n  relationKind: \"subtask\"\n})\n\n// Get all relations for a task\nvikunja_tasks.relations({ id: 123 })\n\n// Add a reminder to a task\nvikunja_tasks.add-reminder({\n  id: 123,\n  reminderDate: \"2024-12-25T10:00:00Z\"\n})\n\n// List all reminders for a task\nvikunja_tasks.list-reminders({ id: 123 })\n\n// Remove a specific reminder from a task\nvikunja_tasks.remove-reminder({\n  id: 123,\n  reminderId: 1\n})\n\n// Bulk create multiple tasks at once (max 100)\nvikunja_tasks.bulk-create({\n  projectId: 1,\n  tasks: [\n    {\n      title: \"Task 1\",\n      description: \"First task\",\n      priority: 3,\n      labels: [1, 2]\n    },\n    {\n      title: \"Task 2\", \n      dueDate: \"2024-12-31T23:59:59Z\",\n      assignees: [1]\n    },\n    {\n      title: \"Weekly standup\",\n      repeatAfter: 7,\n      repeatMode: \"day\"\n    }\n  ]\n})\n\n// Bulk update multiple tasks with the same field value\nvikunja_tasks.bulk-update({\n  taskIds: [123, 124, 125],\n  field: \"done\",          // Field to update\n  value: true             // New value for all tasks\n})\n\n// Other bulk update examples\nvikunja_tasks.bulk-update({\n  taskIds: [123, 124, 125],\n  field: \"priority\",\n  value: 5\n})\n\nvikunja_tasks.bulk-update({\n  taskIds: [123, 124],\n  field: \"project_id\",\n  value: 2               // Move tasks to different project\n})\n\nvikunja_tasks.bulk-update({\n  taskIds: [123, 124, 125],\n  field: \"labels\",\n  value: [1, 3, 5]       // Set same labels on all tasks\n})\n\n// Bulk delete multiple tasks (max 100)\nvikunja_tasks.bulk-delete({\n  taskIds: [123, 124, 125]\n})\n\n// Batch import tasks from CSV or JSON\nvikunja_batch_import({\n  projectId: 1,\n  format: \"json\",\n  data: JSON.stringify([\n    {\n      title: \"Task 1\",\n      description: \"First imported task\",\n      priority: 3,\n      dueDate: \"2024-12-31T23:59:59Z\"\n    },\n    {\n      title: \"Task 2\",\n      labels: [\"bug\", \"urgent\"],  // Will look up label IDs by name\n      assignees: [\"john.doe\"]      // Will look up user IDs by username\n    }\n  ])\n})\n\n// Import from CSV with headers\nvikunja_batch_import({\n  projectId: 1,\n  format: \"csv\",\n  data: `title,description,priority,dueDate,labels,assignees\n\"Task 1\",\"Description with, comma\",3,2024-12-31T23:59:59Z,\"bug;feature\",\"john.doe\"\n\"Task 2\",\"Another task\",5,,\"urgent\",\"john.doe;jane.smith\"`\n})\n\n// Dry run to validate without creating tasks\nvikunja_batch_import({\n  projectId: 1,\n  format: \"json\",\n  data: JSON.stringify([...]),\n  dryRun: true  // Only validates, doesn't create tasks\n})\n\n// Continue on errors instead of stopping\nvikunja_batch_import({\n  projectId: 1,\n  format: \"csv\",\n  data: csvData,\n  skipErrors: true  // Skip invalid tasks and continue with valid ones\n})\n```\n\n### Data Export Examples\n\n```typescript\n// Export a project with all its data\nvikunja_export_project({\n  projectId: 1,\n  includeChildren: false  // Only export the specified project\n})\n\n// Export a project including all child projects\nvikunja_export_project({\n  projectId: 1,\n  includeChildren: true  // Recursively export child projects\n})\n\n// The export returns JSON data with the following structure:\n// {\n//   project: { ... },        // Project details\n//   tasks: [ ... ],          // All tasks in the project\n//   labels: [ ... ],         // All labels used in tasks\n//   child_projects: [ ... ], // Nested child project exports (if includeChildren: true)\n//   exported_at: \"...\",      // ISO timestamp of export\n//   version: \"1.0.0\"         // Export format version\n// }\n\n// Request a full user data export (sent via email)\nvikunja_request_user_export({\n  password: \"your-password\"  // Required for security\n})\n\n// Download a previously requested user data export\nvikunja_download_user_export({\n  password: \"your-password\"  // Required for security\n})\n```\n\n### Project Management Examples\n\n```typescript\n// List all projects\nvikunja_projects.list()\n\n// List projects with search and pagination\nvikunja_projects.list({\n  search: \"frontend\",\n  page: 1,\n  perPage: 10,\n  isArchived: false\n})\n\n// Get a specific project\nvikunja_projects.get({ id: 1 })\n\n// Create a new project\nvikunja_projects.create({\n  title: \"New Frontend Project\",\n  description: \"React-based web application\",\n  hexColor: \"#4287f5\"\n})\n\n// Update a project\nvikunja_projects.update({\n  id: 1,\n  title: \"Updated Project Name\",\n  isArchived: true\n})\n\n// Archive a project\nvikunja_projects.archive({ id: 1 })\n\n// Unarchive a project\nvikunja_projects.unarchive({ id: 1 })\n\n// Delete a project\nvikunja_projects.delete({ id: 1 })\n\n// --- Project Hierarchy Management ---\n\n// Create a child project\nvikunja_projects.create({\n  title: \"Frontend Module\",\n  description: \"React components\",\n  parentProjectId: 1,  // Will be a child of project 1\n  hexColor: \"#3498db\"\n})\n\n// Get all direct children of a project\nvikunja_projects.get-children({ id: 1 })\n// Returns: Array of projects that have parentProjectId = 1\n\n// Get complete project hierarchy as a tree\nvikunja_projects.get-tree({ id: 1 })\n// Returns: Project with nested children structure\n// {\n//   id: 1,\n//   title: \"Main Project\",\n//   children: [\n//     {\n//       id: 2,\n//       title: \"Frontend Module\",\n//       children: [\n//         { id: 4, title: \"Components\", children: [] },\n//         { id: 5, title: \"Styles\", children: [] }\n//       ]\n//     },\n//     {\n//       id: 3,\n//       title: \"Backend Module\",\n//       children: []\n//     }\n//   ]\n// }\n\n// Get breadcrumb path from root to a project\nvikunja_projects.get-breadcrumb({ id: 5 })\n// Returns: Array of projects from root to target\n// [\n//   { id: 1, title: \"Main Project\" },\n//   { id: 2, title: \"Frontend Module\" },\n//   { id: 5, title: \"Styles\" }\n// ]\n// Also includes a formatted path: \"Main Project > Frontend Module > Styles\"\n\n// Move a project to a new parent\nvikunja_projects.move({ \n  id: 5,              // Project to move\n  parentProjectId: 3  // New parent\n})\n// Validates against circular references and depth limits\n\n// Move a project to root level (no parent)\nvikunja_projects.move({ \n  id: 5,\n  parentProjectId: undefined\n})\n\n// --- Project Sharing ---\n\n// Create a read-only share link\nvikunja_projects.create-share({ \n  id: 1,\n  right: 0,  // 0=Read, 1=Write, 2=Admin\n  label: \"Public read-only access\"\n})\n\n// Create a password-protected share with write access\nvikunja_projects.create-share({ \n  id: 1,\n  right: 1,\n  password: \"securepassword123\",\n  label: \"Team collaboration link\"\n})\n\n// Create an expiring share link\nvikunja_projects.create-share({ \n  id: 1,\n  right: 0,\n  expires: \"2025-12-31T23:59:59Z\",\n  label: \"Temporary access until year end\"\n})\n\n// List all shares for a project\nvikunja_projects.list-shares({ id: 1 })\n\n// Get details of a specific share\nvikunja_projects.get-share({ \n  id: 1, \n  shareId: 123 \n})\n\n// Delete a share link\nvikunja_projects.delete-share({ \n  id: 1, \n  shareId: 123 \n})\n\n// Authenticate to access a shared project\nvikunja_projects.auth-share({ \n  shareHash: \"abc123def456\" \n})\n\n// Authenticate to a password-protected share\nvikunja_projects.auth-share({ \n  shareHash: \"abc123def456\",\n  password: \"securepassword123\"\n})\n```\n\n### Label Management Examples\n\n```typescript\n// List all labels\nvikunja_labels.list()\n\n// Search for labels\nvikunja_labels.list({\n  search: \"bug\",\n  page: 1,\n  perPage: 20\n})\n\n// Get a specific label\nvikunja_labels.get({ id: 1 })\n\n// Create a new label\nvikunja_labels.create({\n  title: \"Critical\",\n  description: \"Critical priority issues\",\n  hexColor: \"#ff0000\"\n})\n\n// Update a label\nvikunja_labels.update({\n  id: 1,\n  title: \"High Priority\",\n  hexColor: \"#ff6600\"\n})\n\n// Delete a label\nvikunja_labels.delete({ id: 1 })\n\n// --- Label Assignment to Tasks ---\n\n// Apply multiple labels to a task\nvikunja_tasks.apply-label({\n  id: 123,\n  labels: [1, 2, 3]  // Apply labels with IDs 1, 2, and 3\n})\n\n// Apply a single label\nvikunja_tasks.apply-label({\n  id: 123,\n  labels: [1]  // Apply just the \"research\" label\n})\n\n// Remove specific labels from a task\nvikunja_tasks.remove-label({\n  id: 123,\n  labels: [2, 3]  // Remove labels 2 and 3, keep others\n})\n\n// List all labels on a task\nvikunja_tasks.list-labels({ id: 123 })\n// Returns: Task info with detailed label data including colors and descriptions\n```\n\n### Team Management Examples\n\n```typescript\n// List all teams\nvikunja_teams.list()\n\n// Search for teams\nvikunja_teams.list({\n  search: \"frontend\",\n  page: 1,\n  perPage: 10\n})\n\n// Create a new team\nvikunja_teams.create({\n  name: \"Frontend Team\",\n  description: \"Responsible for UI/UX development\"\n})\n\n// Delete a team\nvikunja_teams.delete({ id: 1 })\n\n// Note: get, update, and members operations are not yet\n// implemented in the node-vikunja library\n```\n\n### User Management Examples\n\n> ⚠️ **Known Issue**: User endpoints may fail with authentication errors even when using valid tokens. This is a known Vikunja API issue. The MCP server will provide helpful error messages when this occurs. If you encounter this issue, please contact your Vikunja server administrator.\n\n```typescript\n// Get current user information\nvikunja_users.current()\n\n// Search for users\nvikunja_users.search({\n  search: \"john\"\n})\n\n// Get current user settings\nvikunja_users.settings()\n\n// Update user settings\nvikunja_users.update-settings({\n  name: \"John Doe\",\n  language: \"en\",\n  timezone: \"America/New_York\",\n  weekStart: 1  // Monday\n})\n\n// Update notification preferences\nvikunja_users.update-settings({\n  emailRemindersEnabled: true,  // Enable email reminders for tasks\n  overdueTasksRemindersEnabled: true,  // Enable daily overdue task emails\n  overdueTasksRemindersTime: \"09:00\"  // Time to send overdue task summary\n})\n```\n\n### Webhook Management Examples\n\n```typescript\n// List all available webhook events\nvikunja_webhooks.list-events()\n// Returns: [\"task.created\", \"task.updated\", \"task.deleted\", \"task.assigned\", ...]\n\n// List webhooks for a project\nvikunja_webhooks.list({ projectId: 1 })\n\n// Create a webhook for task events\nvikunja_webhooks.create({\n  projectId: 1,\n  targetUrl: \"https://example.com/webhook\",\n  events: [\"task.created\", \"task.updated\"],\n  secret: \"my-secret-key\"  // Optional, for HMAC signing\n})\n\n// Create a webhook without secret\nvikunja_webhooks.create({\n  projectId: 1,\n  targetUrl: \"https://example.com/notifications\",\n  events: [\"task.assigned\", \"task.comment.created\"]\n})\n\n// Get a specific webhook\nvikunja_webhooks.get({\n  projectId: 1,\n  webhookId: 123\n})\n\n// Update webhook events\nvikunja_webhooks.update({\n  projectId: 1,\n  webhookId: 123,\n  events: [\"task.created\", \"task.updated\", \"task.deleted\"]\n})\n\n// Delete a webhook\nvikunja_webhooks.delete({\n  projectId: 1,\n  webhookId: 123\n})\n```\n\n### Advanced Filtering Examples\n\n```typescript\n// Create a saved filter for high priority tasks\nvikunja_filters.create({\n  name: \"High Priority Tasks\",\n  description: \"All undone tasks with priority 4 or 5\",\n  filter: \"done = false && priority >= 4\",\n  isGlobal: true\n})\n\n// Alternative format using title and filters object\nvikunja_filters.create({\n  title: \"🔥 High Priority Tasks\",\n  description: \"All tasks with priority 4 or 5 that are not completed\",\n  filters: {\n    filter_by: [\"priority\"],\n    filter_value: [\"5\"],\n    filter_comparator: [\">=\"],\n    filter_concat: \"\"\n  },\n  is_favorite: true\n})\n\n// Create a filter with multiple conditions\nvikunja_filters.create({\n  title: \"Urgent & Incomplete\",\n  filters: {\n    filter_by: [\"priority\", \"done\"],\n    filter_value: [\"3\", \"false\"],\n    filter_comparator: [\">=\", \"=\"],\n    filter_concat: \"&&\"\n  }\n})\n\n// Create a project-specific filter\nvikunja_filters.create({\n  name: \"This Week's Tasks\",\n  filter: \"dueDate >= now && dueDate < now+7d\",\n  projectId: 1,\n  isGlobal: false\n})\n\n// List all saved filters\nvikunja_filters.list()\n\n// List filters for a specific project\nvikunja_filters.list({ projectId: 1 })\n\n// Apply a saved filter to task listing\nvikunja_tasks.list({\n  filterId: \"550e8400-e29b-41d4-a716-446655440000\"\n})\n\n// Build a filter programmatically\nvikunja_filters.build({\n  conditions: [\n    { field: \"done\", operator: \"=\", value: false },\n    { field: \"priority\", operator: \">=\", value: 3 },\n    { field: \"assignees\", operator: \"in\", value: [\"user1\", \"user2\"] }\n  ],\n  groupOperator: \"&&\"\n})\n// Returns: { filter: \"(done = false && priority >= 3 && assignees in user1, user2)\", valid: true }\n\n// Update an existing filter\nvikunja_filters.update({\n  id: \"550e8400-e29b-41d4-a716-446655440000\",\n  name: \"Critical Tasks\",\n  filter: \"done = false && priority = 5\"\n})\n\n// Validate a filter string\nvikunja_filters.validate({\n  filter: \"done = false && priority >= 3\"\n})\n// Returns: { valid: true, errors: [] }\n```\n\n#### Filter Syntax Reference\n\nThe Vikunja filter syntax supports SQL-like queries with the following:\n\n**Fields:**\n- `done` - Task completion status (boolean)\n- `priority` - Task priority (1-5)\n- `percentDone` - Completion percentage (0-100)\n- `dueDate` - Task due date\n- `assignees` - Task assignees\n- `labels` - Associated labels\n- `created` - Task creation time\n- `updated` - Task update time\n\n**Operators:**\n- Comparison: `=`, `!=`, `>`, `>=`, `<`, `<=`\n- Pattern matching: `like` (uses `%` wildcard)\n- List matching: `in`, `not in`\n\n**Date Math:**\n- `now` - Current time\n- `now+24h` - 24 hours from now\n- `now-7d` - 7 days ago\n- `now/d` - Start of current day\n- Supports: s (seconds), m (minutes), h (hours), d (days), w (weeks), M (months), y (years)\n\n**Examples:**\n- `priority = 4`\n- `dueDate < now`\n- `done = false && priority >= 3`\n- `assignees in user1, user2`\n- `dueDate >= now && dueDate < now+7d`\n- `title like \"%urgent%\"`\n\n**Important Note on Filtering:** Due to a known limitation in Vikunja v0.22.1 where the server ignores filter parameters, this MCP server implements client-side filtering as a workaround. When you use filters:\n- All tasks are fetched from the server first\n- Filters are then applied locally using the same syntax\n- The response will include `clientSideFiltering: true` in metadata\n- This may impact performance for projects with many tasks\n- All filter features work correctly, just processed client-side\n\n## Response Format\n\nAll operations in the Vikunja MCP server follow a standardized response format for consistency and predictability:\n\n```typescript\ninterface StandardResponse {\n  success: boolean;\n  operation: string;      // The operation performed (e.g., 'create', 'update', 'list')\n  message?: string;       // Human-readable description of the result\n  data?: any;            // The primary data returned (task, project, label, etc.)\n  metadata?: {\n    timestamp: string;    // ISO 8601 timestamp of the operation\n    [key: string]: any;  // Additional operation-specific metadata\n  };\n}\n```\n\n### Response Examples\n\n**Success:**\n```json\n{\n  \"success\": true,\n  \"operation\": \"create\",\n  \"message\": \"Task created successfully\",\n  \"data\": { \"id\": 123, \"title\": \"Complete documentation\" },\n  \"metadata\": { \"timestamp\": \"2025-05-25T12:00:00Z\" }\n}\n```\n\n**Error:**\n```json\n{\n  \"success\": false,\n  \"operation\": \"update\",\n  \"message\": \"Task not found\",\n  \"error\": { \"code\": \"TASK_NOT_FOUND\", \"details\": \"No task exists with ID 999\" }\n}\n```\n\nThis standardized format ensures:\n- **Consistency**: All tools return responses in the same structure\n- **Predictability**: Clients always know what fields to expect\n- **Debugging**: Metadata provides context for troubleshooting\n- **Error Handling**: Clear error information with codes and messages\n\n## Available Tools\n\n### Authentication\n- `vikunja_auth` - Authentication management\n  - `connect` - Initialize connection with API token\n  - `status` - Check authentication status\n  - `refresh` - Refresh authentication token\n\n### Task Management ✅\n- `vikunja_tasks` - Task operations (fully implemented)\n  - `list` - List tasks with filters\n    - Filter by project or get all tasks\n    - Support for pagination, search, sorting\n    - Filter by completion status\n    - Apply saved filters with `filterId` parameter\n  - `create` - Create a new task\n    - Required: title, projectId\n    - Optional: description, dueDate, priority, labels, assignees\n    - Validates date format (ISO 8601) and IDs\n  - `get` - Get task details by ID\n  - `update` - Update existing task\n    - Supports partial updates\n    - Can update title, description, dueDate, priority, done status\n    - Can update labels and assignees (uses efficient diff-based approach)\n  - `delete` - Delete a task by ID\n  - `assign` - Bulk assign users to tasks\n  - `unassign` - Remove users from tasks\n  - `comment` - List or add comments to tasks\n  - `bulk-update` - Update multiple tasks at once\n    - Required: taskIds array, field name, value\n    - Supported fields: done, priority, due_date, project_id, assignees, labels\n    - Validates field types and values\n    - ⚠️ Performance: Makes API calls to fetch each updated task\n  - `bulk-delete` - Delete multiple tasks at once\n    - Required: taskIds array\n    - Returns deleted task details for confirmation\n    - Handles partial failures gracefully\n    - ⚠️ Performance: Makes individual delete calls for each task\n    - Recommended: Process in batches of 20 or fewer tasks\n  - `attach` - Not implemented (file handling not available in MCP)\n\n### Batch Import ✅\n- `vikunja_batch_import` - Import multiple tasks from CSV or JSON (fully implemented)\n  - Required: projectId, format ('csv' or 'json'), data\n  - Optional: skipErrors (continue on errors), dryRun (validate only)\n  - **Batch Size Limit**: Maximum 100 tasks per import\n  - **CSV Format**:\n    - Requires header row with field names\n    - Supports quoted values and escaped quotes\n    - Fields: title, description, priority, dueDate, labels, assignees\n    - Labels and assignees as semicolon-separated values (semicolons used to avoid conflicts with CSV commas)\n  - **JSON Format**:\n    - Array of task objects\n    - Same fields as CSV, plus direct support for arrays\n  - **Features**:\n    - Automatic label lookup by name\n    - Automatic user lookup by username\n    - Validation before creation\n    - Detailed error reporting\n    - Dry run mode for testing\n    - Skip errors option for partial imports\n\n### Project Management ✅\n- `vikunja_projects` - Project operations (fully implemented)\n  - `list` - List all projects with filters\n    - Support for pagination and search\n    - Filter by archived status\n  - `get` - Get project details by ID\n  - `create` - Create new project\n    - Required: title\n    - Optional: description, parentProjectId, isArchived, hexColor (format: #RRGGBB)\n    - Validates parent project hierarchy depth (max 10 levels)\n  - `update` - Update existing project\n    - Supports partial updates\n    - Can update all project fields including hexColor (format: #RRGGBB)\n    - Validates parent project hierarchy depth when changing parent\n  - `delete` - Delete a project by ID\n  - `archive` - Archive a project\n  - `unarchive` - Unarchive a project\n  - **Hierarchy Management** (New!)\n    - `get-children` - List direct children of a project\n    - `get-tree` - Get complete project hierarchy as a tree\n    - `get-breadcrumb` - Get path from root to a project\n    - `move` - Move a project to a new parent\n      - Validates against circular references\n      - Enforces maximum depth of 10 levels\n  - **Project Sharing**\n    - `create-share` - Create share link with permissions\n    - `list-shares` - List all shares for a project\n    - `get-share` - Get share details\n    - `delete-share` - Remove a share link\n    - `auth-share` - Authenticate to access a shared project\n\n### Label Management ✅\n- `vikunja_labels` - Label operations (fully implemented)\n  - `list` - List all labels with filters\n    - Support for pagination and search\n  - `get` - Get label details by ID\n  - `create` - Create new label\n    - Required: title\n    - Optional: description, hexColor (format: #RRGGBB)\n  - `update` - Update existing label\n    - Supports partial updates\n    - Can update title, description, hexColor\n  - `delete` - Delete a label by ID\n  - `apply-label` - Apply one or more labels to a task\n    - Required: task id, labels array\n    - Supports bulk label application\n  - `remove-label` - Remove one or more labels from a task\n    - Required: task id, labels array\n    - Supports bulk label removal\n  - `list-labels` - List all labels assigned to a task\n    - Required: task id\n    - Returns detailed label information\n\n### Project Templates ✅\n- `vikunja_templates` - Template operations (fully implemented)\n  - `create` - Create a template from existing project\n    - Required: projectId, name\n    - Optional: description, tags\n    - Captures all project settings and tasks\n  - `list` - List all available templates\n    - Shows template name, tags, and author\n  - `get` - Get template details by ID\n  - `update` - Update template metadata\n    - Can update name, description, tags\n  - `delete` - Delete a template\n  - `instantiate` - Create new project from template\n    - Required: id (template ID), projectName\n    - Optional: parentProjectId, variables\n    - Supports variable substitution:\n      - `{{PROJECT_NAME}}` - The new project name\n      - `{{TODAY}}` - Current date (YYYY-MM-DD)\n      - `{{NOW}}` - Current timestamp\n      - Custom variables via the variables parameter\n    - Creates all tasks with labels from template\n\n### Team Management ✅\n- `vikunja_teams` - Team operations (partially implemented)\n  - `list` - List all teams with filters\n    - Support for pagination and search\n  - `create` - Create new team\n    - Required: name\n    - Optional: description\n  - `delete` - Delete a team by ID (with fallback API support)\n  - `get` - Not yet implemented in node-vikunja\n  - `update` - Not yet implemented in node-vikunja\n  - `members` - Not yet implemented in node-vikunja\n\n### User Management ✅\n- `vikunja_users` - User operations (fully implemented) **[Requires JWT authentication]**\n  - `current` - Get current authenticated user info\n  - `search` - Search for users\n    - Optional: search query, pagination\n  - `settings` - Get current user settings\n  - `update-settings` - Update user settings\n    - Optional: name, language, timezone, weekStart, frontendSettings\n  - **Note:** User operations require JWT authentication. When using API token authentication, these tools will not be available.\n\n### Webhook Management ✅\n- `vikunja_webhooks` - Webhook operations for project automation (fully implemented)\n  - `list-events` - Get all available webhook event types\n  - `list` - List webhooks for a project\n    - Required: projectId\n  - `get` - Get a specific webhook\n    - Required: projectId, webhookId\n  - `create` - Create a new webhook\n    - Required: projectId, targetUrl, events (array)\n    - Optional: secret (for HMAC signing)\n    - **Note**: Events are validated against available event types\n  - `update` - Update webhook events\n    - Required: projectId, webhookId, events (array)\n    - **Note**: Events are validated against available event types\n  - `delete` - Delete a webhook\n    - Required: projectId, webhookId\n  \n  **Event Validation**: When creating or updating webhooks, the provided events are automatically validated against the list of available events from the API. Invalid events will result in a clear error message showing which events are invalid and listing all valid options. Valid events are cached for 5 minutes to improve performance.\n\n### Filter Management ✅\n- `vikunja_filters` - Advanced filtering for tasks (fully implemented)\n  - `list` - List saved filters\n    - Optional: projectId (for project-specific filters), global flag\n  - `get` - Get a specific filter by ID\n  - `create` - Create a new saved filter\n    - Required: name, filter (query string)\n    - Optional: description, projectId, isGlobal\n  - `update` - Update an existing filter\n    - Required: id\n    - Optional: name, description, filter, projectId, isGlobal\n  - `delete` - Delete a saved filter\n  - `build` - Build a filter string from conditions\n    - Required: conditions array\n    - Optional: groupOperator (&&, ||)\n  - `validate` - Validate a filter string\n  \n  **Note:** Saved filters are currently stored in memory and will be lost when the MCP server restarts. For production use, consider implementing persistent storage.\n\n### Data Export ✅\n\n> **⚠️ WARNING: Memory Usage**  \n> Export operations load entire project hierarchies into memory. For very large projects with thousands of tasks or deeply nested structures, this may consume significant memory. Consider exporting smaller projects individually.\n- `vikunja_export_project` - Export project data **[Requires JWT authentication]**\n  - **Parameters:**\n    - `projectId` (required) - ID of the project to export\n    - `includeChildren` (optional) - Include child projects recursively (default: false)\n  - **Returns:** Complete project data including tasks, labels, and metadata\n  - **Features:**\n    - Exports all tasks with full details\n    - Includes all labels used in the project\n    - Optionally includes complete child project hierarchy\n    - Circular reference detection for nested projects\n    - Export metadata includes timestamp and version\n  - **Note:** Export operations require JWT authentication. When using API token authentication, this tool will not be available.\n  \n- `vikunja_request_user_export` - Request full user data export\n  - **Parameters:**\n    - `password` (required) - User password for security verification\n  - **Returns:** Confirmation that export has been requested\n  - **Note:** You will receive an email when the export is ready\n  \n- `vikunja_download_user_export` - Download previously requested user data export\n  - **Parameters:**\n    - `password` (required) - User password for security verification\n  - **Returns:** Complete user data export\n  - **Note:** Export must be requested first via `vikunja_request_user_export`\n\n\n\n\n## Known Limitations\n\n1. **File Attachments**: The `attach` subcommand is not implemented due to MCP protocol limitations\n2. **Team Operations**: Limited functionality due to incomplete node-vikunja API support:\n   - Cannot get team by ID\n   - Cannot update team information\n   - Cannot delete teams\n   - Cannot manage team members\n3. **Pagination**: Some endpoints may not fully support pagination parameters due to API limitations\n4. **Authentication Issues**: Some Vikunja API endpoints have known authentication issues:\n   - **User endpoints**: May fail with token errors even with valid tokens (known Vikunja API limitation)\n   - **Bulk operations**: May have authentication issues with certain Vikunja API versions\n   - **Label operations**: May fail with authentication errors on some server configurations\n   - **Assignee operations**: May fail with authentication errors when creating/updating tasks with assignees\n   - The server provides detailed error messages when these issues occur, suggesting workarounds\n\n## Roadmap\n\n- [ ] Add bulk operations support\n- [ ] Implement webhook subscriptions for real-time updates\n- [ ] Add caching for frequently accessed data\n- [ ] Improve error messages for better user experience\n- [ ] Add integration tests with real Vikunja instance\n\n## Contributing\n\nPlease see [CONTRIBUTING.md](CONTRIBUTING.md) for development guidelines and workflow.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}