@spacelr/mcp 0.1.0 → 0.2.0

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/dist/index.mjs CHANGED
@@ -3537,8 +3537,143 @@ function registerCronJobTools(server, api) {
3537
3537
  );
3538
3538
  }
3539
3539
 
3540
- // libs/mcp-server/src/tools/webhooks.ts
3540
+ // libs/mcp-server/src/tools/schedules.ts
3541
3541
  import { z as z10 } from "zod";
3542
+ var STATUS_VALUES = ["scheduled", "fired", "failed", "cancelled"];
3543
+ function registerScheduleTools(server, api) {
3544
+ server.registerTool(
3545
+ "schedules_list",
3546
+ {
3547
+ description: "List one-shot scheduled function invocations for a project",
3548
+ inputSchema: {
3549
+ projectId: z10.string(),
3550
+ functionId: z10.string().optional(),
3551
+ status: z10.enum(STATUS_VALUES).optional(),
3552
+ limit: z10.number().int().min(1).max(200).optional(),
3553
+ offset: z10.number().int().min(0).optional()
3554
+ }
3555
+ },
3556
+ async ({ projectId, functionId, status, limit, offset }) => {
3557
+ try {
3558
+ const result = await api.get(
3559
+ `/projects/${encodeURIComponent(projectId)}/schedules`,
3560
+ { params: { functionId, status, limit, offset } }
3561
+ );
3562
+ return {
3563
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
3564
+ };
3565
+ } catch (error) {
3566
+ const message = error instanceof Error ? error.message : String(error);
3567
+ return {
3568
+ content: [{ type: "text", text: `Failed to list schedules: ${message}` }],
3569
+ isError: true
3570
+ };
3571
+ }
3572
+ }
3573
+ );
3574
+ server.registerTool(
3575
+ "schedules_get",
3576
+ {
3577
+ description: "Get a single scheduled invocation by ID",
3578
+ inputSchema: {
3579
+ projectId: z10.string(),
3580
+ scheduleId: z10.string()
3581
+ }
3582
+ },
3583
+ async ({ projectId, scheduleId }) => {
3584
+ try {
3585
+ const result = await api.get(
3586
+ `/projects/${encodeURIComponent(projectId)}/schedules/${encodeURIComponent(scheduleId)}`
3587
+ );
3588
+ return {
3589
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
3590
+ };
3591
+ } catch (error) {
3592
+ const message = error instanceof Error ? error.message : String(error);
3593
+ return {
3594
+ content: [{ type: "text", text: `Failed to get schedule: ${message}` }],
3595
+ isError: true
3596
+ };
3597
+ }
3598
+ }
3599
+ );
3600
+ server.registerTool(
3601
+ "schedules_create",
3602
+ {
3603
+ description: "Schedule a one-shot function invocation. `executeAt` must be ISO-8601 within the configured max-delay window (default 90 days). Repeating with the same `idempotencyKey` returns the existing schedule.",
3604
+ inputSchema: {
3605
+ projectId: z10.string(),
3606
+ functionId: z10.string().regex(/^[a-f0-9]{24}$/i),
3607
+ executeAt: z10.string().describe("ISO-8601 timestamp"),
3608
+ payload: z10.record(z10.string(), z10.unknown()).optional(),
3609
+ idempotencyKey: z10.string().min(1).max(256).optional(),
3610
+ maxAttempts: z10.number().int().min(0).max(10).optional()
3611
+ }
3612
+ },
3613
+ async ({
3614
+ projectId,
3615
+ functionId,
3616
+ executeAt,
3617
+ payload,
3618
+ idempotencyKey,
3619
+ maxAttempts
3620
+ }) => {
3621
+ try {
3622
+ const body = { functionId, executeAt };
3623
+ if (payload !== void 0) body.payload = payload;
3624
+ if (idempotencyKey !== void 0) body.idempotencyKey = idempotencyKey;
3625
+ if (maxAttempts !== void 0) body.maxAttempts = maxAttempts;
3626
+ const result = await api.post(
3627
+ `/projects/${encodeURIComponent(projectId)}/schedules`,
3628
+ { body }
3629
+ );
3630
+ return {
3631
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
3632
+ };
3633
+ } catch (error) {
3634
+ const message = error instanceof Error ? error.message : String(error);
3635
+ return {
3636
+ content: [{ type: "text", text: `Failed to create schedule: ${message}` }],
3637
+ isError: true
3638
+ };
3639
+ }
3640
+ }
3641
+ );
3642
+ server.registerTool(
3643
+ "schedules_cancel",
3644
+ {
3645
+ description: "Cancel a scheduled invocation. Idempotent \u2014 returns the existing record if already in a terminal state (fired/failed/cancelled).",
3646
+ inputSchema: {
3647
+ projectId: z10.string(),
3648
+ scheduleId: z10.string()
3649
+ }
3650
+ },
3651
+ async ({ projectId, scheduleId }) => {
3652
+ try {
3653
+ const result = await api.delete(
3654
+ `/projects/${encodeURIComponent(projectId)}/schedules/${encodeURIComponent(scheduleId)}`
3655
+ );
3656
+ return {
3657
+ content: [
3658
+ {
3659
+ type: "text",
3660
+ text: result ? JSON.stringify(result, null, 2) : "Schedule cancelled"
3661
+ }
3662
+ ]
3663
+ };
3664
+ } catch (error) {
3665
+ const message = error instanceof Error ? error.message : String(error);
3666
+ return {
3667
+ content: [{ type: "text", text: `Failed to cancel schedule: ${message}` }],
3668
+ isError: true
3669
+ };
3670
+ }
3671
+ }
3672
+ );
3673
+ }
3674
+
3675
+ // libs/mcp-server/src/tools/webhooks.ts
3676
+ import { z as z11 } from "zod";
3542
3677
  var WEBHOOK_EVENT_TYPES = [
3543
3678
  "user.created",
3544
3679
  "user.updated",
@@ -3562,7 +3697,7 @@ function registerWebhookTools(server, api) {
3562
3697
  {
3563
3698
  description: "List all webhooks for a project",
3564
3699
  inputSchema: {
3565
- projectId: z10.string()
3700
+ projectId: z11.string()
3566
3701
  }
3567
3702
  },
3568
3703
  async ({ projectId }) => {
@@ -3585,8 +3720,8 @@ function registerWebhookTools(server, api) {
3585
3720
  {
3586
3721
  description: "Get a single webhook by ID",
3587
3722
  inputSchema: {
3588
- projectId: z10.string(),
3589
- webhookId: z10.string()
3723
+ projectId: z11.string(),
3724
+ webhookId: z11.string()
3590
3725
  }
3591
3726
  },
3592
3727
  async ({ projectId, webhookId }) => {
@@ -3609,12 +3744,12 @@ function registerWebhookTools(server, api) {
3609
3744
  {
3610
3745
  description: "Create a new webhook for a project. WARNING: The response includes a secret that will be visible in the conversation context. Events include: user.created, user.updated, user.deleted, user.login, user.email_verified, user.password_reset_requested, user.password_reset, user.2fa_verified, database.insert, database.update, database.delete, storage.upload, storage.delete, project.created, project.updated.",
3611
3746
  inputSchema: {
3612
- projectId: z10.string(),
3613
- url: z10.string().url(),
3614
- events: z10.array(z10.enum(WEBHOOK_EVENT_TYPES)).min(1),
3615
- description: z10.string().optional(),
3616
- headers: z10.record(z10.string(), z10.string()).optional(),
3617
- active: z10.boolean().optional()
3747
+ projectId: z11.string(),
3748
+ url: z11.string().url(),
3749
+ events: z11.array(z11.enum(WEBHOOK_EVENT_TYPES)).min(1),
3750
+ description: z11.string().optional(),
3751
+ headers: z11.record(z11.string(), z11.string()).optional(),
3752
+ active: z11.boolean().optional()
3618
3753
  }
3619
3754
  },
3620
3755
  async ({ projectId, url, events, description, headers, active }) => {
@@ -3641,13 +3776,13 @@ function registerWebhookTools(server, api) {
3641
3776
  {
3642
3777
  description: "Update an existing webhook",
3643
3778
  inputSchema: {
3644
- projectId: z10.string(),
3645
- webhookId: z10.string(),
3646
- url: z10.string().url().optional(),
3647
- events: z10.array(z10.enum(WEBHOOK_EVENT_TYPES)).min(1).optional(),
3648
- description: z10.string().optional(),
3649
- headers: z10.record(z10.string(), z10.string()).optional(),
3650
- active: z10.boolean().optional()
3779
+ projectId: z11.string(),
3780
+ webhookId: z11.string(),
3781
+ url: z11.string().url().optional(),
3782
+ events: z11.array(z11.enum(WEBHOOK_EVENT_TYPES)).min(1).optional(),
3783
+ description: z11.string().optional(),
3784
+ headers: z11.record(z11.string(), z11.string()).optional(),
3785
+ active: z11.boolean().optional()
3651
3786
  }
3652
3787
  },
3653
3788
  async ({ projectId, webhookId, url, events, description, headers, active }) => {
@@ -3682,8 +3817,8 @@ function registerWebhookTools(server, api) {
3682
3817
  {
3683
3818
  description: "Delete a webhook",
3684
3819
  inputSchema: {
3685
- projectId: z10.string(),
3686
- webhookId: z10.string()
3820
+ projectId: z11.string(),
3821
+ webhookId: z11.string()
3687
3822
  }
3688
3823
  },
3689
3824
  async ({ projectId, webhookId }) => {
@@ -3706,8 +3841,8 @@ function registerWebhookTools(server, api) {
3706
3841
  {
3707
3842
  description: "Send a test ping to a webhook",
3708
3843
  inputSchema: {
3709
- projectId: z10.string(),
3710
- webhookId: z10.string()
3844
+ projectId: z11.string(),
3845
+ webhookId: z11.string()
3711
3846
  }
3712
3847
  },
3713
3848
  async ({ projectId, webhookId }) => {
@@ -3730,10 +3865,10 @@ function registerWebhookTools(server, api) {
3730
3865
  {
3731
3866
  description: "List webhook delivery logs for a project",
3732
3867
  inputSchema: {
3733
- projectId: z10.string(),
3734
- webhookId: z10.string().optional(),
3735
- limit: z10.number().int().min(1).max(100).optional(),
3736
- offset: z10.number().int().min(0).optional()
3868
+ projectId: z11.string(),
3869
+ webhookId: z11.string().optional(),
3870
+ limit: z11.number().int().min(1).max(100).optional(),
3871
+ offset: z11.number().int().min(0).optional()
3737
3872
  }
3738
3873
  },
3739
3874
  async ({ projectId, webhookId, limit, offset }) => {
@@ -3756,8 +3891,8 @@ function registerWebhookTools(server, api) {
3756
3891
  {
3757
3892
  description: "Retry a failed webhook delivery",
3758
3893
  inputSchema: {
3759
- projectId: z10.string(),
3760
- deliveryId: z10.string()
3894
+ projectId: z11.string(),
3895
+ deliveryId: z11.string()
3761
3896
  }
3762
3897
  },
3763
3898
  async ({ projectId, deliveryId }) => {
@@ -3778,14 +3913,14 @@ function registerWebhookTools(server, api) {
3778
3913
  }
3779
3914
 
3780
3915
  // libs/mcp-server/src/tools/notifications.ts
3781
- import { z as z11 } from "zod";
3916
+ import { z as z12 } from "zod";
3782
3917
  function registerNotificationTools(server, api) {
3783
3918
  server.registerTool(
3784
3919
  "notification_templates_list",
3785
3920
  {
3786
3921
  description: "List all notification templates for a project (includes system defaults)",
3787
3922
  inputSchema: {
3788
- projectId: z11.string()
3923
+ projectId: z12.string()
3789
3924
  }
3790
3925
  },
3791
3926
  async ({ projectId }) => {
@@ -3808,7 +3943,7 @@ function registerNotificationTools(server, api) {
3808
3943
  {
3809
3944
  description: "Get a single notification template by ID",
3810
3945
  inputSchema: {
3811
- id: z11.string()
3946
+ id: z12.string()
3812
3947
  }
3813
3948
  },
3814
3949
  async ({ id }) => {
@@ -3831,15 +3966,15 @@ function registerNotificationTools(server, api) {
3831
3966
  {
3832
3967
  description: "Create a new project-specific notification template. Variables use Handlebars syntax in titleTemplate and bodyTemplate.",
3833
3968
  inputSchema: {
3834
- projectId: z11.string(),
3835
- type: z11.string(),
3836
- name: z11.string(),
3837
- titleTemplate: z11.string(),
3838
- bodyTemplate: z11.string(),
3839
- icon: z11.string().optional(),
3840
- defaultUrl: z11.string().optional(),
3841
- variables: z11.array(z11.string()).optional(),
3842
- isActive: z11.boolean().optional()
3969
+ projectId: z12.string(),
3970
+ type: z12.string(),
3971
+ name: z12.string(),
3972
+ titleTemplate: z12.string(),
3973
+ bodyTemplate: z12.string(),
3974
+ icon: z12.string().optional(),
3975
+ defaultUrl: z12.string().optional(),
3976
+ variables: z12.array(z12.string()).optional(),
3977
+ isActive: z12.boolean().optional()
3843
3978
  }
3844
3979
  },
3845
3980
  async ({ projectId, type, name, titleTemplate, bodyTemplate, icon, defaultUrl, variables, isActive }) => {
@@ -3867,14 +4002,14 @@ function registerNotificationTools(server, api) {
3867
4002
  {
3868
4003
  description: "Update an existing notification template",
3869
4004
  inputSchema: {
3870
- id: z11.string(),
3871
- name: z11.string().optional(),
3872
- titleTemplate: z11.string().optional(),
3873
- bodyTemplate: z11.string().optional(),
3874
- icon: z11.string().optional(),
3875
- defaultUrl: z11.string().optional(),
3876
- variables: z11.array(z11.string()).optional(),
3877
- isActive: z11.boolean().optional()
4005
+ id: z12.string(),
4006
+ name: z12.string().optional(),
4007
+ titleTemplate: z12.string().optional(),
4008
+ bodyTemplate: z12.string().optional(),
4009
+ icon: z12.string().optional(),
4010
+ defaultUrl: z12.string().optional(),
4011
+ variables: z12.array(z12.string()).optional(),
4012
+ isActive: z12.boolean().optional()
3878
4013
  }
3879
4014
  },
3880
4015
  async ({ id, name, titleTemplate, bodyTemplate, icon, defaultUrl, variables, isActive }) => {
@@ -3911,7 +4046,7 @@ function registerNotificationTools(server, api) {
3911
4046
  {
3912
4047
  description: "Delete a project notification template override (reverts to system default)",
3913
4048
  inputSchema: {
3914
- id: z11.string()
4049
+ id: z12.string()
3915
4050
  }
3916
4051
  },
3917
4052
  async ({ id }) => {
@@ -3934,9 +4069,9 @@ function registerNotificationTools(server, api) {
3934
4069
  {
3935
4070
  description: "Preview a compiled notification template with Handlebars variables applied",
3936
4071
  inputSchema: {
3937
- titleTemplate: z11.string(),
3938
- bodyTemplate: z11.string(),
3939
- variables: z11.record(z11.string(), z11.string())
4072
+ titleTemplate: z12.string(),
4073
+ bodyTemplate: z12.string(),
4074
+ variables: z12.record(z12.string(), z12.string())
3940
4075
  }
3941
4076
  },
3942
4077
  async ({ titleTemplate, bodyTemplate, variables }) => {
@@ -3959,7 +4094,7 @@ function registerNotificationTools(server, api) {
3959
4094
  {
3960
4095
  description: "Get push notification provider configuration for a project (VAPID, FCM, APNS). WARNING: Response may include sensitive credentials that will be visible in the conversation context.",
3961
4096
  inputSchema: {
3962
- projectId: z11.string()
4097
+ projectId: z12.string()
3963
4098
  }
3964
4099
  },
3965
4100
  async ({ projectId }) => {
@@ -3982,24 +4117,24 @@ function registerNotificationTools(server, api) {
3982
4117
  {
3983
4118
  description: "Update push notification provider configuration. Supports VAPID, FCM, and APNS providers. WARNING: privateKey and serviceAccountJson values are sensitive credentials that will be visible in the conversation context.",
3984
4119
  inputSchema: {
3985
- projectId: z11.string(),
3986
- vapid: z11.object({
3987
- publicKey: z11.string().optional(),
3988
- privateKey: z11.string().optional(),
3989
- subject: z11.string().optional(),
3990
- enabled: z11.boolean().optional()
4120
+ projectId: z12.string(),
4121
+ vapid: z12.object({
4122
+ publicKey: z12.string().optional(),
4123
+ privateKey: z12.string().optional(),
4124
+ subject: z12.string().optional(),
4125
+ enabled: z12.boolean().optional()
3991
4126
  }).optional(),
3992
- fcm: z11.object({
3993
- serviceAccountJson: z11.string().optional(),
3994
- enabled: z11.boolean().optional()
4127
+ fcm: z12.object({
4128
+ serviceAccountJson: z12.string().optional(),
4129
+ enabled: z12.boolean().optional()
3995
4130
  }).optional(),
3996
- apns: z11.object({
3997
- keyId: z11.string().optional(),
3998
- teamId: z11.string().optional(),
3999
- privateKey: z11.string().optional(),
4000
- bundleId: z11.string().optional(),
4001
- production: z11.boolean().optional(),
4002
- enabled: z11.boolean().optional()
4131
+ apns: z12.object({
4132
+ keyId: z12.string().optional(),
4133
+ teamId: z12.string().optional(),
4134
+ privateKey: z12.string().optional(),
4135
+ bundleId: z12.string().optional(),
4136
+ production: z12.boolean().optional(),
4137
+ enabled: z12.boolean().optional()
4003
4138
  }).optional()
4004
4139
  }
4005
4140
  },
@@ -4033,8 +4168,8 @@ function registerNotificationTools(server, api) {
4033
4168
  {
4034
4169
  description: "Delete push notification provider configuration. Specify a provider to delete only that one, or omit to delete all.",
4035
4170
  inputSchema: {
4036
- projectId: z11.string(),
4037
- provider: z11.enum(["vapid", "fcm", "apns"]).optional()
4171
+ projectId: z12.string(),
4172
+ provider: z12.enum(["vapid", "fcm", "apns"]).optional()
4038
4173
  }
4039
4174
  },
4040
4175
  async ({ projectId, provider }) => {
@@ -4078,12 +4213,12 @@ function registerNotificationTools(server, api) {
4078
4213
  {
4079
4214
  description: "Send a push notification to selected users",
4080
4215
  inputSchema: {
4081
- projectId: z11.string(),
4082
- userIds: z11.array(z11.string()).min(1),
4083
- title: z11.string(),
4084
- body: z11.string(),
4085
- icon: z11.string().optional(),
4086
- url: z11.string().optional()
4216
+ projectId: z12.string(),
4217
+ userIds: z12.array(z12.string()).min(1),
4218
+ title: z12.string(),
4219
+ body: z12.string(),
4220
+ icon: z12.string().optional(),
4221
+ url: z12.string().optional()
4087
4222
  }
4088
4223
  },
4089
4224
  async ({ projectId, userIds, title, body: notifBody, icon, url }) => {
@@ -4109,11 +4244,11 @@ function registerNotificationTools(server, api) {
4109
4244
  {
4110
4245
  description: "Broadcast a push notification to all subscribed users in a project",
4111
4246
  inputSchema: {
4112
- projectId: z11.string(),
4113
- title: z11.string(),
4114
- body: z11.string(),
4115
- icon: z11.string().optional(),
4116
- url: z11.string().optional()
4247
+ projectId: z12.string(),
4248
+ title: z12.string(),
4249
+ body: z12.string(),
4250
+ icon: z12.string().optional(),
4251
+ url: z12.string().optional()
4117
4252
  }
4118
4253
  },
4119
4254
  async ({ projectId, title, body: notifBody, icon, url }) => {
@@ -4137,20 +4272,20 @@ function registerNotificationTools(server, api) {
4137
4272
  }
4138
4273
 
4139
4274
  // libs/mcp-server/src/tools/auditLogs.ts
4140
- import { z as z12 } from "zod";
4275
+ import { z as z13 } from "zod";
4141
4276
  function registerAuditLogTools(server, api) {
4142
4277
  server.registerTool(
4143
4278
  "audit_logs_list",
4144
4279
  {
4145
4280
  description: "List audit logs for a project. Filter by entity type, action, and date range.",
4146
4281
  inputSchema: {
4147
- projectId: z12.string(),
4148
- entityType: z12.enum(["user", "client", "project", "auth", "database", "storage"]).optional(),
4149
- action: z12.string().optional(),
4150
- startDate: z12.string().datetime().optional(),
4151
- endDate: z12.string().datetime().optional(),
4152
- limit: z12.number().int().min(1).max(100).optional(),
4153
- offset: z12.number().int().min(0).optional()
4282
+ projectId: z13.string(),
4283
+ entityType: z13.enum(["user", "client", "project", "auth", "database", "storage"]).optional(),
4284
+ action: z13.string().optional(),
4285
+ startDate: z13.string().datetime().optional(),
4286
+ endDate: z13.string().datetime().optional(),
4287
+ limit: z13.number().int().min(1).max(100).optional(),
4288
+ offset: z13.number().int().min(0).optional()
4154
4289
  }
4155
4290
  },
4156
4291
  async ({ projectId, entityType, action, startDate, endDate, limit, offset }) => {
@@ -4175,8 +4310,8 @@ function registerAuditLogTools(server, api) {
4175
4310
  {
4176
4311
  description: "Get a single audit log entry by ID",
4177
4312
  inputSchema: {
4178
- projectId: z12.string(),
4179
- logId: z12.string()
4313
+ projectId: z13.string(),
4314
+ logId: z13.string()
4180
4315
  }
4181
4316
  },
4182
4317
  async ({ projectId, logId }) => {
@@ -4207,13 +4342,14 @@ function registerAllTools(server, api) {
4207
4342
  registerFunctionTools(server, api);
4208
4343
  registerEmailTemplateTools(server, api);
4209
4344
  registerCronJobTools(server, api);
4345
+ registerScheduleTools(server, api);
4210
4346
  registerWebhookTools(server, api);
4211
4347
  registerNotificationTools(server, api);
4212
4348
  registerAuditLogTools(server, api);
4213
4349
  }
4214
4350
 
4215
4351
  // libs/mcp-server/src/prompts/database.ts
4216
- import { z as z13 } from "zod";
4352
+ import { z as z14 } from "zod";
4217
4353
  function registerDatabasePrompts(server) {
4218
4354
  server.registerPrompt(
4219
4355
  "setup-collection",
@@ -4221,9 +4357,9 @@ function registerDatabasePrompts(server) {
4221
4357
  title: "Setup Database Collection",
4222
4358
  description: "Guide for creating a new database collection with proper security rules. Collections MUST have rules defined before data can be inserted.",
4223
4359
  argsSchema: {
4224
- projectId: z13.string().describe("Project ID"),
4225
- collectionName: z13.string().describe("Name of the collection to create"),
4226
- access: z13.enum(["public-read", "authenticated", "admin-only"]).optional().describe("Access level (default: admin-only)")
4360
+ projectId: z14.string().describe("Project ID"),
4361
+ collectionName: z14.string().describe("Name of the collection to create"),
4362
+ access: z14.enum(["public-read", "authenticated", "admin-only"]).optional().describe("Access level (default: admin-only)")
4227
4363
  }
4228
4364
  },
4229
4365
  async ({ projectId, collectionName, access }) => {
@@ -4288,7 +4424,7 @@ function registerDatabasePrompts(server) {
4288
4424
  title: "Database Workflow Guide",
4289
4425
  description: "Explains how the Spacelr database system works: rules-first approach, collection lifecycle, and security model.",
4290
4426
  argsSchema: {
4291
- projectId: z13.string().describe("Project ID")
4427
+ projectId: z14.string().describe("Project ID")
4292
4428
  }
4293
4429
  },
4294
4430
  async ({ projectId }) => {
@@ -4337,7 +4473,7 @@ function registerDatabasePrompts(server) {
4337
4473
  }
4338
4474
 
4339
4475
  // libs/mcp-server/src/prompts/functions.ts
4340
- import { z as z14 } from "zod";
4476
+ import { z as z15 } from "zod";
4341
4477
  function registerFunctionPrompts(server) {
4342
4478
  server.registerPrompt(
4343
4479
  "deploy-function",
@@ -4345,9 +4481,9 @@ function registerFunctionPrompts(server) {
4345
4481
  title: "Deploy a Serverless Function",
4346
4482
  description: "Step-by-step guide for creating, deploying, and testing a serverless function. Covers the full lifecycle from creation to execution.",
4347
4483
  argsSchema: {
4348
- projectId: z14.string().describe("Project ID"),
4349
- name: z14.string().describe("Function name"),
4350
- useCase: z14.string().optional().describe('What the function should do (e.g. "fetch data from API and store in DB")')
4484
+ projectId: z15.string().describe("Project ID"),
4485
+ name: z15.string().describe("Function name"),
4486
+ useCase: z15.string().optional().describe('What the function should do (e.g. "fetch data from API and store in DB")')
4351
4487
  }
4352
4488
  },
4353
4489
  async ({ projectId, name, useCase }) => {