@novu/api 0.5.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +124 -68
- package/bin/mcp-server.js +223 -173
- package/bin/mcp-server.js.map +65 -64
- package/docs/sdks/authentication/README.md +17 -17
- package/docs/sdks/integrations/README.md +55 -55
- package/docs/sdks/novu/README.md +146 -146
- package/docs/sdks/novumessages/README.md +34 -34
- package/docs/sdks/stats/README.md +14 -14
- package/docs/sdks/subscribers/README.md +82 -82
- package/jsr.json +1 -1
- package/lib/config.d.ts +3 -3
- package/lib/config.js +3 -3
- package/lib/sdks.d.ts.map +1 -1
- package/lib/sdks.js +2 -8
- package/lib/sdks.js.map +1 -1
- package/lib/security.d.ts +4 -3
- package/lib/security.d.ts.map +1 -1
- package/lib/security.js +6 -1
- package/lib/security.js.map +1 -1
- package/mcp-server/extensions.d.ts +11 -0
- package/mcp-server/extensions.d.ts.map +1 -0
- package/mcp-server/extensions.js +6 -0
- package/mcp-server/extensions.js.map +1 -0
- package/mcp-server/mcp-server.js +1 -1
- package/mcp-server/prompts.d.ts +26 -0
- package/mcp-server/prompts.d.ts.map +1 -0
- package/mcp-server/prompts.js +48 -0
- package/mcp-server/prompts.js.map +1 -0
- package/mcp-server/resources.d.ts +9 -4
- package/mcp-server/resources.d.ts.map +1 -1
- package/mcp-server/resources.js +38 -10
- package/mcp-server/resources.js.map +1 -1
- package/mcp-server/server.d.ts.map +1 -1
- package/mcp-server/server.js +31 -24
- package/mcp-server/server.js.map +1 -1
- package/mcp-server/tools/integrationsCreate.js +1 -1
- package/mcp-server/tools/integrationsDelete.js +1 -1
- package/mcp-server/tools/integrationsList.js +1 -1
- package/mcp-server/tools/integrationsListActive.js +1 -1
- package/mcp-server/tools/integrationsSetAsPrimary.js +1 -1
- package/mcp-server/tools/integrationsUpdate.js +1 -1
- package/mcp-server/tools/integrationsWebhooksRetrieve.js +1 -1
- package/mcp-server/tools/messagesDelete.js +1 -1
- package/mcp-server/tools/messagesDeleteByTransactionId.js +1 -1
- package/mcp-server/tools/messagesRetrieve.js +1 -1
- package/mcp-server/tools/notificationsList.js +1 -1
- package/mcp-server/tools/notificationsRetrieve.js +1 -1
- package/mcp-server/tools/notificationsStatsGraph.js +1 -1
- package/mcp-server/tools/notificationsStatsRetrieve.js +1 -1
- package/mcp-server/tools/subscribersAuthenticationChatAccessOauth.js +1 -1
- package/mcp-server/tools/subscribersAuthenticationChatAccessOauthCallBack.js +1 -1
- package/mcp-server/tools/subscribersCreate.js +1 -1
- package/mcp-server/tools/subscribersCreateBulk.js +1 -1
- package/mcp-server/tools/subscribersCredentialsAppend.js +1 -1
- package/mcp-server/tools/subscribersCredentialsDelete.js +1 -1
- package/mcp-server/tools/subscribersCredentialsUpdate.js +1 -1
- package/mcp-server/tools/subscribersDelete.js +1 -1
- package/mcp-server/tools/subscribersList.js +1 -1
- package/mcp-server/tools/subscribersMessagesMarkAll.js +1 -1
- package/mcp-server/tools/subscribersMessagesMarkAllAs.js +1 -1
- package/mcp-server/tools/subscribersMessagesUpdateAsSeen.js +1 -1
- package/mcp-server/tools/subscribersNotificationsFeed.js +1 -1
- package/mcp-server/tools/subscribersNotificationsUnseenCount.js +1 -1
- package/mcp-server/tools/subscribersPatch.js +1 -1
- package/mcp-server/tools/subscribersPreferencesList.js +1 -1
- package/mcp-server/tools/subscribersPreferencesUpdate.js +1 -1
- package/mcp-server/tools/subscribersPropertiesUpdateOnlineFlag.js +1 -1
- package/mcp-server/tools/subscribersRetrieve.js +1 -1
- package/mcp-server/tools/subscribersSearch.js +1 -1
- package/mcp-server/tools/topicsCreate.js +1 -1
- package/mcp-server/tools/topicsDelete.js +1 -1
- package/mcp-server/tools/topicsList.js +1 -1
- package/mcp-server/tools/topicsRename.js +1 -1
- package/mcp-server/tools/topicsRetrieve.js +1 -1
- package/mcp-server/tools/topicsSubscribersAssign.js +1 -1
- package/mcp-server/tools/topicsSubscribersRemove.js +1 -1
- package/mcp-server/tools/topicsSubscribersRetrieve.js +1 -1
- package/mcp-server/tools.d.ts.map +1 -1
- package/mcp-server/tools.js +4 -0
- package/mcp-server/tools.js.map +1 -1
- package/models/components/activitynotificationjobresponsedto.d.ts +9 -0
- package/models/components/activitynotificationjobresponsedto.d.ts.map +1 -1
- package/models/components/activitynotificationjobresponsedto.js +2 -0
- package/models/components/activitynotificationjobresponsedto.js.map +1 -1
- package/models/components/channelsettingsdto.d.ts +8 -8
- package/models/components/channelsettingsdto.d.ts.map +1 -1
- package/models/components/channelsettingsdto.js +14 -13
- package/models/components/channelsettingsdto.js.map +1 -1
- package/models/components/index.d.ts +0 -1
- package/models/components/index.d.ts.map +1 -1
- package/models/components/index.js +0 -1
- package/models/components/index.js.map +1 -1
- package/models/components/integrationresponsedto.d.ts +8 -8
- package/models/components/integrationresponsedto.d.ts.map +1 -1
- package/models/components/integrationresponsedto.js +13 -14
- package/models/components/integrationresponsedto.js.map +1 -1
- package/models/components/markallmessageasrequestdto.d.ts +8 -8
- package/models/components/markallmessageasrequestdto.d.ts.map +1 -1
- package/models/components/markallmessageasrequestdto.js +14 -13
- package/models/components/markallmessageasrequestdto.js.map +1 -1
- package/models/components/messagemarkasrequestdto.d.ts +8 -8
- package/models/components/messagemarkasrequestdto.d.ts.map +1 -1
- package/models/components/messagemarkasrequestdto.js +13 -14
- package/models/components/messagemarkasrequestdto.js.map +1 -1
- package/models/components/overrides.d.ts +8 -8
- package/models/components/overrides.d.ts.map +1 -1
- package/models/components/overrides.js +14 -13
- package/models/components/overrides.js.map +1 -1
- package/models/components/patchsubscriberrequestdto.d.ts +15 -15
- package/models/components/patchsubscriberrequestdto.d.ts.map +1 -1
- package/models/components/patchsubscriberrequestdto.js +19 -20
- package/models/components/patchsubscriberrequestdto.js.map +1 -1
- package/models/components/subscriberchanneldto.d.ts +8 -8
- package/models/components/subscriberchanneldto.d.ts.map +1 -1
- package/models/components/subscriberchanneldto.js +13 -14
- package/models/components/subscriberchanneldto.js.map +1 -1
- package/models/components/subscriberpayloaddto.d.ts +13 -13
- package/models/components/subscriberpayloaddto.d.ts.map +1 -1
- package/models/components/subscriberpayloaddto.js +16 -17
- package/models/components/subscriberpayloaddto.js.map +1 -1
- package/models/operations/eventscontrollercancel.d.ts +2 -3
- package/models/operations/eventscontrollercancel.d.ts.map +1 -1
- package/models/operations/eventscontrollercancel.js +2 -3
- package/models/operations/eventscontrollercancel.js.map +1 -1
- package/models/operations/notificationscontrollerlistnotifications.d.ts +2 -2
- package/package.json +2 -2
- package/sdk/authentication.d.ts +4 -4
- package/sdk/authentication.d.ts.map +1 -1
- package/sdk/authentication.js +6 -6
- package/sdk/authentication.js.map +1 -1
- package/sdk/integrations.d.ts +7 -7
- package/sdk/integrations.d.ts.map +1 -1
- package/sdk/integrations.js +9 -9
- package/sdk/integrations.js.map +1 -1
- package/sdk/novumessages.d.ts +4 -4
- package/sdk/novumessages.d.ts.map +1 -1
- package/sdk/novumessages.js +6 -6
- package/sdk/novumessages.js.map +1 -1
- package/sdk/sdk.d.ts +12 -12
- package/sdk/sdk.d.ts.map +1 -1
- package/sdk/sdk.js +15 -15
- package/sdk/sdk.js.map +1 -1
- package/sdk/stats.d.ts +4 -4
- package/sdk/stats.d.ts.map +1 -1
- package/sdk/stats.js +6 -6
- package/sdk/stats.js.map +1 -1
- package/sdk/subscribers.d.ts +26 -26
- package/sdk/subscribers.d.ts.map +1 -1
- package/sdk/subscribers.js +29 -29
- package/sdk/subscribers.js.map +1 -1
- package/sources/json-development.json +1146 -1148
- package/src/lib/config.ts +3 -3
- package/src/lib/sdks.ts +2 -7
- package/src/lib/security.ts +11 -3
- package/src/mcp-server/extensions.ts +17 -0
- package/src/mcp-server/mcp-server.ts +1 -1
- package/src/mcp-server/prompts.ts +110 -0
- package/src/mcp-server/resources.ts +76 -14
- package/src/mcp-server/server.ts +41 -24
- package/src/mcp-server/tools/integrationsCreate.ts +1 -1
- package/src/mcp-server/tools/integrationsDelete.ts +1 -1
- package/src/mcp-server/tools/integrationsList.ts +1 -1
- package/src/mcp-server/tools/integrationsListActive.ts +1 -1
- package/src/mcp-server/tools/integrationsSetAsPrimary.ts +1 -1
- package/src/mcp-server/tools/integrationsUpdate.ts +1 -1
- package/src/mcp-server/tools/integrationsWebhooksRetrieve.ts +1 -1
- package/src/mcp-server/tools/messagesDelete.ts +1 -1
- package/src/mcp-server/tools/messagesDeleteByTransactionId.ts +1 -1
- package/src/mcp-server/tools/messagesRetrieve.ts +1 -1
- package/src/mcp-server/tools/notificationsList.ts +1 -1
- package/src/mcp-server/tools/notificationsRetrieve.ts +1 -1
- package/src/mcp-server/tools/notificationsStatsGraph.ts +1 -1
- package/src/mcp-server/tools/notificationsStatsRetrieve.ts +1 -1
- package/src/mcp-server/tools/subscribersAuthenticationChatAccessOauth.ts +1 -1
- package/src/mcp-server/tools/subscribersAuthenticationChatAccessOauthCallBack.ts +1 -1
- package/src/mcp-server/tools/subscribersCreate.ts +1 -1
- package/src/mcp-server/tools/subscribersCreateBulk.ts +1 -1
- package/src/mcp-server/tools/subscribersCredentialsAppend.ts +1 -1
- package/src/mcp-server/tools/subscribersCredentialsDelete.ts +1 -1
- package/src/mcp-server/tools/subscribersCredentialsUpdate.ts +1 -1
- package/src/mcp-server/tools/subscribersDelete.ts +1 -1
- package/src/mcp-server/tools/subscribersList.ts +1 -1
- package/src/mcp-server/tools/subscribersMessagesMarkAll.ts +1 -1
- package/src/mcp-server/tools/subscribersMessagesMarkAllAs.ts +1 -1
- package/src/mcp-server/tools/subscribersMessagesUpdateAsSeen.ts +1 -1
- package/src/mcp-server/tools/subscribersNotificationsFeed.ts +1 -1
- package/src/mcp-server/tools/subscribersNotificationsUnseenCount.ts +1 -1
- package/src/mcp-server/tools/subscribersPatch.ts +1 -1
- package/src/mcp-server/tools/subscribersPreferencesList.ts +1 -1
- package/src/mcp-server/tools/subscribersPreferencesUpdate.ts +1 -1
- package/src/mcp-server/tools/subscribersPropertiesUpdateOnlineFlag.ts +1 -1
- package/src/mcp-server/tools/subscribersRetrieve.ts +1 -1
- package/src/mcp-server/tools/subscribersSearch.ts +1 -1
- package/src/mcp-server/tools/topicsCreate.ts +1 -1
- package/src/mcp-server/tools/topicsDelete.ts +1 -1
- package/src/mcp-server/tools/topicsList.ts +1 -1
- package/src/mcp-server/tools/topicsRename.ts +1 -1
- package/src/mcp-server/tools/topicsRetrieve.ts +1 -1
- package/src/mcp-server/tools/topicsSubscribersAssign.ts +1 -1
- package/src/mcp-server/tools/topicsSubscribersRemove.ts +1 -1
- package/src/mcp-server/tools/topicsSubscribersRetrieve.ts +1 -1
- package/src/mcp-server/tools.ts +5 -0
- package/src/models/components/activitynotificationjobresponsedto.ts +7 -0
- package/src/models/components/channelsettingsdto.ts +14 -18
- package/src/models/components/index.ts +0 -1
- package/src/models/components/integrationresponsedto.ts +18 -14
- package/src/models/components/markallmessageasrequestdto.ts +14 -18
- package/src/models/components/messagemarkasrequestdto.ts +18 -14
- package/src/models/components/overrides.ts +14 -16
- package/src/models/components/patchsubscriberrequestdto.ts +23 -37
- package/src/models/components/subscriberchanneldto.ts +18 -14
- package/src/models/components/subscriberpayloaddto.ts +37 -19
- package/src/models/operations/eventscontrollercancel.ts +4 -5
- package/src/models/operations/notificationscontrollerlistnotifications.ts +2 -2
- package/src/sdk/authentication.ts +16 -16
- package/src/sdk/integrations.ts +17 -17
- package/src/sdk/novumessages.ts +16 -16
- package/src/sdk/sdk.ts +24 -24
- package/src/sdk/stats.ts +10 -10
- package/src/sdk/subscribers.ts +61 -61
- package/models/components/databooleandto.d.ts +0 -29
- package/models/components/databooleandto.d.ts.map +0 -1
- package/models/components/databooleandto.js +0 -59
- package/models/components/databooleandto.js.map +0 -1
- 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.
|
|
59
|
-
genVersion: "2.
|
|
60
|
-
userAgent: "speakeasy-sdk/typescript 0.
|
|
58
|
+
sdkVersion: "0.6.1",
|
|
59
|
+
genVersion: "2.558.2",
|
|
60
|
+
userAgent: "speakeasy-sdk/typescript 0.6.1 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;
|
package/src/lib/security.ts
CHANGED
|
@@ -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
|
|
99
|
+
fieldName?: string;
|
|
97
100
|
};
|
|
98
101
|
|
|
99
102
|
type SecurityInputCustom = {
|
|
100
103
|
type: "http:custom";
|
|
101
104
|
value: any | null | undefined;
|
|
102
|
-
fieldName
|
|
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
|
-
|
|
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
|
+
};
|
|
@@ -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 {
|
|
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 {
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
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
|
+
}
|
package/src/mcp-server/server.ts
CHANGED
|
@@ -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.
|
|
73
|
+
version: "0.6.1",
|
|
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$
|
|
91
|
-
tool(tool$
|
|
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$
|
|
114
|
-
tool(tool$
|
|
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$
|
|
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$
|
|
123
|
-
tool(tool$
|
|
124
|
-
tool(tool$
|
|
125
|
-
tool(tool$
|
|
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: "
|
|
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`,
|
|
@@ -11,7 +11,7 @@ const args = {
|
|
|
11
11
|
};
|
|
12
12
|
|
|
13
13
|
export const tool$integrationsList: ToolDefinition<typeof args> = {
|
|
14
|
-
name: "
|
|
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: "
|
|
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: "
|
|
15
|
+
name: "integrations-set-as-primary",
|
|
16
16
|
description: `Set integration as primary`,
|
|
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$integrationsWebhooksRetrieve: ToolDefinition<typeof args> = {
|
|
15
|
-
name: "integrations-
|
|
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`,
|
|
@@ -14,7 +14,7 @@ const args = {
|
|
|
14
14
|
};
|
|
15
15
|
|
|
16
16
|
export const tool$messagesDeleteByTransactionId: ToolDefinition<typeof args> = {
|
|
17
|
-
name: "
|
|
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: "
|
|
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$notificationsStatsGraph: ToolDefinition<typeof args> = {
|
|
15
|
-
name: "notifications-
|
|
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-
|
|
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-
|
|
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-
|
|
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) => {
|
|
@@ -15,7 +15,7 @@ const args = {
|
|
|
15
15
|
};
|
|
16
16
|
|
|
17
17
|
export const tool$subscribersCredentialsAppend: ToolDefinition<typeof args> = {
|
|
18
|
-
name: "subscribers-
|
|
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.
|