@vibetasks/mcp-server 0.2.1 → 0.2.2

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.
Files changed (2) hide show
  1. package/dist/index.js +165 -0
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -303,6 +303,171 @@ function setupTools(taskOps) {
303
303
  };
304
304
  }
305
305
  },
306
+ // start_vibing
307
+ {
308
+ name: "start_vibing",
309
+ description: 'Start vibing on a task (move to "vibing" status). Max 3 tasks vibing at once - research shows more causes 40% productivity loss.',
310
+ inputSchema: z.object({
311
+ task_id: z.string().describe("Task ID to start vibing on")
312
+ }),
313
+ handler: async (args, taskOps2) => {
314
+ const allTasks = await taskOps2.getTasks("all");
315
+ const vibingTasks = allTasks.filter((t) => t.status === "vibing");
316
+ const WIP_LIMIT = 3;
317
+ if (vibingTasks.length >= WIP_LIMIT) {
318
+ return {
319
+ content: [
320
+ {
321
+ type: "text",
322
+ text: JSON.stringify(
323
+ {
324
+ success: false,
325
+ error: `WIP limit reached! You have ${vibingTasks.length} tasks vibing. Complete one before starting another.`,
326
+ vibing_tasks: vibingTasks.map((t) => ({ id: t.id, title: t.title })),
327
+ wip_limit: WIP_LIMIT
328
+ },
329
+ null,
330
+ 2
331
+ )
332
+ }
333
+ ]
334
+ };
335
+ }
336
+ const task = await taskOps2.updateTask(args.task_id, { status: "vibing" });
337
+ return {
338
+ content: [
339
+ {
340
+ type: "text",
341
+ text: JSON.stringify(
342
+ {
343
+ success: true,
344
+ task: {
345
+ id: task.id,
346
+ title: task.title,
347
+ status: "vibing"
348
+ },
349
+ wip_count: vibingTasks.length + 1,
350
+ wip_limit: WIP_LIMIT
351
+ },
352
+ null,
353
+ 2
354
+ )
355
+ }
356
+ ]
357
+ };
358
+ }
359
+ },
360
+ // get_vibing_tasks
361
+ {
362
+ name: "get_vibing_tasks",
363
+ description: 'Get all tasks currently in "vibing" status. Use this to check what the user is actively working on.',
364
+ inputSchema: z.object({}),
365
+ handler: async (args, taskOps2) => {
366
+ const allTasks = await taskOps2.getTasks("all");
367
+ const vibingTasks = allTasks.filter((t) => t.status === "vibing");
368
+ const WIP_LIMIT = 3;
369
+ return {
370
+ content: [
371
+ {
372
+ type: "text",
373
+ text: JSON.stringify(
374
+ {
375
+ success: true,
376
+ vibing_tasks: vibingTasks.map((t) => ({
377
+ id: t.id,
378
+ title: t.title,
379
+ context_notes: t.context_notes,
380
+ priority: t.priority,
381
+ due_date: t.due_date
382
+ })),
383
+ count: vibingTasks.length,
384
+ wip_limit: WIP_LIMIT,
385
+ at_limit: vibingTasks.length >= WIP_LIMIT
386
+ },
387
+ null,
388
+ 2
389
+ )
390
+ }
391
+ ]
392
+ };
393
+ }
394
+ },
395
+ // set_context_notes
396
+ {
397
+ name: "set_context_notes",
398
+ description: 'Save "where I left off" notes for a task. Use this before pausing work or ending a session to capture context for later.',
399
+ inputSchema: z.object({
400
+ task_id: z.string().describe("Task ID"),
401
+ context_notes: z.string().describe("Where you left off - file, line, next step, blockers")
402
+ }),
403
+ handler: async (args, taskOps2) => {
404
+ const task = await taskOps2.updateTask(args.task_id, {
405
+ context_notes: args.context_notes
406
+ });
407
+ return {
408
+ content: [
409
+ {
410
+ type: "text",
411
+ text: JSON.stringify(
412
+ {
413
+ success: true,
414
+ task: {
415
+ id: task.id,
416
+ title: task.title,
417
+ context_notes: task.context_notes
418
+ },
419
+ message: "Context notes saved. You can resume seamlessly later."
420
+ },
421
+ null,
422
+ 2
423
+ )
424
+ }
425
+ ]
426
+ };
427
+ }
428
+ },
429
+ // list_tasks (with status filter)
430
+ {
431
+ name: "list_tasks",
432
+ description: "List tasks filtered by status (todo, vibing, done) or all tasks",
433
+ inputSchema: z.object({
434
+ status: z.enum(["todo", "vibing", "done", "all"]).default("all").describe("Filter by status"),
435
+ limit: z.number().default(50).describe("Maximum results")
436
+ }),
437
+ handler: async (args, taskOps2) => {
438
+ const allTasks = await taskOps2.getTasks("all");
439
+ let tasks = allTasks;
440
+ if (args.status !== "all") {
441
+ tasks = allTasks.filter((t) => t.status === args.status);
442
+ }
443
+ tasks = tasks.slice(0, args.limit);
444
+ return {
445
+ content: [
446
+ {
447
+ type: "text",
448
+ text: JSON.stringify(
449
+ {
450
+ success: true,
451
+ tasks: tasks.map((t) => ({
452
+ id: t.id,
453
+ title: t.title,
454
+ status: t.status,
455
+ priority: t.priority,
456
+ due_date: t.due_date,
457
+ context_notes: t.context_notes,
458
+ tags: t.tags?.map((tag) => tag.name) || []
459
+ })),
460
+ count: tasks.length,
461
+ filter: args.status
462
+ },
463
+ null,
464
+ 2
465
+ )
466
+ }
467
+ ]
468
+ };
469
+ }
470
+ },
306
471
  // log_ai_session
307
472
  {
308
473
  name: "log_ai_session",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibetasks/mcp-server",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "VibeTasks MCP Server for Claude Code, Cursor, and AI coding tools. Status-based task management: todo → vibing → done.",
5
5
  "author": "Vyas",
6
6
  "license": "MIT",