@drumbeats/mcp 0.1.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.
Files changed (120) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +130 -0
  3. package/dist/api/client.d.ts +47 -0
  4. package/dist/api/client.d.ts.map +1 -0
  5. package/dist/api/client.js +57 -0
  6. package/dist/api/client.js.map +1 -0
  7. package/dist/api/errors.d.ts +14 -0
  8. package/dist/api/errors.d.ts.map +1 -0
  9. package/dist/api/errors.js +59 -0
  10. package/dist/api/errors.js.map +1 -0
  11. package/dist/api/schemas.d.ts +14 -0
  12. package/dist/api/schemas.d.ts.map +1 -0
  13. package/dist/api/schemas.js +13 -0
  14. package/dist/api/schemas.js.map +1 -0
  15. package/dist/auth/resource-metadata.d.ts +22 -0
  16. package/dist/auth/resource-metadata.d.ts.map +1 -0
  17. package/dist/auth/resource-metadata.js +18 -0
  18. package/dist/auth/resource-metadata.js.map +1 -0
  19. package/dist/auth/scope-map.d.ts +20 -0
  20. package/dist/auth/scope-map.d.ts.map +1 -0
  21. package/dist/auth/scope-map.js +32 -0
  22. package/dist/auth/scope-map.js.map +1 -0
  23. package/dist/auth/verify-token.d.ts +29 -0
  24. package/dist/auth/verify-token.d.ts.map +1 -0
  25. package/dist/auth/verify-token.js +23 -0
  26. package/dist/auth/verify-token.js.map +1 -0
  27. package/dist/config.d.ts +16 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +32 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/server-http.d.ts +2 -0
  32. package/dist/server-http.d.ts.map +1 -0
  33. package/dist/server-http.js +83 -0
  34. package/dist/server-http.js.map +1 -0
  35. package/dist/stdio.d.ts +3 -0
  36. package/dist/stdio.d.ts.map +1 -0
  37. package/dist/stdio.js +35 -0
  38. package/dist/stdio.js.map +1 -0
  39. package/dist/tools/context/list-projects.d.ts +21 -0
  40. package/dist/tools/context/list-projects.d.ts.map +1 -0
  41. package/dist/tools/context/list-projects.js +73 -0
  42. package/dist/tools/context/list-projects.js.map +1 -0
  43. package/dist/tools/diagnostics/check-dns.d.ts +13 -0
  44. package/dist/tools/diagnostics/check-dns.d.ts.map +1 -0
  45. package/dist/tools/diagnostics/check-dns.js +25 -0
  46. package/dist/tools/diagnostics/check-dns.js.map +1 -0
  47. package/dist/tools/diagnostics/check-http.d.ts +20 -0
  48. package/dist/tools/diagnostics/check-http.d.ts.map +1 -0
  49. package/dist/tools/diagnostics/check-http.js +30 -0
  50. package/dist/tools/diagnostics/check-http.js.map +1 -0
  51. package/dist/tools/diagnostics/check-ssl.d.ts +15 -0
  52. package/dist/tools/diagnostics/check-ssl.d.ts.map +1 -0
  53. package/dist/tools/diagnostics/check-ssl.js +26 -0
  54. package/dist/tools/diagnostics/check-ssl.js.map +1 -0
  55. package/dist/tools/incidents/list-incidents.d.ts +25 -0
  56. package/dist/tools/incidents/list-incidents.d.ts.map +1 -0
  57. package/dist/tools/incidents/list-incidents.js +39 -0
  58. package/dist/tools/incidents/list-incidents.js.map +1 -0
  59. package/dist/tools/incidents/manage-incident.d.ts +19 -0
  60. package/dist/tools/incidents/manage-incident.d.ts.map +1 -0
  61. package/dist/tools/incidents/manage-incident.js +30 -0
  62. package/dist/tools/incidents/manage-incident.js.map +1 -0
  63. package/dist/tools/incidents/shared.d.ts +25 -0
  64. package/dist/tools/incidents/shared.d.ts.map +1 -0
  65. package/dist/tools/incidents/shared.js +14 -0
  66. package/dist/tools/incidents/shared.js.map +1 -0
  67. package/dist/tools/index.d.ts +5 -0
  68. package/dist/tools/index.d.ts.map +1 -0
  69. package/dist/tools/index.js +45 -0
  70. package/dist/tools/index.js.map +1 -0
  71. package/dist/tools/monitors/create-monitor.d.ts +46 -0
  72. package/dist/tools/monitors/create-monitor.d.ts.map +1 -0
  73. package/dist/tools/monitors/create-monitor.js +98 -0
  74. package/dist/tools/monitors/create-monitor.js.map +1 -0
  75. package/dist/tools/monitors/get-monitor-history.d.ts +29 -0
  76. package/dist/tools/monitors/get-monitor-history.d.ts.map +1 -0
  77. package/dist/tools/monitors/get-monitor-history.js +68 -0
  78. package/dist/tools/monitors/get-monitor-history.js.map +1 -0
  79. package/dist/tools/monitors/get-monitor.d.ts +13 -0
  80. package/dist/tools/monitors/get-monitor.d.ts.map +1 -0
  81. package/dist/tools/monitors/get-monitor.js +23 -0
  82. package/dist/tools/monitors/get-monitor.js.map +1 -0
  83. package/dist/tools/monitors/list-monitors.d.ts +13 -0
  84. package/dist/tools/monitors/list-monitors.d.ts.map +1 -0
  85. package/dist/tools/monitors/list-monitors.js +29 -0
  86. package/dist/tools/monitors/list-monitors.js.map +1 -0
  87. package/dist/tools/monitors/pause-resume.d.ts +16 -0
  88. package/dist/tools/monitors/pause-resume.d.ts.map +1 -0
  89. package/dist/tools/monitors/pause-resume.js +41 -0
  90. package/dist/tools/monitors/pause-resume.js.map +1 -0
  91. package/dist/tools/monitors/shared.d.ts +40 -0
  92. package/dist/tools/monitors/shared.d.ts.map +1 -0
  93. package/dist/tools/monitors/shared.js +21 -0
  94. package/dist/tools/monitors/shared.js.map +1 -0
  95. package/dist/tools/monitors/update-monitor.d.ts +50 -0
  96. package/dist/tools/monitors/update-monitor.d.ts.map +1 -0
  97. package/dist/tools/monitors/update-monitor.js +75 -0
  98. package/dist/tools/monitors/update-monitor.js.map +1 -0
  99. package/dist/tools/result.d.ts +8 -0
  100. package/dist/tools/result.d.ts.map +1 -0
  101. package/dist/tools/result.js +13 -0
  102. package/dist/tools/result.js.map +1 -0
  103. package/dist/tools/types.d.ts +13 -0
  104. package/dist/tools/types.d.ts.map +1 -0
  105. package/dist/tools/types.js +2 -0
  106. package/dist/tools/types.js.map +1 -0
  107. package/dist/tools/uptime/get-uptime-summary.d.ts +15 -0
  108. package/dist/tools/uptime/get-uptime-summary.d.ts.map +1 -0
  109. package/dist/tools/uptime/get-uptime-summary.js +69 -0
  110. package/dist/tools/uptime/get-uptime-summary.js.map +1 -0
  111. package/dist/tools/validation.d.ts +5 -0
  112. package/dist/tools/validation.d.ts.map +1 -0
  113. package/dist/tools/validation.js +7 -0
  114. package/dist/tools/validation.js.map +1 -0
  115. package/dist/version.d.ts +3 -0
  116. package/dist/version.d.ts.map +1 -0
  117. package/dist/version.js +7 -0
  118. package/dist/version.js.map +1 -0
  119. package/manifest.json +35 -0
  120. package/package.json +64 -0
@@ -0,0 +1,41 @@
1
+ import { z } from 'zod';
2
+ import { toToolErrorResult } from '../../api/errors.js';
3
+ import { jsonResult } from '../result.js';
4
+ import { toMonitorSummary } from './shared.js';
5
+ export const pauseResumeInputShape = {
6
+ monitor_id: z.string().min(1).describe('The monitor id (from list_monitors).'),
7
+ };
8
+ async function transition(ctx, monitorId, action) {
9
+ try {
10
+ const body = await ctx.api.request({
11
+ method: 'POST',
12
+ path: `/v1/monitors/${encodeURIComponent(monitorId)}/${action}`,
13
+ });
14
+ const monitor = body.monitor ?? body;
15
+ return jsonResult({ monitor: toMonitorSummary(monitor) });
16
+ }
17
+ catch (error) {
18
+ return toToolErrorResult(error);
19
+ }
20
+ }
21
+ export function pauseMonitor(ctx, args) {
22
+ return transition(ctx, args.monitor_id, 'pause');
23
+ }
24
+ export function resumeMonitor(ctx, args) {
25
+ return transition(ctx, args.monitor_id, 'resume');
26
+ }
27
+ export function registerPauseMonitor(server, ctx) {
28
+ server.registerTool('pause_monitor', {
29
+ title: 'Pause monitor',
30
+ description: 'Pause a monitor by id. It stops running checks and sending alerts until resumed.',
31
+ inputSchema: pauseResumeInputShape,
32
+ }, (args) => pauseMonitor(ctx, args));
33
+ }
34
+ export function registerResumeMonitor(server, ctx) {
35
+ server.registerTool('resume_monitor', {
36
+ title: 'Resume monitor',
37
+ description: 'Resume a paused monitor by id.',
38
+ inputSchema: pauseResumeInputShape,
39
+ }, (args) => resumeMonitor(ctx, args));
40
+ }
41
+ //# sourceMappingURL=pause-resume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pause-resume.js","sourceRoot":"","sources":["../../../src/tools/monitors/pause-resume.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,OAAO,EAAmB,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE/D,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,sCAAsC,CAAC;CAC/E,CAAA;AAID,KAAK,UAAU,UAAU,CAAC,GAAgB,EAAE,SAAiB,EAAE,MAA0B;IACvF,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAA2B;YAC3D,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,gBAAgB,kBAAkB,CAAC,SAAS,CAAC,IAAI,MAAM,EAAE;SAChE,CAAC,CAAA;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAK,IAA8B,CAAA;QAC/D,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC3D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAA;IACjC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAgB,EAAE,IAAqB;IAClE,OAAO,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;AAClD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAgB,EAAE,IAAqB;IACnE,OAAO,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;AACnD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,GAAgB;IACtE,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,kFAAkF;QAC/F,WAAW,EAAE,qBAAqB;KACnC,EACD,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAClC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,GAAgB;IACvE,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,gCAAgC;QAC7C,WAAW,EAAE,qBAAqB;KACnC,EACD,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CACnC,CAAA;AACH,CAAC"}
@@ -0,0 +1,40 @@
1
+ export interface RawMonitor {
2
+ id: string;
3
+ project_id?: string | null;
4
+ type?: string | null;
5
+ name: string;
6
+ slug?: string | null;
7
+ description?: string | null;
8
+ tags?: string[] | null;
9
+ status?: string | null;
10
+ timezone?: string | null;
11
+ grace_period_seconds?: number | null;
12
+ alert_enabled?: boolean | null;
13
+ total_pings_received?: number | null;
14
+ consecutive_failures?: number | null;
15
+ last_success_at?: string | null;
16
+ next_expected_at?: string | null;
17
+ created_at?: string | null;
18
+ updated_at?: string | null;
19
+ }
20
+ /** Concise, model-facing monitor view. */
21
+ export interface MonitorSummary {
22
+ id: string;
23
+ name: string;
24
+ type: string | null;
25
+ status: string | null;
26
+ slug: string | null;
27
+ project_id: string | null;
28
+ description: string | null;
29
+ tags: string[];
30
+ timezone: string | null;
31
+ grace_period_seconds: number | null;
32
+ alert_enabled: boolean | null;
33
+ total_pings_received: number | null;
34
+ consecutive_failures: number | null;
35
+ last_success_at: string | null;
36
+ next_expected_at: string | null;
37
+ created_at: string | null;
38
+ }
39
+ export declare function toMonitorSummary(monitor: RawMonitor): MonitorSummary;
40
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/tools/monitors/shared.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC,aAAa,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IAC9B,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED,0CAA0C;AAC1C,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,aAAa,EAAE,OAAO,GAAG,IAAI,CAAA;IAC7B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,cAAc,CAmBpE"}
@@ -0,0 +1,21 @@
1
+ export function toMonitorSummary(monitor) {
2
+ return {
3
+ id: monitor.id,
4
+ name: monitor.name,
5
+ type: monitor.type ?? null,
6
+ status: monitor.status ?? null,
7
+ slug: monitor.slug ?? null,
8
+ project_id: monitor.project_id ?? null,
9
+ description: monitor.description ?? null,
10
+ tags: monitor.tags ?? [],
11
+ timezone: monitor.timezone ?? null,
12
+ grace_period_seconds: monitor.grace_period_seconds ?? null,
13
+ alert_enabled: monitor.alert_enabled ?? null,
14
+ total_pings_received: monitor.total_pings_received ?? null,
15
+ consecutive_failures: monitor.consecutive_failures ?? null,
16
+ last_success_at: monitor.last_success_at ?? null,
17
+ next_expected_at: monitor.next_expected_at ?? null,
18
+ created_at: monitor.created_at ?? null,
19
+ };
20
+ }
21
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/tools/monitors/shared.ts"],"names":[],"mappings":"AAyCA,MAAM,UAAU,gBAAgB,CAAC,OAAmB;IAClD,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;QAC1B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;QAC9B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;QAC1B,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;QACtC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;QACxC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;QACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI;QAClC,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,IAAI,IAAI;QAC1D,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,IAAI;QAC5C,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,IAAI,IAAI;QAC1D,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,IAAI,IAAI;QAC1D,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,IAAI;QAChD,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,IAAI;QAClD,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;KACvC,CAAA;AACH,CAAC"}
@@ -0,0 +1,50 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
3
+ import { z } from 'zod';
4
+ import type { ToolContext } from '../types.js';
5
+ export declare const updateMonitorInputShape: {
6
+ monitor_id: z.ZodString;
7
+ name: z.ZodOptional<z.ZodString>;
8
+ type: z.ZodOptional<z.ZodEnum<{
9
+ JOB_BASIC: "JOB_BASIC";
10
+ JOB_CRON: "JOB_CRON";
11
+ JOB_HEARTBEAT: "JOB_HEARTBEAT";
12
+ UPTIME_HTTP: "UPTIME_HTTP";
13
+ }>>;
14
+ slug: z.ZodOptional<z.ZodString>;
15
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
16
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
17
+ schedule: z.ZodOptional<z.ZodString>;
18
+ timezone: z.ZodOptional<z.ZodString>;
19
+ grace_period_seconds: z.ZodOptional<z.ZodNumber>;
20
+ schedule_tolerance: z.ZodOptional<z.ZodNumber>;
21
+ failure_tolerance: z.ZodOptional<z.ZodNumber>;
22
+ min_duration_seconds: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
23
+ max_duration_seconds: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
24
+ alert_surge_threshold: z.ZodOptional<z.ZodNumber>;
25
+ alert_enabled: z.ZodOptional<z.ZodBoolean>;
26
+ retention_count: z.ZodOptional<z.ZodNumber>;
27
+ notification_group_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
28
+ notification_channel_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
29
+ status: z.ZodOptional<z.ZodEnum<{
30
+ UP: "UP";
31
+ PAUSED: "PAUSED";
32
+ }>>;
33
+ uptime_url: z.ZodOptional<z.ZodString>;
34
+ uptime_method: z.ZodOptional<z.ZodEnum<{
35
+ GET: "GET";
36
+ POST: "POST";
37
+ HEAD: "HEAD";
38
+ }>>;
39
+ uptime_expected_status: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
40
+ uptime_keyword: z.ZodOptional<z.ZodNullable<z.ZodString>>;
41
+ uptime_keyword_absent: z.ZodOptional<z.ZodBoolean>;
42
+ uptime_headers: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodString>>>;
43
+ uptime_timeout_ms: z.ZodOptional<z.ZodNumber>;
44
+ uptime_follow_redirects: z.ZodOptional<z.ZodBoolean>;
45
+ uptime_request_body: z.ZodOptional<z.ZodNullable<z.ZodString>>;
46
+ uptime_verify_ssl: z.ZodOptional<z.ZodBoolean>;
47
+ };
48
+ export declare function updateMonitor(ctx: ToolContext, args: Record<string, unknown>): Promise<CallToolResult>;
49
+ export declare function registerUpdateMonitor(server: McpServer, ctx: ToolContext): void;
50
+ //# sourceMappingURL=update-monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-monitor.d.ts","sourceRoot":"","sources":["../../../src/tools/monitors/update-monitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAA;AACxE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAO9C,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCnC,CAAA;AAMD,wBAAsB,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CA2B5G;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAM/E"}
@@ -0,0 +1,75 @@
1
+ import { z } from 'zod';
2
+ import { toToolErrorResult } from '../../api/errors.js';
3
+ import { errorResult, jsonResult } from '../result.js';
4
+ import { toMonitorSummary } from './shared.js';
5
+ const UUID_RE = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
6
+ const uuid = () => z.string().regex(UUID_RE, 'must be a UUID');
7
+ const httpUrl = z.string().refine((value) => URL.canParse(value), { message: 'must be a valid URL' });
8
+ export const updateMonitorInputShape = {
9
+ monitor_id: z.string().min(1).describe('The monitor id to update (from list_monitors).'),
10
+ name: z.string().min(1).max(100).optional(),
11
+ type: z.enum(['JOB_BASIC', 'JOB_CRON', 'JOB_HEARTBEAT', 'UPTIME_HTTP']).optional(),
12
+ slug: z
13
+ .string()
14
+ .regex(/^[a-z0-9-]+$/, 'lowercase letters, numbers, and hyphens only')
15
+ .max(50)
16
+ .optional(),
17
+ description: z.string().max(500).nullable().optional(),
18
+ tags: z.array(z.string().max(50)).max(10).optional(),
19
+ schedule: z.string().min(1).optional(),
20
+ timezone: z.string().optional(),
21
+ grace_period_seconds: z.number().int().min(0).optional(),
22
+ schedule_tolerance: z.number().int().min(1).optional(),
23
+ failure_tolerance: z.number().int().min(1).optional(),
24
+ min_duration_seconds: z.number().int().min(1).nullable().optional(),
25
+ max_duration_seconds: z.number().int().min(1).nullable().optional(),
26
+ alert_surge_threshold: z.number().int().min(1).optional(),
27
+ alert_enabled: z.boolean().optional(),
28
+ retention_count: z.number().int().min(10).max(1000).optional(),
29
+ notification_group_ids: z.array(uuid()).optional(),
30
+ notification_channel_ids: z.array(uuid()).optional(),
31
+ status: z.enum(['UP', 'PAUSED']).optional(),
32
+ uptime_url: httpUrl.optional(),
33
+ uptime_method: z.enum(['GET', 'HEAD', 'POST']).optional(),
34
+ uptime_expected_status: z.array(z.number().int().min(100).max(599)).optional(),
35
+ uptime_keyword: z.string().max(1024).nullable().optional(),
36
+ uptime_keyword_absent: z.boolean().optional(),
37
+ uptime_headers: z.record(z.string(), z.string()).nullable().optional(),
38
+ uptime_timeout_ms: z.number().int().min(1000).max(30000).optional(),
39
+ uptime_follow_redirects: z.boolean().optional(),
40
+ uptime_request_body: z.string().max(10000).nullable().optional(),
41
+ uptime_verify_ssl: z.boolean().optional(),
42
+ };
43
+ const DESCRIPTION = 'Update an existing Drumbeats monitor. Provide monitor_id plus only the fields to change. Set status to ' +
44
+ 'PAUSED or UP to pause/resume (or use pause_monitor / resume_monitor). The uptime_* fields apply to UPTIME_HTTP monitors.';
45
+ export async function updateMonitor(ctx, args) {
46
+ const monitorId = typeof args.monitor_id === 'string' ? args.monitor_id : '';
47
+ if (monitorId.length === 0) {
48
+ return errorResult('monitor_id is required.');
49
+ }
50
+ const patch = {};
51
+ for (const [key, value] of Object.entries(args)) {
52
+ if (key !== 'monitor_id' && value !== undefined) {
53
+ patch[key] = value;
54
+ }
55
+ }
56
+ if (Object.keys(patch).length === 0) {
57
+ return errorResult('Provide at least one field to update.');
58
+ }
59
+ try {
60
+ const body = await ctx.api.request({
61
+ method: 'PATCH',
62
+ path: `/v1/monitors/${encodeURIComponent(monitorId)}`,
63
+ body: patch,
64
+ });
65
+ const monitor = body.monitor ?? body;
66
+ return jsonResult({ monitor: toMonitorSummary(monitor) });
67
+ }
68
+ catch (error) {
69
+ return toToolErrorResult(error);
70
+ }
71
+ }
72
+ export function registerUpdateMonitor(server, ctx) {
73
+ server.registerTool('update_monitor', { title: 'Update monitor', description: DESCRIPTION, inputSchema: updateMonitorInputShape }, (args) => updateMonitor(ctx, args));
74
+ }
75
+ //# sourceMappingURL=update-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-monitor.js","sourceRoot":"","sources":["../../../src/tools/monitors/update-monitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
+ /** Wraps a value as a successful MCP tool-result with a single JSON text block. */
3
+ export declare function jsonResult(data: unknown): CallToolResult;
4
+ /** A successful tool-result carrying a single plain-text block. */
5
+ export declare function textResult(message: string): CallToolResult;
6
+ /** A tool-result carrying a short human-readable error message. */
7
+ export declare function errorResult(message: string): CallToolResult;
8
+ //# sourceMappingURL=result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/tools/result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAA;AAExE,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,CAExD;AAED,mEAAmE;AACnE,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAE1D;AAED,mEAAmE;AACnE,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAE3D"}
@@ -0,0 +1,13 @@
1
+ /** Wraps a value as a successful MCP tool-result with a single JSON text block. */
2
+ export function jsonResult(data) {
3
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
4
+ }
5
+ /** A successful tool-result carrying a single plain-text block. */
6
+ export function textResult(message) {
7
+ return { content: [{ type: 'text', text: message }] };
8
+ }
9
+ /** A tool-result carrying a short human-readable error message. */
10
+ export function errorResult(message) {
11
+ return { content: [{ type: 'text', text: message }], isError: true };
12
+ }
13
+ //# sourceMappingURL=result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/tools/result.ts"],"names":[],"mappings":"AAEA,mFAAmF;AACnF,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;AAC7E,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAA;AACvD,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;AACtE,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ApiClient } from '../api/client.js';
3
+ /**
4
+ * Everything a tool handler needs, independent of how the request arrived
5
+ * (stdio vs hosted HTTP) or how the user authenticated. Handlers only ever
6
+ * touch `ctx.api` — the already-authenticated Drumbeats REST client.
7
+ */
8
+ export interface ToolContext {
9
+ readonly api: ApiClient;
10
+ }
11
+ /** A single tool's self-registration against the MCP server. */
12
+ export type ToolRegistration = (server: McpServer, ctx: ToolContext) => void;
13
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEjD;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAA;CACxB;AAED,gEAAgE;AAChE,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,KAAK,IAAI,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
3
+ import { z } from 'zod';
4
+ import type { ToolContext } from '../types.js';
5
+ export declare const getUptimeSummaryInputShape: {
6
+ project_id: z.ZodString;
7
+ period_hours: z.ZodOptional<z.ZodNumber>;
8
+ };
9
+ export type GetUptimeSummaryArgs = {
10
+ project_id: string;
11
+ period_hours?: number;
12
+ };
13
+ export declare function getUptimeSummary(ctx: ToolContext, args: GetUptimeSummaryArgs): Promise<CallToolResult>;
14
+ export declare function registerGetUptimeSummary(server: McpServer, ctx: ToolContext): void;
15
+ //# sourceMappingURL=get-uptime-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-uptime-summary.d.ts","sourceRoot":"","sources":["../../../src/tools/uptime/get-uptime-summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAA;AACxE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAI9C,eAAO,MAAM,0BAA0B;;;CAStC,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAuEhF,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CAU5G;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAMlF"}
@@ -0,0 +1,69 @@
1
+ import { z } from 'zod';
2
+ import { toToolErrorResult } from '../../api/errors.js';
3
+ import { textResult } from '../result.js';
4
+ const MAX_PERIOD_HOURS = 2160; // 90 days
5
+ export const getUptimeSummaryInputShape = {
6
+ project_id: z.string().min(1).describe('The project to summarize uptime for (from list_projects).'),
7
+ period_hours: z
8
+ .number()
9
+ .int()
10
+ .positive()
11
+ .max(MAX_PERIOD_HOURS)
12
+ .optional()
13
+ .describe('Look-back window in hours (default 24). Use 720 for roughly "this month".'),
14
+ };
15
+ const DESCRIPTION = "Get the project-level uptime / SLA summary across all of a project's uptime monitors: overall uptime " +
16
+ 'percentage plus per-monitor uptime, check counts, and response times over a look-back window. ' +
17
+ 'The answer to "what is my uptime this month?".';
18
+ function formatPercent(value) {
19
+ return typeof value === 'number' ? `${value}%` : 'n/a';
20
+ }
21
+ /** Renders the rollup as a short, readable answer rather than raw JSON. */
22
+ function formatUptimeSummary(summary) {
23
+ const periodHours = summary.period_hours ?? 24;
24
+ const lines = [];
25
+ const overall = summary.overall;
26
+ if (overall) {
27
+ lines.push(`Overall uptime over the last ${periodHours}h: ${formatPercent(overall.uptime_percentage)} ` +
28
+ `(${overall.up_count ?? 0} of ${overall.total_checks ?? 0} checks up, ${overall.down_count ?? 0} down).`);
29
+ }
30
+ else {
31
+ lines.push(`Uptime over the last ${periodHours}h:`);
32
+ }
33
+ const monitors = summary.monitors ?? [];
34
+ if (monitors.length === 0) {
35
+ lines.push('This project has no uptime monitors.');
36
+ return lines.join('\n');
37
+ }
38
+ lines.push('Per monitor:');
39
+ for (const monitor of monitors) {
40
+ const parts = [
41
+ formatPercent(monitor.uptime_percentage),
42
+ `${monitor.up_count ?? 0}/${monitor.total_checks ?? 0} checks`,
43
+ ];
44
+ if (typeof monitor.avg_ms === 'number') {
45
+ parts.push(`avg ${monitor.avg_ms}ms`);
46
+ }
47
+ if (typeof monitor.p95_ms === 'number') {
48
+ parts.push(`p95 ${monitor.p95_ms}ms`);
49
+ }
50
+ lines.push(`- ${monitor.name ?? monitor.monitor_id ?? 'monitor'}: ${parts.join(', ')}`);
51
+ }
52
+ return lines.join('\n');
53
+ }
54
+ export async function getUptimeSummary(ctx, args) {
55
+ try {
56
+ const summary = await ctx.api.request({
57
+ path: `/v1/projects/${encodeURIComponent(args.project_id)}/uptime-summary`,
58
+ query: { period_hours: args.period_hours },
59
+ });
60
+ return textResult(formatUptimeSummary(summary));
61
+ }
62
+ catch (error) {
63
+ return toToolErrorResult(error);
64
+ }
65
+ }
66
+ export function registerGetUptimeSummary(server, ctx) {
67
+ server.registerTool('get_uptime_summary', { title: 'Get uptime summary', description: DESCRIPTION, inputSchema: getUptimeSummaryInputShape }, (args) => getUptimeSummary(ctx, args));
68
+ }
69
+ //# sourceMappingURL=get-uptime-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-uptime-summary.js","sourceRoot":"","sources":["../../../src/tools/uptime/get-uptime-summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
+ import type { ZodError } from 'zod';
3
+ /** Formats a zod validation failure into a clear, model-facing tool error. */
4
+ export declare function zodErrorResult(toolName: string, error: ZodError): CallToolResult;
5
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/tools/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAA;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAA;AAGnC,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,cAAc,CAGhF"}
@@ -0,0 +1,7 @@
1
+ import { errorResult } from './result.js';
2
+ /** Formats a zod validation failure into a clear, model-facing tool error. */
3
+ export function zodErrorResult(toolName, error) {
4
+ const detail = error.issues.map((issue) => `${issue.path.join('.') || '(root)'}: ${issue.message}`).join('; ');
5
+ return errorResult(`Invalid ${toolName} arguments: ${detail}`);
6
+ }
7
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/tools/validation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,8EAA8E;AAC9E,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,KAAe;IAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC9G,OAAO,WAAW,CAAC,WAAW,QAAQ,eAAe,MAAM,EAAE,CAAC,CAAA;AAChE,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const SERVER_NAME: string;
2
+ export declare const SERVER_VERSION: string;
3
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,WAAW,QAAW,CAAA;AACnC,eAAO,MAAM,cAAc,QAAc,CAAA"}
@@ -0,0 +1,7 @@
1
+ import { createRequire } from 'node:module';
2
+ // Read name/version from the package manifest so they never drift from npm.
3
+ // At runtime this file lives in dist/, so ../package.json is the package root.
4
+ const pkg = createRequire(import.meta.url)('../package.json');
5
+ export const SERVER_NAME = pkg.name;
6
+ export const SERVER_VERSION = pkg.version;
7
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAO3C,4EAA4E;AAC5E,+EAA+E;AAC/E,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAoB,CAAA;AAEhF,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,CAAA;AACnC,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAA"}
package/manifest.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "dxt_version": "0.1",
3
+ "name": "drumbeats-mcp",
4
+ "display_name": "Drumbeats",
5
+ "version": "0.1.0",
6
+ "description": "Operate your Drumbeats monitoring from any AI client — create monitors, triage incidents, and run HTTP/SSL/DNS checks in natural language.",
7
+ "author": {
8
+ "name": "Lucky S Software",
9
+ "url": "https://luckys.dev"
10
+ },
11
+ "homepage": "https://drumbeats.io",
12
+ "documentation": "https://github.com/drumbeats-io/mcp",
13
+ "license": "Apache-2.0",
14
+ "server": {
15
+ "type": "node",
16
+ "entry_point": "dist/stdio.js",
17
+ "mcp_config": {
18
+ "command": "node",
19
+ "args": ["${__dirname}/dist/stdio.js"],
20
+ "env": {
21
+ "DRUMBEATS_API_KEY": "${user_config.api_key}"
22
+ }
23
+ }
24
+ },
25
+ "user_config": {
26
+ "api_key": {
27
+ "type": "string",
28
+ "title": "Drumbeats API key",
29
+ "description": "An account-scoped Drumbeats API key (dk_…). Create one in your Drumbeats account settings.",
30
+ "sensitive": true,
31
+ "required": true
32
+ }
33
+ },
34
+ "tools": []
35
+ }
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@drumbeats/mcp",
3
+ "version": "0.1.0",
4
+ "description": "Official Model Context Protocol (MCP) server for Drumbeats — operate your monitoring from any AI client: create monitors, triage incidents, and run HTTP/SSL/DNS checks in natural language.",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "author": "Lucky S Software (https://luckys.dev)",
8
+ "homepage": "https://drumbeats.io",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/drumbeats-io/mcp.git"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/drumbeats-io/mcp/issues"
15
+ },
16
+ "keywords": [
17
+ "mcp",
18
+ "model-context-protocol",
19
+ "drumbeats",
20
+ "monitoring",
21
+ "uptime",
22
+ "cron",
23
+ "heartbeat",
24
+ "observability",
25
+ "ai",
26
+ "llm"
27
+ ],
28
+ "bin": {
29
+ "drumbeats-mcp": "dist/stdio.js"
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "manifest.json"
34
+ ],
35
+ "engines": {
36
+ "node": ">=22 <23"
37
+ },
38
+ "publishConfig": {
39
+ "access": "public"
40
+ },
41
+ "scripts": {
42
+ "build": "tsc -p tsconfig.json",
43
+ "typecheck": "tsc -p tsconfig.json --noEmit",
44
+ "lint": "biome check .",
45
+ "lint:fix": "biome check --write .",
46
+ "format": "biome format --write .",
47
+ "test": "vitest run",
48
+ "test:watch": "vitest",
49
+ "start": "node dist/server-http.js",
50
+ "start:stdio": "node dist/stdio.js"
51
+ },
52
+ "dependencies": {
53
+ "@modelcontextprotocol/sdk": "^1.29.0",
54
+ "express": "^5.1.0",
55
+ "zod": "^4.4.3"
56
+ },
57
+ "devDependencies": {
58
+ "@biomejs/biome": "^2.3.5",
59
+ "@types/express": "^5.0.5",
60
+ "@types/node": "^22.19.21",
61
+ "typescript": "^6.0.3",
62
+ "vitest": "^4.1.9"
63
+ }
64
+ }