@kaneo/mcp 0.1.9 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -115,13 +115,21 @@ For headless or sandboxed environments where opening a browser is impractical, s
115
115
 
116
116
  ## Tools
117
117
 
118
- - Session: `whoami`, `list_workspaces`
119
- - Projects: `list_projects`, `get_project`, `create_project`, `update_project`
120
- - Tasks: `list_tasks`, `get_task`, `create_task`, `update_task`, `move_task`, `update_task_status`
118
+ - Session: `whoami`, `list_workspaces`, `list_workspace_members`, `list_notifications`
119
+ - Search: `search`
120
+ - Projects: `list_projects`, `get_project`, `create_project`, `update_project`, `list_project_columns`
121
+ - Tasks: `list_tasks`, `get_task`, `create_task`, `update_task`, `delete_task`, `move_task`, `update_task_status`, `update_task_assignee`, `update_task_due_date`, `list_task_activity`
122
+ - Time entries: `list_task_time_entries`, `get_time_entry`, `create_time_entry`, `update_time_entry`
121
123
  - Comments: `list_task_comments`, `create_task_comment`, `update_task_comment`, `delete_task_comment`
122
124
  - Labels: `list_workspace_labels`, `create_label`, `attach_label_to_task`, `detach_label_from_task`, `delete_label`
123
125
  - Task relations: `create_task_relation`, `get_task_relations`, `delete_task_relation`
124
126
 
127
+ Call `list_project_columns` before setting a status: the column slugs it
128
+ returns are the values `create_task` and `update_task_status` accept.
129
+ `list_workspace_members` resolves the user IDs the assignee tools expect.
130
+ Time entries have no delete endpoint on the API, so there is no
131
+ `delete_time_entry` tool.
132
+
125
133
  ## Releasing
126
134
 
127
135
  Bump `version` in `packages/mcp/package.json` and merge to `main`. The [publish workflow](../../.github/workflows/publish-mcp.yml) runs the package tests, publishes the new version to npm, and creates a `mcp-v<version>` GitHub release. Nothing is published while the version stays the same, so tool changes reach npm only once the version is bumped.
@@ -347,4 +347,126 @@ export function registerTools(server, ctx) {
347
347
  method: "DELETE",
348
348
  });
349
349
  }));
350
+ server.registerTool("list_workspace_members", {
351
+ description: "List the members of a workspace. Use this to resolve the user ID an assignee tool expects.",
352
+ inputSchema: z.object({ workspaceId: nonEmptyString }),
353
+ }, async (args) => run(() => client.json(`/api/workspace/${encodeURIComponent(args.workspaceId)}/members`)));
354
+ server.registerTool("search", {
355
+ description: "Search across tasks, projects, workspaces, comments, and activities.",
356
+ inputSchema: z.object({
357
+ q: nonEmptyString.describe("Search query"),
358
+ type: z
359
+ .enum([
360
+ "all",
361
+ "tasks",
362
+ "projects",
363
+ "workspaces",
364
+ "comments",
365
+ "activities",
366
+ ])
367
+ .optional()
368
+ .describe("Restrict results to one kind. Defaults to all."),
369
+ workspaceId: optionalNonEmptyString.describe("Limit to one workspace"),
370
+ projectId: optionalNonEmptyString.describe("Limit to one project"),
371
+ limit: z
372
+ .number()
373
+ .int()
374
+ .min(1)
375
+ .max(50)
376
+ .optional()
377
+ .describe("Maximum results, 1 to 50. Defaults to 20."),
378
+ }),
379
+ }, async (args) => {
380
+ const qs = new URLSearchParams({ q: args.q });
381
+ if (args.type)
382
+ qs.set("type", args.type);
383
+ if (args.workspaceId)
384
+ qs.set("workspaceId", args.workspaceId);
385
+ if (args.projectId)
386
+ qs.set("projectId", args.projectId);
387
+ if (args.limit !== undefined)
388
+ qs.set("limit", String(args.limit));
389
+ return run(() => client.json(`/api/search?${qs.toString()}`));
390
+ });
391
+ server.registerTool("list_project_columns", {
392
+ description: "List a project's columns. Their slugs are the values update_task_status and create_task accept as a status.",
393
+ inputSchema: z.object({ projectId: nonEmptyString }),
394
+ }, async (args) => run(() => client.json(`/api/column/${encodeURIComponent(args.projectId)}`)));
395
+ server.registerTool("delete_task", {
396
+ description: "Delete a task by ID.",
397
+ inputSchema: z.object({ taskId: nonEmptyString }),
398
+ }, async (args) => run(() => client.json(`/api/task/${encodeURIComponent(args.taskId)}`, {
399
+ method: "DELETE",
400
+ })));
401
+ server.registerTool("update_task_assignee", {
402
+ description: "Assign a task to a workspace member, or pass a null userId to unassign it.",
403
+ inputSchema: z.object({
404
+ taskId: nonEmptyString,
405
+ userId: nonEmptyString
406
+ .nullable()
407
+ .describe("Member user ID, or null to unassign"),
408
+ }),
409
+ }, async (args) => run(() => client.json(`/api/task/assignee/${encodeURIComponent(args.taskId)}`, {
410
+ method: "PUT",
411
+ body: JSON.stringify({ userId: args.userId }),
412
+ })));
413
+ server.registerTool("update_task_due_date", {
414
+ description: "Set a task's due date. Omit dueDate to clear it.",
415
+ inputSchema: z.object({
416
+ taskId: nonEmptyString,
417
+ dueDate: optionalIsoDateTimeSchema,
418
+ }),
419
+ }, async (args) => run(() => client.json(`/api/task/due-date/${encodeURIComponent(args.taskId)}`, {
420
+ method: "PUT",
421
+ body: JSON.stringify(args.dueDate === undefined ? {} : { dueDate: args.dueDate }),
422
+ })));
423
+ server.registerTool("list_task_time_entries", {
424
+ description: "List the time entries logged against a task.",
425
+ inputSchema: z.object({ taskId: nonEmptyString }),
426
+ }, async (args) => run(() => client.json(`/api/time-entry/task/${encodeURIComponent(args.taskId)}`)));
427
+ server.registerTool("get_time_entry", {
428
+ description: "Get a single time entry by ID.",
429
+ inputSchema: z.object({ id: nonEmptyString }),
430
+ }, async (args) => run(() => client.json(`/api/time-entry/${encodeURIComponent(args.id)}`)));
431
+ server.registerTool("create_time_entry", {
432
+ description: "Log time against a task. Omit endTime to leave the entry running.",
433
+ inputSchema: z.object({
434
+ taskId: nonEmptyString,
435
+ startTime: isoDateTimeSchema,
436
+ endTime: optionalIsoDateTimeSchema,
437
+ description: optionalNonEmptyString,
438
+ }),
439
+ }, async (args) => run(() => client.json("/api/time-entry", {
440
+ method: "POST",
441
+ body: JSON.stringify({
442
+ taskId: args.taskId,
443
+ startTime: args.startTime,
444
+ ...(args.endTime ? { endTime: args.endTime } : {}),
445
+ ...(args.description ? { description: args.description } : {}),
446
+ }),
447
+ })));
448
+ server.registerTool("update_time_entry", {
449
+ description: "Update a time entry. startTime is required; omitting endTime keeps the stored one. startTime cannot be later than the end time.",
450
+ inputSchema: z.object({
451
+ id: nonEmptyString,
452
+ startTime: isoDateTimeSchema,
453
+ endTime: optionalIsoDateTimeSchema,
454
+ description: optionalNonEmptyString,
455
+ }),
456
+ }, async (args) => run(() => client.json(`/api/time-entry/${encodeURIComponent(args.id)}`, {
457
+ method: "PUT",
458
+ body: JSON.stringify({
459
+ startTime: args.startTime,
460
+ ...(args.endTime ? { endTime: args.endTime } : {}),
461
+ ...(args.description ? { description: args.description } : {}),
462
+ }),
463
+ })));
464
+ server.registerTool("list_task_activity", {
465
+ description: "List a task's activity history.",
466
+ inputSchema: z.object({ taskId: nonEmptyString }),
467
+ }, async (args) => run(() => client.json(`/api/activity/${encodeURIComponent(args.taskId)}`)));
468
+ server.registerTool("list_notifications", {
469
+ description: "List the signed-in user's notifications.",
470
+ inputSchema: z.object({}),
471
+ }, async () => run(() => client.json("/api/notification")));
350
472
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kaneo/mcp",
3
- "version": "0.1.9",
3
+ "version": "0.1.11",
4
4
  "mcpName": "io.github.usekaneo/kaneo",
5
5
  "description": "Official MCP (Model Context Protocol) server for Kaneo, the open source project management platform: manage tasks, projects, and labels from Claude, Cursor, and other MCP clients",
6
6
  "license": "MIT",
@@ -59,10 +59,10 @@
59
59
  },
60
60
  "devDependencies": {
61
61
  "@kaneo/typescript-config": "workspace:*",
62
- "@types/node": "^25.3.5",
62
+ "@types/node": "^26.1.2",
63
63
  "@types/prompts": "^2.4.9",
64
- "tsx": "^4.23.1",
65
- "typescript": "^5.9.3",
64
+ "tsx": "^4.23.9",
65
+ "typescript": "^7.0.2",
66
66
  "vitest": "^4.1.10"
67
67
  }
68
68
  }