@novu/api 0.5.0 → 0.6.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 (225) hide show
  1. package/README.md +97 -64
  2. package/bin/mcp-server.js +223 -173
  3. package/bin/mcp-server.js.map +65 -64
  4. package/docs/sdks/authentication/README.md +17 -17
  5. package/docs/sdks/integrations/README.md +55 -55
  6. package/docs/sdks/novu/README.md +146 -146
  7. package/docs/sdks/novumessages/README.md +34 -34
  8. package/docs/sdks/stats/README.md +14 -14
  9. package/docs/sdks/subscribers/README.md +82 -82
  10. package/jsr.json +1 -1
  11. package/lib/config.d.ts +3 -3
  12. package/lib/config.js +3 -3
  13. package/lib/sdks.d.ts.map +1 -1
  14. package/lib/sdks.js +2 -8
  15. package/lib/sdks.js.map +1 -1
  16. package/lib/security.d.ts +4 -3
  17. package/lib/security.d.ts.map +1 -1
  18. package/lib/security.js +6 -1
  19. package/lib/security.js.map +1 -1
  20. package/mcp-server/extensions.d.ts +11 -0
  21. package/mcp-server/extensions.d.ts.map +1 -0
  22. package/mcp-server/extensions.js +6 -0
  23. package/mcp-server/extensions.js.map +1 -0
  24. package/mcp-server/mcp-server.js +1 -1
  25. package/mcp-server/prompts.d.ts +26 -0
  26. package/mcp-server/prompts.d.ts.map +1 -0
  27. package/mcp-server/prompts.js +48 -0
  28. package/mcp-server/prompts.js.map +1 -0
  29. package/mcp-server/resources.d.ts +9 -4
  30. package/mcp-server/resources.d.ts.map +1 -1
  31. package/mcp-server/resources.js +38 -10
  32. package/mcp-server/resources.js.map +1 -1
  33. package/mcp-server/server.d.ts.map +1 -1
  34. package/mcp-server/server.js +31 -24
  35. package/mcp-server/server.js.map +1 -1
  36. package/mcp-server/tools/integrationsCreate.js +1 -1
  37. package/mcp-server/tools/integrationsDelete.js +1 -1
  38. package/mcp-server/tools/integrationsList.js +1 -1
  39. package/mcp-server/tools/integrationsListActive.js +1 -1
  40. package/mcp-server/tools/integrationsSetAsPrimary.js +1 -1
  41. package/mcp-server/tools/integrationsUpdate.js +1 -1
  42. package/mcp-server/tools/integrationsWebhooksRetrieve.js +1 -1
  43. package/mcp-server/tools/messagesDelete.js +1 -1
  44. package/mcp-server/tools/messagesDeleteByTransactionId.js +1 -1
  45. package/mcp-server/tools/messagesRetrieve.js +1 -1
  46. package/mcp-server/tools/notificationsList.js +1 -1
  47. package/mcp-server/tools/notificationsRetrieve.js +1 -1
  48. package/mcp-server/tools/notificationsStatsGraph.js +1 -1
  49. package/mcp-server/tools/notificationsStatsRetrieve.js +1 -1
  50. package/mcp-server/tools/subscribersAuthenticationChatAccessOauth.js +1 -1
  51. package/mcp-server/tools/subscribersAuthenticationChatAccessOauthCallBack.js +1 -1
  52. package/mcp-server/tools/subscribersCreate.js +1 -1
  53. package/mcp-server/tools/subscribersCreateBulk.js +1 -1
  54. package/mcp-server/tools/subscribersCredentialsAppend.js +1 -1
  55. package/mcp-server/tools/subscribersCredentialsDelete.js +1 -1
  56. package/mcp-server/tools/subscribersCredentialsUpdate.js +1 -1
  57. package/mcp-server/tools/subscribersDelete.js +1 -1
  58. package/mcp-server/tools/subscribersList.js +1 -1
  59. package/mcp-server/tools/subscribersMessagesMarkAll.js +1 -1
  60. package/mcp-server/tools/subscribersMessagesMarkAllAs.js +1 -1
  61. package/mcp-server/tools/subscribersMessagesUpdateAsSeen.js +1 -1
  62. package/mcp-server/tools/subscribersNotificationsFeed.js +1 -1
  63. package/mcp-server/tools/subscribersNotificationsUnseenCount.js +1 -1
  64. package/mcp-server/tools/subscribersPatch.js +1 -1
  65. package/mcp-server/tools/subscribersPreferencesList.js +1 -1
  66. package/mcp-server/tools/subscribersPreferencesUpdate.js +1 -1
  67. package/mcp-server/tools/subscribersPropertiesUpdateOnlineFlag.js +1 -1
  68. package/mcp-server/tools/subscribersRetrieve.js +1 -1
  69. package/mcp-server/tools/subscribersSearch.js +1 -1
  70. package/mcp-server/tools/topicsCreate.js +1 -1
  71. package/mcp-server/tools/topicsDelete.js +1 -1
  72. package/mcp-server/tools/topicsList.js +1 -1
  73. package/mcp-server/tools/topicsRename.js +1 -1
  74. package/mcp-server/tools/topicsRetrieve.js +1 -1
  75. package/mcp-server/tools/topicsSubscribersAssign.js +1 -1
  76. package/mcp-server/tools/topicsSubscribersRemove.js +1 -1
  77. package/mcp-server/tools/topicsSubscribersRetrieve.js +1 -1
  78. package/mcp-server/tools.d.ts.map +1 -1
  79. package/mcp-server/tools.js +4 -0
  80. package/mcp-server/tools.js.map +1 -1
  81. package/models/components/activitynotificationjobresponsedto.d.ts +9 -0
  82. package/models/components/activitynotificationjobresponsedto.d.ts.map +1 -1
  83. package/models/components/activitynotificationjobresponsedto.js +2 -0
  84. package/models/components/activitynotificationjobresponsedto.js.map +1 -1
  85. package/models/components/channelsettingsdto.d.ts +8 -8
  86. package/models/components/channelsettingsdto.d.ts.map +1 -1
  87. package/models/components/channelsettingsdto.js +14 -13
  88. package/models/components/channelsettingsdto.js.map +1 -1
  89. package/models/components/index.d.ts +0 -1
  90. package/models/components/index.d.ts.map +1 -1
  91. package/models/components/index.js +0 -1
  92. package/models/components/index.js.map +1 -1
  93. package/models/components/integrationresponsedto.d.ts +8 -8
  94. package/models/components/integrationresponsedto.d.ts.map +1 -1
  95. package/models/components/integrationresponsedto.js +13 -14
  96. package/models/components/integrationresponsedto.js.map +1 -1
  97. package/models/components/markallmessageasrequestdto.d.ts +8 -8
  98. package/models/components/markallmessageasrequestdto.d.ts.map +1 -1
  99. package/models/components/markallmessageasrequestdto.js +14 -13
  100. package/models/components/markallmessageasrequestdto.js.map +1 -1
  101. package/models/components/messagemarkasrequestdto.d.ts +8 -8
  102. package/models/components/messagemarkasrequestdto.d.ts.map +1 -1
  103. package/models/components/messagemarkasrequestdto.js +13 -14
  104. package/models/components/messagemarkasrequestdto.js.map +1 -1
  105. package/models/components/overrides.d.ts +8 -8
  106. package/models/components/overrides.d.ts.map +1 -1
  107. package/models/components/overrides.js +14 -13
  108. package/models/components/overrides.js.map +1 -1
  109. package/models/components/patchsubscriberrequestdto.d.ts +15 -15
  110. package/models/components/patchsubscriberrequestdto.d.ts.map +1 -1
  111. package/models/components/patchsubscriberrequestdto.js +19 -20
  112. package/models/components/patchsubscriberrequestdto.js.map +1 -1
  113. package/models/components/subscriberchanneldto.d.ts +8 -8
  114. package/models/components/subscriberchanneldto.d.ts.map +1 -1
  115. package/models/components/subscriberchanneldto.js +13 -14
  116. package/models/components/subscriberchanneldto.js.map +1 -1
  117. package/models/components/subscriberpayloaddto.d.ts +13 -13
  118. package/models/components/subscriberpayloaddto.d.ts.map +1 -1
  119. package/models/components/subscriberpayloaddto.js +16 -17
  120. package/models/components/subscriberpayloaddto.js.map +1 -1
  121. package/models/operations/eventscontrollercancel.d.ts +2 -3
  122. package/models/operations/eventscontrollercancel.d.ts.map +1 -1
  123. package/models/operations/eventscontrollercancel.js +2 -3
  124. package/models/operations/eventscontrollercancel.js.map +1 -1
  125. package/models/operations/notificationscontrollerlistnotifications.d.ts +2 -2
  126. package/package.json +1 -1
  127. package/sdk/authentication.d.ts +4 -4
  128. package/sdk/authentication.d.ts.map +1 -1
  129. package/sdk/authentication.js +6 -6
  130. package/sdk/authentication.js.map +1 -1
  131. package/sdk/integrations.d.ts +7 -7
  132. package/sdk/integrations.d.ts.map +1 -1
  133. package/sdk/integrations.js +9 -9
  134. package/sdk/integrations.js.map +1 -1
  135. package/sdk/novumessages.d.ts +4 -4
  136. package/sdk/novumessages.d.ts.map +1 -1
  137. package/sdk/novumessages.js +6 -6
  138. package/sdk/novumessages.js.map +1 -1
  139. package/sdk/sdk.d.ts +12 -12
  140. package/sdk/sdk.d.ts.map +1 -1
  141. package/sdk/sdk.js +15 -15
  142. package/sdk/sdk.js.map +1 -1
  143. package/sdk/stats.d.ts +4 -4
  144. package/sdk/stats.d.ts.map +1 -1
  145. package/sdk/stats.js +6 -6
  146. package/sdk/stats.js.map +1 -1
  147. package/sdk/subscribers.d.ts +26 -26
  148. package/sdk/subscribers.d.ts.map +1 -1
  149. package/sdk/subscribers.js +29 -29
  150. package/sdk/subscribers.js.map +1 -1
  151. package/sources/json-development.json +1146 -1148
  152. package/src/lib/config.ts +3 -3
  153. package/src/lib/sdks.ts +2 -7
  154. package/src/lib/security.ts +11 -3
  155. package/src/mcp-server/extensions.ts +17 -0
  156. package/src/mcp-server/mcp-server.ts +1 -1
  157. package/src/mcp-server/prompts.ts +110 -0
  158. package/src/mcp-server/resources.ts +76 -14
  159. package/src/mcp-server/server.ts +41 -24
  160. package/src/mcp-server/tools/integrationsCreate.ts +1 -1
  161. package/src/mcp-server/tools/integrationsDelete.ts +1 -1
  162. package/src/mcp-server/tools/integrationsList.ts +1 -1
  163. package/src/mcp-server/tools/integrationsListActive.ts +1 -1
  164. package/src/mcp-server/tools/integrationsSetAsPrimary.ts +1 -1
  165. package/src/mcp-server/tools/integrationsUpdate.ts +1 -1
  166. package/src/mcp-server/tools/integrationsWebhooksRetrieve.ts +1 -1
  167. package/src/mcp-server/tools/messagesDelete.ts +1 -1
  168. package/src/mcp-server/tools/messagesDeleteByTransactionId.ts +1 -1
  169. package/src/mcp-server/tools/messagesRetrieve.ts +1 -1
  170. package/src/mcp-server/tools/notificationsList.ts +1 -1
  171. package/src/mcp-server/tools/notificationsRetrieve.ts +1 -1
  172. package/src/mcp-server/tools/notificationsStatsGraph.ts +1 -1
  173. package/src/mcp-server/tools/notificationsStatsRetrieve.ts +1 -1
  174. package/src/mcp-server/tools/subscribersAuthenticationChatAccessOauth.ts +1 -1
  175. package/src/mcp-server/tools/subscribersAuthenticationChatAccessOauthCallBack.ts +1 -1
  176. package/src/mcp-server/tools/subscribersCreate.ts +1 -1
  177. package/src/mcp-server/tools/subscribersCreateBulk.ts +1 -1
  178. package/src/mcp-server/tools/subscribersCredentialsAppend.ts +1 -1
  179. package/src/mcp-server/tools/subscribersCredentialsDelete.ts +1 -1
  180. package/src/mcp-server/tools/subscribersCredentialsUpdate.ts +1 -1
  181. package/src/mcp-server/tools/subscribersDelete.ts +1 -1
  182. package/src/mcp-server/tools/subscribersList.ts +1 -1
  183. package/src/mcp-server/tools/subscribersMessagesMarkAll.ts +1 -1
  184. package/src/mcp-server/tools/subscribersMessagesMarkAllAs.ts +1 -1
  185. package/src/mcp-server/tools/subscribersMessagesUpdateAsSeen.ts +1 -1
  186. package/src/mcp-server/tools/subscribersNotificationsFeed.ts +1 -1
  187. package/src/mcp-server/tools/subscribersNotificationsUnseenCount.ts +1 -1
  188. package/src/mcp-server/tools/subscribersPatch.ts +1 -1
  189. package/src/mcp-server/tools/subscribersPreferencesList.ts +1 -1
  190. package/src/mcp-server/tools/subscribersPreferencesUpdate.ts +1 -1
  191. package/src/mcp-server/tools/subscribersPropertiesUpdateOnlineFlag.ts +1 -1
  192. package/src/mcp-server/tools/subscribersRetrieve.ts +1 -1
  193. package/src/mcp-server/tools/subscribersSearch.ts +1 -1
  194. package/src/mcp-server/tools/topicsCreate.ts +1 -1
  195. package/src/mcp-server/tools/topicsDelete.ts +1 -1
  196. package/src/mcp-server/tools/topicsList.ts +1 -1
  197. package/src/mcp-server/tools/topicsRename.ts +1 -1
  198. package/src/mcp-server/tools/topicsRetrieve.ts +1 -1
  199. package/src/mcp-server/tools/topicsSubscribersAssign.ts +1 -1
  200. package/src/mcp-server/tools/topicsSubscribersRemove.ts +1 -1
  201. package/src/mcp-server/tools/topicsSubscribersRetrieve.ts +1 -1
  202. package/src/mcp-server/tools.ts +5 -0
  203. package/src/models/components/activitynotificationjobresponsedto.ts +7 -0
  204. package/src/models/components/channelsettingsdto.ts +14 -18
  205. package/src/models/components/index.ts +0 -1
  206. package/src/models/components/integrationresponsedto.ts +18 -14
  207. package/src/models/components/markallmessageasrequestdto.ts +14 -18
  208. package/src/models/components/messagemarkasrequestdto.ts +18 -14
  209. package/src/models/components/overrides.ts +14 -16
  210. package/src/models/components/patchsubscriberrequestdto.ts +23 -37
  211. package/src/models/components/subscriberchanneldto.ts +18 -14
  212. package/src/models/components/subscriberpayloaddto.ts +37 -19
  213. package/src/models/operations/eventscontrollercancel.ts +4 -5
  214. package/src/models/operations/notificationscontrollerlistnotifications.ts +2 -2
  215. package/src/sdk/authentication.ts +16 -16
  216. package/src/sdk/integrations.ts +17 -17
  217. package/src/sdk/novumessages.ts +16 -16
  218. package/src/sdk/sdk.ts +24 -24
  219. package/src/sdk/stats.ts +10 -10
  220. package/src/sdk/subscribers.ts +61 -61
  221. package/models/components/databooleandto.d.ts +0 -29
  222. package/models/components/databooleandto.d.ts.map +0 -1
  223. package/models/components/databooleandto.js +0 -59
  224. package/models/components/databooleandto.js.map +0 -1
  225. package/src/models/components/databooleandto.ts +0 -62
package/src/lib/config.ts CHANGED
@@ -55,7 +55,7 @@ export function serverURLFromOptions(options: SDKOptions): URL | null {
55
55
  export const SDK_METADATA = {
56
56
  language: "typescript",
57
57
  openapiDocVersion: "1.0",
58
- sdkVersion: "0.5.0",
59
- genVersion: "2.539.0",
60
- userAgent: "speakeasy-sdk/typescript 0.5.0 2.539.0 1.0 @novu/api",
58
+ sdkVersion: "0.6.0",
59
+ genVersion: "2.558.2",
60
+ userAgent: "speakeasy-sdk/typescript 0.6.0 2.558.2 1.0 @novu/api",
61
61
  } as const;
package/src/lib/sdks.ts CHANGED
@@ -191,14 +191,9 @@ export class ClientSDK {
191
191
 
192
192
  if (conf.body instanceof ReadableStream) {
193
193
  if (!fetchOptions) {
194
- fetchOptions = {
195
- // @ts-expect-error see https://github.com/node-fetch/node-fetch/issues/1769
196
- duplex: "half",
197
- };
198
- } else {
199
- // @ts-expect-error see https://github.com/node-fetch/node-fetch/issues/1769
200
- fetchOptions.duplex = "half";
194
+ fetchOptions = {};
201
195
  }
196
+ Object.assign(fetchOptions, { duplex: "half" });
202
197
  }
203
198
 
204
199
  let input;
@@ -3,6 +3,7 @@
3
3
  */
4
4
 
5
5
  import * as components from "../models/components/index.js";
6
+
6
7
  type OAuth2PasswordFlow = {
7
8
  username: string;
8
9
  password?: string | undefined;
@@ -84,7 +85,9 @@ type SecurityInputOAuth2ClientCredentials = {
84
85
  value:
85
86
  | { clientID?: string | undefined; clientSecret?: string | undefined }
86
87
  | null
88
+ | string
87
89
  | undefined;
90
+ fieldName?: string;
88
91
  };
89
92
 
90
93
  type SecurityInputOAuth2PasswordCredentials = {
@@ -93,13 +96,13 @@ type SecurityInputOAuth2PasswordCredentials = {
93
96
  | string
94
97
  | null
95
98
  | undefined;
96
- fieldName: string;
99
+ fieldName?: string;
97
100
  };
98
101
 
99
102
  type SecurityInputCustom = {
100
103
  type: "http:custom";
101
104
  value: any | null | undefined;
102
- fieldName: string;
105
+ fieldName?: string;
103
106
  };
104
107
 
105
108
  export type SecurityInput =
@@ -136,6 +139,9 @@ export function resolveSecurity(
136
139
  typeof o.value === "string" && !!o.value
137
140
  );
138
141
  } else if (o.type === "oauth2:client_credentials") {
142
+ if (typeof o.value == "string") {
143
+ return !!o.value;
144
+ }
139
145
  return o.value.clientID != null || o.value.clientSecret != null;
140
146
  } else if (typeof o.value === "string") {
141
147
  return !!o.value;
@@ -224,7 +230,9 @@ function applyBearer(
224
230
  value = `Bearer ${value}`;
225
231
  }
226
232
 
227
- state.headers[spec.fieldName] = value;
233
+ if (spec.fieldName !== undefined) {
234
+ state.headers[spec.fieldName] = value;
235
+ }
228
236
  }
229
237
 
230
238
  export function resolveGlobalSecurity(
@@ -0,0 +1,17 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import { ZodRawShape } from "zod";
6
+ import { PromptArgsRawShape, PromptDefinition } from "./prompts.js";
7
+ import { ResourceDefinition, ResourceTemplateDefinition } from "./resources.js";
8
+ import { ToolDefinition } from "./tools.js";
9
+
10
+ export type Register = {
11
+ tool: <A extends ZodRawShape | undefined>(def: ToolDefinition<A>) => void;
12
+ resource: (def: ResourceDefinition) => void;
13
+ resourceTemplate: (def: ResourceTemplateDefinition) => void;
14
+ prompt: <A extends PromptArgsRawShape | undefined>(
15
+ prompt: PromptDefinition<A>,
16
+ ) => void;
17
+ };
@@ -19,7 +19,7 @@ const routes = buildRouteMap({
19
19
  export const app = buildApplication(routes, {
20
20
  name: "mcp",
21
21
  versionInfo: {
22
- currentVersion: "0.5.0",
22
+ currentVersion: "0.6.0",
23
23
  },
24
24
  });
25
25
 
@@ -0,0 +1,110 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import { RequestHandlerExtra } from "@modelcontextprotocol/sdk/shared/protocol.js";
7
+ import { GetPromptResult } from "@modelcontextprotocol/sdk/types.js";
8
+ import {
9
+ objectOutputType,
10
+ ZodOptional,
11
+ ZodType,
12
+ ZodTypeAny,
13
+ ZodTypeDef,
14
+ } from "zod";
15
+ import { NovuCore } from "../core.js";
16
+ import { ConsoleLogger } from "./console-logger.js";
17
+ import { MCPScope } from "./scopes.js";
18
+
19
+ // '@modelcontextprotocol/sdk' currently does not export this type
20
+ export type PromptArgsRawShape = {
21
+ [k: string]:
22
+ | ZodType<string, ZodTypeDef, string>
23
+ | ZodOptional<ZodType<string, ZodTypeDef, string>>;
24
+ };
25
+
26
+ export type PromptDefinition<
27
+ Args extends undefined | PromptArgsRawShape = undefined,
28
+ > = Args extends PromptArgsRawShape ? {
29
+ name: string;
30
+ description?: string;
31
+ scopes?: MCPScope[];
32
+ args: Args;
33
+ prompt: (
34
+ client: NovuCore,
35
+ args: objectOutputType<Args, ZodTypeAny>,
36
+ extra: RequestHandlerExtra,
37
+ ) => GetPromptResult | Promise<GetPromptResult>;
38
+ }
39
+ : {
40
+ name: string;
41
+ description?: string;
42
+ scopes?: MCPScope[];
43
+ args?: undefined;
44
+ prompt: (
45
+ client: NovuCore,
46
+ extra: RequestHandlerExtra,
47
+ ) => GetPromptResult | Promise<GetPromptResult>;
48
+ };
49
+
50
+ // Optional function to assist with formatting prompt results
51
+ export async function formatResult(value: string): Promise<GetPromptResult> {
52
+ return {
53
+ messages: [
54
+ {
55
+ role: "user",
56
+ content: {
57
+ type: "text",
58
+ text: value,
59
+ },
60
+ },
61
+ ],
62
+ };
63
+ }
64
+
65
+ export function createRegisterPrompt(
66
+ logger: ConsoleLogger,
67
+ server: McpServer,
68
+ sdk: NovuCore,
69
+ allowedScopes: Set<MCPScope>,
70
+ ): <A extends PromptArgsRawShape | undefined>(
71
+ prompt: PromptDefinition<A>,
72
+ ) => void {
73
+ return <A extends PromptArgsRawShape | undefined>(
74
+ prompt: PromptDefinition<A>,
75
+ ): void => {
76
+ const scopes = prompt.scopes ?? [];
77
+ if (!scopes.every((s: MCPScope) => allowedScopes.has(s))) {
78
+ return;
79
+ }
80
+
81
+ if (prompt.args) {
82
+ if (prompt.description) {
83
+ server.prompt(
84
+ prompt.name,
85
+ prompt.description,
86
+ prompt.args,
87
+ async (args, ctx) => prompt.prompt(sdk, args, ctx),
88
+ );
89
+ } else {
90
+ server.prompt(
91
+ prompt.name,
92
+ prompt.args,
93
+ async (args, ctx) => prompt.prompt(sdk, args, ctx),
94
+ );
95
+ }
96
+ } else {
97
+ if (prompt.description) {
98
+ server.prompt(
99
+ prompt.name,
100
+ prompt.description,
101
+ async (ctx) => prompt.prompt(sdk, ctx),
102
+ );
103
+ } else {
104
+ server.prompt(prompt.name, async (ctx) => prompt.prompt(sdk, ctx));
105
+ }
106
+ }
107
+
108
+ logger.debug("Registered prompt", { name: prompt.name });
109
+ };
110
+ }
@@ -2,12 +2,16 @@
2
2
  * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
3
  */
4
4
 
5
- import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import {
6
+ McpServer,
7
+ ResourceMetadata,
8
+ ResourceTemplate,
9
+ } from "@modelcontextprotocol/sdk/server/mcp.js";
6
10
  import { RequestHandlerExtra } from "@modelcontextprotocol/sdk/shared/protocol.js";
7
11
  import { Variables } from "@modelcontextprotocol/sdk/shared/uriTemplate.js";
8
12
  import { ReadResourceResult } from "@modelcontextprotocol/sdk/types.js";
9
13
  import { NovuCore } from "../core.js";
10
- import { Result } from "../types/fp.js";
14
+ import { ConsoleLogger } from "./console-logger.js";
11
15
  import { MCPScope } from "./scopes.js";
12
16
  import { isAsyncIterable, isBinaryData, valueToBase64 } from "./shared.js";
13
17
 
@@ -19,7 +23,8 @@ export type ReadResourceCallback = (
19
23
 
20
24
  export type ResourceDefinition = {
21
25
  name: string;
22
- description: string;
26
+ description?: string;
27
+ metadata?: ResourceMetadata;
23
28
  scopes?: MCPScope[];
24
29
  resource: string;
25
30
  read: ReadResourceCallback;
@@ -35,30 +40,28 @@ export type ReadResourceTemplateCallback = (
35
40
  export type ResourceTemplateDefinition = {
36
41
  name: string;
37
42
  description: string;
43
+ metadata?: ResourceMetadata;
38
44
  scopes?: MCPScope[];
39
45
  resource: ResourceTemplate;
40
46
  read: ReadResourceTemplateCallback;
41
47
  };
42
48
 
49
+ // Optional function to assist with formatting resource results
43
50
  export async function formatResult(
44
- result: Result<unknown, Error>,
51
+ value: unknown,
45
52
  uri: URL,
46
- init: { response?: Response | undefined },
53
+ init: { mimeType?: string | undefined; response?: Response | undefined },
47
54
  ): Promise<ReadResourceResult> {
48
- if (!result.ok) {
49
- throw result.error;
50
- }
51
-
52
- const { value } = result;
53
55
  if (typeof value === "undefined") {
54
56
  return { contents: [] };
55
57
  }
56
58
 
57
- const { response } = init;
58
- const mimeType = response?.headers.get("content-type") ?? "";
59
59
  let contents: ReadResourceResult["contents"] = [];
60
60
 
61
- if (mimeType.search(/\bjson\b/g)) {
61
+ const mimeType = init.mimeType ?? init.response?.headers.get("content-type")
62
+ ?? "";
63
+
64
+ if (mimeType.search(/\bjson\b/g) !== -1) {
62
65
  contents = [{ uri: uri.toString(), mimeType, text: JSON.stringify(value) }];
63
66
  } else if (
64
67
  mimeType.startsWith("text/event-stream")
@@ -71,7 +74,10 @@ export async function formatResult(
71
74
  text: await stringifySSEToJSON(value),
72
75
  },
73
76
  ];
74
- } else if (mimeType.startsWith("text/") && typeof value === "string") {
77
+ } else if (
78
+ (mimeType.startsWith("text/") || mimeType.startsWith("application/"))
79
+ && typeof value === "string"
80
+ ) {
75
81
  contents = [{ uri: uri.toString(), mimeType, text: value }];
76
82
  } else if (isBinaryData(value)) {
77
83
  const blob = await valueToBase64(value);
@@ -94,3 +100,59 @@ async function stringifySSEToJSON(
94
100
 
95
101
  return JSON.stringify(payloads);
96
102
  }
103
+
104
+ export function createRegisterResource(
105
+ logger: ConsoleLogger,
106
+ server: McpServer,
107
+ sdk: NovuCore,
108
+ allowedScopes: Set<MCPScope>,
109
+ ): (resource: ResourceDefinition) => void {
110
+ return (resource: ResourceDefinition): void => {
111
+ const scopes = resource.scopes ?? [];
112
+ if (!scopes.every((s: MCPScope) => allowedScopes.has(s))) {
113
+ return;
114
+ }
115
+
116
+ const metadata: ResourceMetadata = {
117
+ ...resource.metadata,
118
+ description: resource.description,
119
+ };
120
+
121
+ server.resource(
122
+ resource.name,
123
+ resource.resource,
124
+ metadata,
125
+ async (uri, ctx) => resource.read(sdk, uri, ctx),
126
+ );
127
+
128
+ logger.debug("Registered resource", { name: resource.name });
129
+ };
130
+ }
131
+
132
+ export function createRegisterResourceTemplate(
133
+ logger: ConsoleLogger,
134
+ server: McpServer,
135
+ sdk: NovuCore,
136
+ allowedScopes: Set<MCPScope>,
137
+ ): (resource: ResourceTemplateDefinition) => void {
138
+ return (resource: ResourceTemplateDefinition): void => {
139
+ const scopes = resource.scopes ?? [];
140
+ if (!scopes.every((s: MCPScope) => allowedScopes.has(s))) {
141
+ return;
142
+ }
143
+
144
+ const metadata: ResourceMetadata = {
145
+ ...resource.metadata,
146
+ description: resource.description,
147
+ };
148
+
149
+ server.resource(
150
+ resource.name,
151
+ resource.resource,
152
+ metadata,
153
+ async (uri, vars, ctx) => resource.read(sdk, uri, vars, ctx),
154
+ );
155
+
156
+ logger.debug("Registered resource template", { name: resource.name });
157
+ };
158
+ }
@@ -6,6 +6,11 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
6
  import { NovuCore } from "../core.js";
7
7
  import { SDKOptions } from "../lib/config.js";
8
8
  import type { ConsoleLogger } from "./console-logger.js";
9
+ import { createRegisterPrompt } from "./prompts.js";
10
+ import {
11
+ createRegisterResource,
12
+ createRegisterResourceTemplate,
13
+ } from "./resources.js";
9
14
  import { MCPScope, mcpScopes } from "./scopes.js";
10
15
  import { createRegisterTool } from "./tools.js";
11
16
  import { tool$cancel } from "./tools/cancel.js";
@@ -65,7 +70,7 @@ export function createMCPServer(deps: {
65
70
  }) {
66
71
  const server = new McpServer({
67
72
  name: "Novu",
68
- version: "0.5.0",
73
+ version: "0.6.0",
69
74
  });
70
75
 
71
76
  const client = new NovuCore({
@@ -73,7 +78,9 @@ export function createMCPServer(deps: {
73
78
  serverURL: deps.serverURL,
74
79
  serverIdx: deps.serverIdx,
75
80
  });
81
+
76
82
  const scopes = new Set(deps.scopes ?? mcpScopes);
83
+
77
84
  const allowedTools = deps.allowedTools && new Set(deps.allowedTools);
78
85
  const tool = createRegisterTool(
79
86
  deps.logger,
@@ -82,50 +89,60 @@ export function createMCPServer(deps: {
82
89
  scopes,
83
90
  allowedTools,
84
91
  );
92
+ const resource = createRegisterResource(deps.logger, server, client, scopes);
93
+ const resourceTemplate = createRegisterResourceTemplate(
94
+ deps.logger,
95
+ server,
96
+ client,
97
+ scopes,
98
+ );
99
+ const prompt = createRegisterPrompt(deps.logger, server, client, scopes);
100
+ const register = { tool, resource, resourceTemplate, prompt };
101
+ void register; // suppress unused warnings
85
102
 
86
103
  tool(tool$trigger);
87
- tool(tool$triggerBulk);
88
- tool(tool$triggerBroadcast);
89
104
  tool(tool$cancel);
90
- tool(tool$notificationsList);
91
- tool(tool$notificationsRetrieve);
92
- tool(tool$integrationsList);
93
- tool(tool$integrationsCreate);
94
- tool(tool$integrationsListActive);
95
- tool(tool$integrationsUpdate);
96
- tool(tool$integrationsDelete);
97
- tool(tool$integrationsSetAsPrimary);
98
- tool(tool$subscribersList);
99
- tool(tool$subscribersCreateBulk);
105
+ tool(tool$triggerBroadcast);
106
+ tool(tool$triggerBulk);
100
107
  tool(tool$subscribersSearch);
101
108
  tool(tool$subscribersCreate);
102
109
  tool(tool$subscribersRetrieve);
103
110
  tool(tool$subscribersPatch);
104
111
  tool(tool$subscribersDelete);
112
+ tool(tool$subscribersList);
113
+ tool(tool$subscribersCreateBulk);
114
+ tool(tool$integrationsList);
115
+ tool(tool$integrationsCreate);
116
+ tool(tool$integrationsUpdate);
117
+ tool(tool$integrationsDelete);
118
+ tool(tool$integrationsSetAsPrimary);
119
+ tool(tool$integrationsListActive);
105
120
  tool(tool$messagesRetrieve);
106
121
  tool(tool$messagesDelete);
107
122
  tool(tool$messagesDeleteByTransactionId);
123
+ tool(tool$notificationsList);
124
+ tool(tool$notificationsRetrieve);
108
125
  tool(tool$topicsCreate);
109
126
  tool(tool$topicsList);
110
127
  tool(tool$topicsDelete);
111
128
  tool(tool$topicsRetrieve);
112
129
  tool(tool$topicsRename);
113
- tool(tool$notificationsStatsRetrieve);
114
- tool(tool$notificationsStatsGraph);
115
- tool(tool$integrationsWebhooksRetrieve);
130
+ tool(tool$subscribersPreferencesList);
131
+ tool(tool$subscribersPreferencesUpdate);
116
132
  tool(tool$subscribersCredentialsUpdate);
117
133
  tool(tool$subscribersCredentialsAppend);
118
134
  tool(tool$subscribersCredentialsDelete);
119
- tool(tool$subscribersPropertiesUpdateOnlineFlag);
135
+ tool(tool$subscribersAuthenticationChatAccessOauth);
136
+ tool(tool$subscribersAuthenticationChatAccessOauthCallBack);
137
+ tool(tool$subscribersMessagesUpdateAsSeen);
138
+ tool(tool$subscribersMessagesMarkAll);
139
+ tool(tool$subscribersMessagesMarkAllAs);
120
140
  tool(tool$subscribersNotificationsFeed);
121
141
  tool(tool$subscribersNotificationsUnseenCount);
122
- tool(tool$subscribersMessagesMarkAllAs);
123
- tool(tool$subscribersMessagesMarkAll);
124
- tool(tool$subscribersMessagesUpdateAsSeen);
125
- tool(tool$subscribersAuthenticationChatAccessOauthCallBack);
126
- tool(tool$subscribersAuthenticationChatAccessOauth);
127
- tool(tool$subscribersPreferencesList);
128
- tool(tool$subscribersPreferencesUpdate);
142
+ tool(tool$subscribersPropertiesUpdateOnlineFlag);
143
+ tool(tool$integrationsWebhooksRetrieve);
144
+ tool(tool$notificationsStatsGraph);
145
+ tool(tool$notificationsStatsRetrieve);
129
146
  tool(tool$topicsSubscribersAssign);
130
147
  tool(tool$topicsSubscribersRetrieve);
131
148
  tool(tool$topicsSubscribersRemove);
@@ -14,7 +14,7 @@ const args = {
14
14
  };
15
15
 
16
16
  export const tool$integrationsCreate: ToolDefinition<typeof args> = {
17
- name: "integrations_create",
17
+ name: "integrations-create",
18
18
  description: `Create integration
19
19
 
20
20
  Create an integration for the current environment the user is based on the API key provided`,
@@ -12,7 +12,7 @@ const args = {
12
12
  };
13
13
 
14
14
  export const tool$integrationsDelete: ToolDefinition<typeof args> = {
15
- name: "integrations_delete",
15
+ name: "integrations-delete",
16
16
  description: `Delete integration`,
17
17
  args,
18
18
  tool: async (client, args, ctx) => {
@@ -11,7 +11,7 @@ const args = {
11
11
  };
12
12
 
13
13
  export const tool$integrationsList: ToolDefinition<typeof args> = {
14
- name: "integrations_list",
14
+ name: "integrations-list",
15
15
  description: `Get integrations
16
16
 
17
17
  Return all the integrations the user has created for that organization. Review v.0.17.0 changelog for a breaking change`,
@@ -11,7 +11,7 @@ const args = {
11
11
  };
12
12
 
13
13
  export const tool$integrationsListActive: ToolDefinition<typeof args> = {
14
- name: "integrations_list-active",
14
+ name: "integrations-list-active",
15
15
  description: `Get active integrations
16
16
 
17
17
  Return all the active integrations the user has created for that organization. Review v.0.17.0 changelog for a breaking change`,
@@ -12,7 +12,7 @@ const args = {
12
12
  };
13
13
 
14
14
  export const tool$integrationsSetAsPrimary: ToolDefinition<typeof args> = {
15
- name: "integrations_set-as-primary",
15
+ name: "integrations-set-as-primary",
16
16
  description: `Set integration as primary`,
17
17
  args,
18
18
  tool: async (client, args, ctx) => {
@@ -15,7 +15,7 @@ const args = {
15
15
  };
16
16
 
17
17
  export const tool$integrationsUpdate: ToolDefinition<typeof args> = {
18
- name: "integrations_update",
18
+ name: "integrations-update",
19
19
  description: `Update integration`,
20
20
  args,
21
21
  tool: async (client, args, ctx) => {
@@ -12,7 +12,7 @@ const args = {
12
12
  };
13
13
 
14
14
  export const tool$integrationsWebhooksRetrieve: ToolDefinition<typeof args> = {
15
- name: "integrations-webhooks_retrieve",
15
+ name: "integrations-webhooks-retrieve",
16
16
  description: `Get webhook support status for provider
17
17
 
18
18
  Return the status of the webhook for this provider, if it is supported or if it is not based on a boolean value`,
@@ -12,7 +12,7 @@ const args = {
12
12
  };
13
13
 
14
14
  export const tool$messagesDelete: ToolDefinition<typeof args> = {
15
- name: "messages_delete",
15
+ name: "messages-delete",
16
16
  description: `Delete message
17
17
 
18
18
  Deletes a message entity from the Novu platform`,
@@ -14,7 +14,7 @@ const args = {
14
14
  };
15
15
 
16
16
  export const tool$messagesDeleteByTransactionId: ToolDefinition<typeof args> = {
17
- name: "messages_delete-by-transaction-id",
17
+ name: "messages-delete-by-transaction-id",
18
18
  description: `Delete messages by transactionId
19
19
 
20
20
  Deletes messages entity from the Novu platform using TransactionId of message`,
@@ -11,7 +11,7 @@ const args = {
11
11
  };
12
12
 
13
13
  export const tool$messagesRetrieve: ToolDefinition<typeof args> = {
14
- name: "messages_retrieve",
14
+ name: "messages-retrieve",
15
15
  description: `Get messages
16
16
 
17
17
  Returns a list of messages, could paginate using the \`page\` query parameter`,
@@ -12,7 +12,7 @@ const args = {
12
12
  };
13
13
 
14
14
  export const tool$notificationsList: ToolDefinition<typeof args> = {
15
- name: "notifications_list",
15
+ name: "notifications-list",
16
16
  description: `Get notifications`,
17
17
  args,
18
18
  tool: async (client, args, ctx) => {
@@ -12,7 +12,7 @@ const args = {
12
12
  };
13
13
 
14
14
  export const tool$notificationsRetrieve: ToolDefinition<typeof args> = {
15
- name: "notifications_retrieve",
15
+ name: "notifications-retrieve",
16
16
  description: `Get notification`,
17
17
  args,
18
18
  tool: async (client, args, ctx) => {
@@ -12,7 +12,7 @@ const args = {
12
12
  };
13
13
 
14
14
  export const tool$notificationsStatsGraph: ToolDefinition<typeof args> = {
15
- name: "notifications-stats_graph",
15
+ name: "notifications-stats-graph",
16
16
  description: `Get notification graph statistics`,
17
17
  args,
18
18
  tool: async (client, args, ctx) => {
@@ -11,7 +11,7 @@ const args = {
11
11
  };
12
12
 
13
13
  export const tool$notificationsStatsRetrieve: ToolDefinition<typeof args> = {
14
- name: "notifications-stats_retrieve",
14
+ name: "notifications-stats-retrieve",
15
15
  description: `Get notification statistics`,
16
16
  args,
17
17
  tool: async (client, args, ctx) => {
@@ -14,7 +14,7 @@ const args = {
14
14
  export const tool$subscribersAuthenticationChatAccessOauth: ToolDefinition<
15
15
  typeof args
16
16
  > = {
17
- name: "subscribers-authentication_chat-access-oauth",
17
+ name: "subscribers-authentication-chat-access-oauth",
18
18
  description: `Handle chat oauth`,
19
19
  args,
20
20
  tool: async (client, args, ctx) => {
@@ -13,7 +13,7 @@ const args = {
13
13
 
14
14
  export const tool$subscribersAuthenticationChatAccessOauthCallBack:
15
15
  ToolDefinition<typeof args> = {
16
- name: "subscribers-authentication_chat-access-oauth-call-back",
16
+ name: "subscribers-authentication-chat-access-oauth-call-back",
17
17
  description: `Handle providers oauth redirect`,
18
18
  args,
19
19
  tool: async (client, args, ctx) => {
@@ -14,7 +14,7 @@ const args = {
14
14
  };
15
15
 
16
16
  export const tool$subscribersCreate: ToolDefinition<typeof args> = {
17
- name: "subscribers_create",
17
+ name: "subscribers-create",
18
18
  description: `Create subscriber
19
19
 
20
20
  Create subscriber with the given data`,
@@ -13,7 +13,7 @@ const args = {
13
13
  };
14
14
 
15
15
  export const tool$subscribersCreateBulk: ToolDefinition<typeof args> = {
16
- name: "subscribers_create-bulk",
16
+ name: "subscribers-create-bulk",
17
17
  description: `Bulk create subscribers
18
18
 
19
19
 
@@ -15,7 +15,7 @@ const args = {
15
15
  };
16
16
 
17
17
  export const tool$subscribersCredentialsAppend: ToolDefinition<typeof args> = {
18
- name: "subscribers-credentials_append",
18
+ name: "subscribers-credentials-append",
19
19
  description: `Modify subscriber credentials
20
20
 
21
21
  Subscriber credentials associated to the delivery methods such as slack and push tokens.