@limeadelabs/launchpad-mcp 1.2.0 → 1.2.1

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 +34 -34
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -184,7 +184,7 @@ function registerProjectTools(server2, client2) {
184
184
  "lp_get_project",
185
185
  "Get project details including agent_instructions",
186
186
  {
187
- project_id: z.number().describe("Project ID")
187
+ project_id: z.coerce.number().describe("Project ID")
188
188
  },
189
189
  async (params) => {
190
190
  try {
@@ -204,11 +204,11 @@ function registerTaskTools(server2, client2) {
204
204
  "lp_list_tasks",
205
205
  "List tasks from LaunchPad with optional filters (project, status, priority, label, assignee)",
206
206
  {
207
- project_id: z2.number().optional().describe("Filter by project ID"),
207
+ project_id: z2.coerce.number().optional().describe("Filter by project ID"),
208
208
  status: z2.string().optional().describe("Filter by status: todo, ready, in_progress, review, done"),
209
209
  priority: z2.string().optional().describe("Filter by priority: low, medium, high"),
210
210
  label: z2.string().optional().describe("Filter by label name"),
211
- assignee_id: z2.number().optional().describe("Filter by assignee user ID")
211
+ assignee_id: z2.coerce.number().optional().describe("Filter by assignee user ID")
212
212
  },
213
213
  async (params) => {
214
214
  try {
@@ -223,7 +223,7 @@ function registerTaskTools(server2, client2) {
223
223
  "lp_get_task",
224
224
  "Get full task context \u2014 description, comments, links, specs",
225
225
  {
226
- task_id: z2.number().describe("Task ID")
226
+ task_id: z2.coerce.number().describe("Task ID")
227
227
  },
228
228
  async (params) => {
229
229
  try {
@@ -238,7 +238,7 @@ function registerTaskTools(server2, client2) {
238
238
  "lp_create_task",
239
239
  "Create a new task in LaunchPad",
240
240
  {
241
- project_id: z2.number().describe("Project ID to create the task in"),
241
+ project_id: z2.coerce.number().describe("Project ID to create the task in"),
242
242
  title: z2.string().describe("Task title"),
243
243
  description: z2.string().optional().describe("Task description"),
244
244
  status: z2.string().optional().describe("Initial status: todo, ready, in_progress, review, done"),
@@ -257,10 +257,10 @@ function registerTaskTools(server2, client2) {
257
257
  "lp_update_task",
258
258
  "Update task status and/or fields. LaunchPad enforces workflow transitions \u2014 use lp_get_workflow to check valid transitions before changing status.",
259
259
  {
260
- task_id: z2.number().describe("Task ID"),
260
+ task_id: z2.coerce.number().describe("Task ID"),
261
261
  status: z2.string().optional().describe("New status (must be a valid workflow transition)"),
262
262
  priority: z2.string().optional().describe("New priority: low, medium, high"),
263
- assignee_id: z2.number().optional().describe("Assignee user ID"),
263
+ assignee_id: z2.coerce.number().optional().describe("Assignee user ID"),
264
264
  title: z2.string().optional().describe("New title"),
265
265
  description: z2.string().optional().describe("New description")
266
266
  },
@@ -283,7 +283,7 @@ function registerClaimTools(server2, client2) {
283
283
  "lp_claim_task",
284
284
  "Claim a task before working on it. Prevents other agents from picking it up.",
285
285
  {
286
- task_id: z3.number().describe("Task ID to claim")
286
+ task_id: z3.coerce.number().describe("Task ID to claim")
287
287
  },
288
288
  async (params) => {
289
289
  try {
@@ -298,7 +298,7 @@ function registerClaimTools(server2, client2) {
298
298
  "lp_release_task",
299
299
  "Release a claimed task so others can pick it up",
300
300
  {
301
- task_id: z3.number().describe("Task ID to release")
301
+ task_id: z3.coerce.number().describe("Task ID to release")
302
302
  },
303
303
  async (params) => {
304
304
  try {
@@ -313,7 +313,7 @@ function registerClaimTools(server2, client2) {
313
313
  "lp_heartbeat",
314
314
  "Send a heartbeat for a claimed task to keep the claim alive. Claims expire after 30 minutes without a heartbeat.",
315
315
  {
316
- task_id: z3.number().describe("Task ID to heartbeat")
316
+ task_id: z3.coerce.number().describe("Task ID to heartbeat")
317
317
  },
318
318
  async (params) => {
319
319
  try {
@@ -333,7 +333,7 @@ function registerCommentTools(server2, client2) {
333
333
  "lp_add_comment",
334
334
  "Post a comment on a task (progress updates, notes, questions)",
335
335
  {
336
- task_id: z4.number().describe("Task ID to comment on"),
336
+ task_id: z4.coerce.number().describe("Task ID to comment on"),
337
337
  body: z4.string().describe("Comment body text")
338
338
  },
339
339
  async (params) => {
@@ -354,8 +354,8 @@ function registerTimeTools(server2, client2) {
354
354
  "lp_log_time",
355
355
  "Track time spent on a task",
356
356
  {
357
- task_id: z5.number().describe("Task ID"),
358
- duration_minutes: z5.number().positive().describe("Duration in minutes"),
357
+ task_id: z5.coerce.number().describe("Task ID"),
358
+ duration_minutes: z5.coerce.number().positive().describe("Duration in minutes"),
359
359
  description: z5.string().optional().describe("Description of work done")
360
360
  },
361
361
  async (params) => {
@@ -376,7 +376,7 @@ function registerPromptTools(server2, client2) {
376
376
  "lp_generate_prompt",
377
377
  "Generate a build-ready prompt/spec for a task with full context, conventions, and acceptance criteria",
378
378
  {
379
- task_id: z6.number().describe("Task ID")
379
+ task_id: z6.coerce.number().describe("Task ID")
380
380
  },
381
381
  async (params) => {
382
382
  try {
@@ -396,7 +396,7 @@ function registerPageTools(server2, client2) {
396
396
  "lp_list_pages",
397
397
  "List spec/doc pages for a project",
398
398
  {
399
- project_id: z7.number().describe("Project ID")
399
+ project_id: z7.coerce.number().describe("Project ID")
400
400
  },
401
401
  async (params) => {
402
402
  try {
@@ -411,8 +411,8 @@ function registerPageTools(server2, client2) {
411
411
  "lp_get_page",
412
412
  "Get a page's full content",
413
413
  {
414
- project_id: z7.number().describe("Project ID"),
415
- page_id: z7.number().describe("Page ID")
414
+ project_id: z7.coerce.number().describe("Project ID"),
415
+ page_id: z7.coerce.number().describe("Page ID")
416
416
  },
417
417
  async (params) => {
418
418
  try {
@@ -427,7 +427,7 @@ function registerPageTools(server2, client2) {
427
427
  "lp_get_workflow",
428
428
  "Get valid workflow states and transitions for a project",
429
429
  {
430
- project_id: z7.number().describe("Project ID")
430
+ project_id: z7.coerce.number().describe("Project ID")
431
431
  },
432
432
  async (params) => {
433
433
  try {
@@ -447,11 +447,11 @@ function registerContextTools(server2, client2) {
447
447
  "lp_context_list",
448
448
  "List available context entries with optional filters",
449
449
  {
450
- project_id: z8.number().optional().describe("Filter by project ID"),
450
+ project_id: z8.coerce.number().optional().describe("Filter by project ID"),
451
451
  entry_type: z8.string().optional().describe("Filter by entry type"),
452
452
  search: z8.string().optional().describe("Text search on entry name"),
453
- limit: z8.number().min(1).max(100).optional().describe("Max entries to return (default 50)"),
454
- offset: z8.number().min(0).optional().describe("Offset for pagination")
453
+ limit: z8.coerce.number().min(1).max(100).optional().describe("Max entries to return (default 50)"),
454
+ offset: z8.coerce.number().min(0).optional().describe("Offset for pagination")
455
455
  },
456
456
  async (params) => {
457
457
  try {
@@ -467,7 +467,7 @@ function registerContextTools(server2, client2) {
467
467
  "Fetch a specific context entry by slug or ID",
468
468
  {
469
469
  slug: z8.string().optional().describe("Entry slug"),
470
- id: z8.number().optional().describe("Entry ID")
470
+ id: z8.coerce.number().optional().describe("Entry ID")
471
471
  },
472
472
  async (params) => {
473
473
  const identifier = params.slug || (params.id !== void 0 ? String(params.id) : void 0);
@@ -489,7 +489,7 @@ function registerContextTools(server2, client2) {
489
489
  "lp_context_package",
490
490
  "Get the assembled context package for a task \u2014 task details, context entries, specs, pages, comments",
491
491
  {
492
- task_id: z8.number().describe("Task ID")
492
+ task_id: z8.coerce.number().describe("Task ID")
493
493
  },
494
494
  async (params) => {
495
495
  try {
@@ -505,7 +505,7 @@ function registerContextTools(server2, client2) {
505
505
  "Update a context entry's content (requires write access)",
506
506
  {
507
507
  slug: z8.string().optional().describe("Entry slug"),
508
- id: z8.number().optional().describe("Entry ID"),
508
+ id: z8.coerce.number().optional().describe("Entry ID"),
509
509
  content: z8.string().describe("New markdown content"),
510
510
  change_summary: z8.string().describe("What changed and why")
511
511
  },
@@ -563,7 +563,7 @@ function registerSessionTools(server2, client2) {
563
563
  "lp_session_start",
564
564
  "Start a new agent session for a task. Creates session via API and saves session_id to disk for later lookup.",
565
565
  {
566
- task_id: z9.number().describe("LaunchPad task ID"),
566
+ task_id: z9.coerce.number().describe("LaunchPad task ID"),
567
567
  agent_type: z9.string().optional().describe("Agent type (default: claude_code)")
568
568
  },
569
569
  async ({ task_id, agent_type }) => {
@@ -582,8 +582,8 @@ function registerSessionTools(server2, client2) {
582
582
  "lp_session_heartbeat",
583
583
  "Send a heartbeat for an active session. Provide session_id directly or task_id to look up session from disk. Graceful no-op if neither provided.",
584
584
  {
585
- session_id: z9.number().optional().describe("Session ID"),
586
- task_id: z9.number().optional().describe("Task ID to look up session from disk")
585
+ session_id: z9.coerce.number().optional().describe("Session ID"),
586
+ task_id: z9.coerce.number().optional().describe("Task ID to look up session from disk")
587
587
  },
588
588
  async ({ session_id, task_id }) => {
589
589
  try {
@@ -606,7 +606,7 @@ function registerSessionTools(server2, client2) {
606
606
  "lp_session_progress",
607
607
  'Report progress on an active session. Sends an activity update with action "progress".',
608
608
  {
609
- session_id: z9.number().describe("Session ID"),
609
+ session_id: z9.coerce.number().describe("Session ID"),
610
610
  detail: z9.string().describe("Description of progress made")
611
611
  },
612
612
  async ({ session_id, detail }) => {
@@ -626,7 +626,7 @@ function registerSessionTools(server2, client2) {
626
626
  "lp_session_event",
627
627
  "Log a discrete event for a session (commit, ci_pass, ci_fail, pr_opened, blocker, cost_update).",
628
628
  {
629
- session_id: z9.number().describe("Session ID"),
629
+ session_id: z9.coerce.number().describe("Session ID"),
630
630
  event_type: z9.enum(["commit", "ci_pass", "ci_fail", "pr_opened", "blocker", "cost_update"]).describe("Type of event"),
631
631
  payload: z9.record(z9.unknown()).describe("Event payload data")
632
632
  },
@@ -645,7 +645,7 @@ function registerSessionTools(server2, client2) {
645
645
  "lp_session_blocked",
646
646
  'Mark a session as blocked. Updates status to "blocked" and logs a blocker event.',
647
647
  {
648
- session_id: z9.number().describe("Session ID"),
648
+ session_id: z9.coerce.number().describe("Session ID"),
649
649
  reason: z9.string().describe("Reason the session is blocked")
650
650
  },
651
651
  async ({ session_id, reason }) => {
@@ -669,9 +669,9 @@ function registerSessionTools(server2, client2) {
669
669
  "lp_session_complete",
670
670
  "Mark a session as completed with a result summary. Clears session from disk.",
671
671
  {
672
- session_id: z9.number().describe("Session ID"),
672
+ session_id: z9.coerce.number().describe("Session ID"),
673
673
  result_summary: z9.string().describe("Summary of what was accomplished"),
674
- task_id: z9.number().optional().describe("Task ID to clear from disk (if not provided, derived from session)")
674
+ task_id: z9.coerce.number().optional().describe("Task ID to clear from disk (if not provided, derived from session)")
675
675
  },
676
676
  async ({ session_id, result_summary, task_id }) => {
677
677
  try {
@@ -693,9 +693,9 @@ function registerSessionTools(server2, client2) {
693
693
  "lp_session_fail",
694
694
  "Mark a session as failed with an error detail. Clears session from disk.",
695
695
  {
696
- session_id: z9.number().describe("Session ID"),
696
+ session_id: z9.coerce.number().describe("Session ID"),
697
697
  error_detail: z9.string().describe("Description of the failure"),
698
- task_id: z9.number().optional().describe("Task ID to clear from disk (if not provided, derived from session)")
698
+ task_id: z9.coerce.number().optional().describe("Task ID to clear from disk (if not provided, derived from session)")
699
699
  },
700
700
  async ({ session_id, error_detail, task_id }) => {
701
701
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@limeadelabs/launchpad-mcp",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "description": "LaunchPad MCP server for Claude Code — AI-native project management integration",
5
5
  "type": "module",
6
6
  "exports": {