@stagewise/mcp-extension-push-notifications 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.
- package/README.md +122 -0
- package/dist/capabilities.d.ts +18 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +47 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +2 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/register-push-notifications-client.d.ts +25 -0
- package/dist/client/register-push-notifications-client.d.ts.map +1 -0
- package/dist/client/register-push-notifications-client.js +116 -0
- package/dist/client/register-push-notifications-client.js.map +1 -0
- package/dist/constants.d.ts +10 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +10 -0
- package/dist/constants.js.map +1 -0
- package/dist/generated/schema.d.ts +516 -0
- package/dist/generated/schema.d.ts.map +1 -0
- package/dist/generated/schema.js +133 -0
- package/dist/generated/schema.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/server/http-subscriptions.d.ts +16 -0
- package/dist/server/http-subscriptions.d.ts.map +1 -0
- package/dist/server/http-subscriptions.js +235 -0
- package/dist/server/http-subscriptions.js.map +1 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +3 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/register-push-notifications-server.d.ts +32 -0
- package/dist/server/register-push-notifications-server.d.ts.map +1 -0
- package/dist/server/register-push-notifications-server.js +55 -0
- package/dist/server/register-push-notifications-server.js.map +1 -0
- package/dist/spec.types.d.ts +154 -0
- package/dist/spec.types.d.ts.map +1 -0
- package/dist/spec.types.js +2 -0
- package/dist/spec.types.js.map +1 -0
- package/package.json +55 -0
- package/schema.json +2466 -0
- package/specification/draft/events.md +206 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/generated/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,mBAAmB,iBAAiB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { PushNotificationNotificationParams } from '../spec.types.js';
|
|
2
|
+
export type PushNotificationsFetch = (request: Request) => Promise<Response>;
|
|
3
|
+
export interface PushNotificationsHttpSubscriptionManager {
|
|
4
|
+
fetch(request: Request): Promise<Response>;
|
|
5
|
+
publish(consumerKey: string, params: PushNotificationNotificationParams): void;
|
|
6
|
+
close(): void;
|
|
7
|
+
readonly subscriberCount: number;
|
|
8
|
+
}
|
|
9
|
+
export interface PushNotificationsHttpSubscriptionManagerOptions {
|
|
10
|
+
resolveConsumerKey(request: Request): string | Promise<string>;
|
|
11
|
+
keepAliveMs?: number;
|
|
12
|
+
maxSubscriptions?: number;
|
|
13
|
+
onSubscriptionStateChanged?: (consumerKey: string, active: boolean) => void;
|
|
14
|
+
}
|
|
15
|
+
export declare function createPushNotificationsHttpSubscriptionManager(delegate: PushNotificationsFetch, options: PushNotificationsHttpSubscriptionManagerOptions): PushNotificationsHttpSubscriptionManager;
|
|
16
|
+
//# sourceMappingURL=http-subscriptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-subscriptions.d.ts","sourceRoot":"","sources":["../../src/server/http-subscriptions.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,kCAAkC,EAEnC,MAAM,kBAAkB,CAAC;AAI1B,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE7E,MAAM,WAAW,wCAAwC;IACvD,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3C,OAAO,CACL,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,kCAAkC,GACzC,IAAI,CAAC;IACR,KAAK,IAAI,IAAI,CAAC;IACd,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,+CAA+C;IAC9D,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,0BAA0B,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CAC7E;AAgTD,wBAAgB,8CAA8C,CAC5D,QAAQ,EAAE,sBAAsB,EAChC,OAAO,EAAE,+CAA+C,GACvD,wCAAwC,CAE1C"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { hasPerRequestPushNotificationsCapability, missingPushNotificationsCapabilityError, } from '../capabilities.js';
|
|
2
|
+
import { PUSH_NOTIFICATIONS_EXTENSION_ID, PUSH_NOTIFICATIONS_NOTIFICATION_METHOD, SUBSCRIPTIONS_ACKNOWLEDGED_METHOD, SUBSCRIPTIONS_LISTEN_METHOD, } from '../constants.js';
|
|
3
|
+
import { PushNotificationNotificationParamsSchema, PushNotificationsSubscriptionSchema, SubscriptionsListenRequestSchema, } from '../generated/schema.js';
|
|
4
|
+
const SUBSCRIPTION_ID_META_KEY = 'io.modelcontextprotocol/subscriptionId';
|
|
5
|
+
function jsonRpcError(id, code, message, data) {
|
|
6
|
+
return Response.json({
|
|
7
|
+
jsonrpc: '2.0',
|
|
8
|
+
id,
|
|
9
|
+
error: { code, message, ...(data === undefined ? {} : { data }) },
|
|
10
|
+
}, { status: 200 });
|
|
11
|
+
}
|
|
12
|
+
class PushNotificationsHttpSubscriptionManagerModule {
|
|
13
|
+
#delegate;
|
|
14
|
+
#keepAliveMs;
|
|
15
|
+
#maxSubscriptions;
|
|
16
|
+
#resolveConsumerKey;
|
|
17
|
+
#onSubscriptionStateChanged;
|
|
18
|
+
#subscribers = new Map();
|
|
19
|
+
#closed = false;
|
|
20
|
+
constructor(delegate, options) {
|
|
21
|
+
this.#delegate = delegate;
|
|
22
|
+
this.#keepAliveMs = options.keepAliveMs ?? 15_000;
|
|
23
|
+
this.#maxSubscriptions = options.maxSubscriptions ?? 128;
|
|
24
|
+
this.#resolveConsumerKey = options.resolveConsumerKey;
|
|
25
|
+
this.#onSubscriptionStateChanged = options.onSubscriptionStateChanged;
|
|
26
|
+
}
|
|
27
|
+
get subscriberCount() {
|
|
28
|
+
return this.#subscribers.size;
|
|
29
|
+
}
|
|
30
|
+
async fetch(request) {
|
|
31
|
+
if (request.method !== 'POST')
|
|
32
|
+
return this.#delegate(request);
|
|
33
|
+
let body;
|
|
34
|
+
try {
|
|
35
|
+
body = await request.clone().json();
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return this.#delegate(request);
|
|
39
|
+
}
|
|
40
|
+
if (typeof body !== 'object' ||
|
|
41
|
+
body === null ||
|
|
42
|
+
!('method' in body) ||
|
|
43
|
+
body.method !== SUBSCRIPTIONS_LISTEN_METHOD ||
|
|
44
|
+
!this.#hasPushNotificationsFilter(body)) {
|
|
45
|
+
return this.#delegate(request);
|
|
46
|
+
}
|
|
47
|
+
return this.#listen(body, request);
|
|
48
|
+
}
|
|
49
|
+
publish(consumerKey, input) {
|
|
50
|
+
const params = PushNotificationNotificationParamsSchema.parse(input);
|
|
51
|
+
const subscriber = this.#subscribers.get(consumerKey);
|
|
52
|
+
if (!subscriber)
|
|
53
|
+
return;
|
|
54
|
+
subscriber.write({
|
|
55
|
+
jsonrpc: '2.0',
|
|
56
|
+
method: PUSH_NOTIFICATIONS_NOTIFICATION_METHOD,
|
|
57
|
+
params: {
|
|
58
|
+
...params,
|
|
59
|
+
_meta: {
|
|
60
|
+
...params._meta,
|
|
61
|
+
[SUBSCRIPTION_ID_META_KEY]: subscriber.id,
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
close() {
|
|
67
|
+
if (this.#closed)
|
|
68
|
+
return;
|
|
69
|
+
this.#closed = true;
|
|
70
|
+
for (const subscriber of [...this.#subscribers.values()]) {
|
|
71
|
+
subscriber.close(true);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async #listen(body, request) {
|
|
75
|
+
if (this.#closed) {
|
|
76
|
+
return jsonRpcError(null, -32_603, 'Subscription manager is closed');
|
|
77
|
+
}
|
|
78
|
+
const parsedRequest = SubscriptionsListenRequestSchema.safeParse(body);
|
|
79
|
+
if (!parsedRequest.success) {
|
|
80
|
+
const id = this.#requestId(body);
|
|
81
|
+
return jsonRpcError(id, -32_602, 'Invalid Push Notifications subscription');
|
|
82
|
+
}
|
|
83
|
+
const id = this.#requestId(body);
|
|
84
|
+
const subscriptionValue = parsedRequest.data.params.notifications[PUSH_NOTIFICATIONS_EXTENSION_ID];
|
|
85
|
+
const subscription = PushNotificationsSubscriptionSchema.safeParse(subscriptionValue);
|
|
86
|
+
if (!subscription.success) {
|
|
87
|
+
return jsonRpcError(id, -32_602, 'Invalid Push Notifications subscription');
|
|
88
|
+
}
|
|
89
|
+
const metadata = parsedRequest.data.params._meta;
|
|
90
|
+
if (typeof metadata !== 'object' ||
|
|
91
|
+
metadata === null ||
|
|
92
|
+
!hasPerRequestPushNotificationsCapability(metadata)) {
|
|
93
|
+
const error = missingPushNotificationsCapabilityError();
|
|
94
|
+
return jsonRpcError(id, error.code, error.message, error.data);
|
|
95
|
+
}
|
|
96
|
+
if (id === null) {
|
|
97
|
+
return jsonRpcError(null, -32_602, 'Invalid Push Notifications subscription');
|
|
98
|
+
}
|
|
99
|
+
let consumerKey;
|
|
100
|
+
try {
|
|
101
|
+
consumerKey = await this.#resolveConsumerKey(request);
|
|
102
|
+
if (consumerKey.length === 0)
|
|
103
|
+
throw new Error('Empty consumer key');
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return jsonRpcError(id, -32_001, 'Unable to resolve consumer identity');
|
|
107
|
+
}
|
|
108
|
+
if (!this.#subscribers.has(consumerKey) &&
|
|
109
|
+
this.#subscribers.size >= this.#maxSubscriptions) {
|
|
110
|
+
return jsonRpcError(id, -32_603, 'Subscription limit reached');
|
|
111
|
+
}
|
|
112
|
+
return this.#createStream(id, consumerKey, subscription.data, request.signal, typeof metadata === 'object' && metadata !== null
|
|
113
|
+
? metadata.progressToken
|
|
114
|
+
: undefined);
|
|
115
|
+
}
|
|
116
|
+
#createStream(id, consumerKey, subscription, signal, progressToken) {
|
|
117
|
+
const encoder = new TextEncoder();
|
|
118
|
+
let subscriber;
|
|
119
|
+
let keepAlive;
|
|
120
|
+
let removeAbort;
|
|
121
|
+
const stream = new ReadableStream({
|
|
122
|
+
start: (controller) => {
|
|
123
|
+
let ended = false;
|
|
124
|
+
const writeFrame = (frame) => {
|
|
125
|
+
if (ended)
|
|
126
|
+
return;
|
|
127
|
+
try {
|
|
128
|
+
controller.enqueue(encoder.encode(frame));
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
subscriber.close(false);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
const write = (message) => {
|
|
135
|
+
writeFrame(`event: message\ndata: ${JSON.stringify(message)}\n\n`);
|
|
136
|
+
};
|
|
137
|
+
const close = (graceful) => {
|
|
138
|
+
if (ended)
|
|
139
|
+
return;
|
|
140
|
+
if (graceful) {
|
|
141
|
+
write({
|
|
142
|
+
jsonrpc: '2.0',
|
|
143
|
+
id,
|
|
144
|
+
result: {
|
|
145
|
+
resultType: 'complete',
|
|
146
|
+
_meta: { [SUBSCRIPTION_ID_META_KEY]: id },
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
ended = true;
|
|
151
|
+
if (keepAlive !== undefined)
|
|
152
|
+
clearInterval(keepAlive);
|
|
153
|
+
removeAbort?.();
|
|
154
|
+
if (this.#subscribers.get(consumerKey) === subscriber) {
|
|
155
|
+
this.#subscribers.delete(consumerKey);
|
|
156
|
+
this.#notifySubscriptionState(consumerKey, false);
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
controller.close();
|
|
160
|
+
}
|
|
161
|
+
catch { }
|
|
162
|
+
};
|
|
163
|
+
subscriber = { id, consumerKey, subscription, write, close };
|
|
164
|
+
this.#subscribers.get(consumerKey)?.close(true);
|
|
165
|
+
this.#subscribers.set(consumerKey, subscriber);
|
|
166
|
+
this.#notifySubscriptionState(consumerKey, true);
|
|
167
|
+
write({
|
|
168
|
+
jsonrpc: '2.0',
|
|
169
|
+
method: SUBSCRIPTIONS_ACKNOWLEDGED_METHOD,
|
|
170
|
+
params: {
|
|
171
|
+
notifications: { [PUSH_NOTIFICATIONS_EXTENSION_ID]: subscription },
|
|
172
|
+
_meta: { [SUBSCRIPTION_ID_META_KEY]: id },
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
if (this.#keepAliveMs > 0) {
|
|
176
|
+
keepAlive = setInterval(() => {
|
|
177
|
+
if (progressToken === undefined) {
|
|
178
|
+
writeFrame(': keepalive\n\n');
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
write({
|
|
182
|
+
jsonrpc: '2.0',
|
|
183
|
+
method: 'notifications/progress',
|
|
184
|
+
params: { progressToken, progress: Date.now() },
|
|
185
|
+
});
|
|
186
|
+
}, this.#keepAliveMs);
|
|
187
|
+
keepAlive.unref?.();
|
|
188
|
+
}
|
|
189
|
+
const onAbort = () => close(false);
|
|
190
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
191
|
+
removeAbort = () => signal.removeEventListener('abort', onAbort);
|
|
192
|
+
if (signal.aborted)
|
|
193
|
+
close(false);
|
|
194
|
+
},
|
|
195
|
+
cancel: () => subscriber.close(false),
|
|
196
|
+
});
|
|
197
|
+
return new Response(stream, {
|
|
198
|
+
status: 200,
|
|
199
|
+
headers: {
|
|
200
|
+
'Content-Type': 'text/event-stream',
|
|
201
|
+
'Cache-Control': 'no-cache',
|
|
202
|
+
Connection: 'keep-alive',
|
|
203
|
+
'X-Accel-Buffering': 'no',
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
#notifySubscriptionState(consumerKey, active) {
|
|
208
|
+
try {
|
|
209
|
+
this.#onSubscriptionStateChanged?.(consumerKey, active);
|
|
210
|
+
}
|
|
211
|
+
catch { }
|
|
212
|
+
}
|
|
213
|
+
#hasPushNotificationsFilter(body) {
|
|
214
|
+
if (!('params' in body) || typeof body.params !== 'object')
|
|
215
|
+
return false;
|
|
216
|
+
if (body.params === null || !('notifications' in body.params))
|
|
217
|
+
return false;
|
|
218
|
+
const notifications = body.params.notifications;
|
|
219
|
+
return (typeof notifications === 'object' &&
|
|
220
|
+
notifications !== null &&
|
|
221
|
+
Object.hasOwn(notifications, PUSH_NOTIFICATIONS_EXTENSION_ID));
|
|
222
|
+
}
|
|
223
|
+
#requestId(body) {
|
|
224
|
+
if (typeof body !== 'object' || body === null || !('id' in body)) {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
return typeof body.id === 'string' || typeof body.id === 'number'
|
|
228
|
+
? body.id
|
|
229
|
+
: null;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
export function createPushNotificationsHttpSubscriptionManager(delegate, options) {
|
|
233
|
+
return new PushNotificationsHttpSubscriptionManagerModule(delegate, options);
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=http-subscriptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-subscriptions.js","sourceRoot":"","sources":["../../src/server/http-subscriptions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,yCAAyC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,yCAAyC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { BaseContext, Server } from '@modelcontextprotocol/server';
|
|
2
|
+
import type { AcknowledgeEventsParams, GetEventsParams, GetEventsResult, PushNotificationNotificationParams } from '../spec.types.js';
|
|
3
|
+
export type PushNotificationsServerProtocol = Pick<Server, 'getClientCapabilities' | 'notification' | 'registerCapabilities' | 'setRequestHandler'> & {
|
|
4
|
+
assertCanSetRequestHandler?(method: string): void;
|
|
5
|
+
};
|
|
6
|
+
export type PushNotificationsRequestContext = BaseContext;
|
|
7
|
+
export interface PushNotificationsServerHandlers {
|
|
8
|
+
getEvents(params: GetEventsParams, context: PushNotificationsRequestContext): Promise<GetEventsResult> | GetEventsResult;
|
|
9
|
+
acknowledgeEvents(params: AcknowledgeEventsParams, context: PushNotificationsRequestContext): Promise<void> | void;
|
|
10
|
+
}
|
|
11
|
+
export interface RegisterPushNotificationsServerOptions {
|
|
12
|
+
acceptInitializationCapabilities?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare class PushNotificationsProtocolError extends Error {
|
|
15
|
+
readonly code: number;
|
|
16
|
+
readonly data?: unknown;
|
|
17
|
+
constructor(error: {
|
|
18
|
+
code: number;
|
|
19
|
+
message: string;
|
|
20
|
+
data?: unknown;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
export interface RegisteredPushNotificationsServer {
|
|
24
|
+
clientSupportsPushNotifications(metadata?: Record<string, unknown>): boolean;
|
|
25
|
+
/** Sends an event that the application has already made durably retrievable. */
|
|
26
|
+
sendEvent(params: PushNotificationNotificationParams, options?: {
|
|
27
|
+
metadata?: Record<string, unknown>;
|
|
28
|
+
relatedRequestId?: string | number;
|
|
29
|
+
}): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
export declare function registerPushNotificationsServer(server: PushNotificationsServerProtocol, handlers: PushNotificationsServerHandlers, options?: RegisterPushNotificationsServerOptions): RegisteredPushNotificationsServer;
|
|
32
|
+
//# sourceMappingURL=register-push-notifications-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-push-notifications-server.d.ts","sourceRoot":"","sources":["../../src/server/register-push-notifications-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAwBxE,OAAO,KAAK,EACV,uBAAuB,EACvB,eAAe,EACf,eAAe,EACf,kCAAkC,EACnC,MAAM,kBAAkB,CAAC;AAE1B,MAAM,MAAM,+BAA+B,GAAG,IAAI,CAChD,MAAM,EACJ,uBAAuB,GACvB,cAAc,GACd,sBAAsB,GACtB,mBAAmB,CACtB,GAAG;IACF,0BAA0B,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACnD,CAAC;AACF,MAAM,MAAM,+BAA+B,GAAG,WAAW,CAAC;AAE1D,MAAM,WAAW,+BAA+B;IAC9C,SAAS,CACP,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC;IAC9C,iBAAiB,CACf,MAAM,EAAE,uBAAuB,EAC/B,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,sCAAsC;IACrD,gCAAgC,CAAC,EAAE,OAAO,CAAC;CAC5C;AAED,qBAAa,8BAA+B,SAAQ,KAAK;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAExB,YAAY,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,EAKnE;CACF;AAED,MAAM,WAAW,iCAAiC;IAChD,+BAA+B,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;IAC7E,gFAAgF;IAChF,SAAS,CACP,MAAM,EAAE,kCAAkC,EAC1C,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;KACpC,GACA,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,+BAA+B,EACvC,QAAQ,EAAE,+BAA+B,EACzC,OAAO,GAAE,sCAA2C,GACnD,iCAAiC,CAmEnC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { hasPerRequestPushNotificationsCapability, hasPushNotificationsCapability, missingPushNotificationsCapabilityError, pushNotificationsCapabilities, withPushNotificationsCapability, } from '../capabilities.js';
|
|
3
|
+
import { PUSH_NOTIFICATIONS_ACK_METHOD, PUSH_NOTIFICATIONS_GET_METHOD, PUSH_NOTIFICATIONS_NOTIFICATION_METHOD, SERVER_DISCOVER_METHOD, } from '../constants.js';
|
|
4
|
+
import { AcknowledgeEventsParamsSchema, AcknowledgeEventsResultSchema, GetEventsParamsSchema, GetEventsResultSchema, PushNotificationNotificationParamsSchema, ServerDiscoverResultSchema, } from '../generated/schema.js';
|
|
5
|
+
export class PushNotificationsProtocolError extends Error {
|
|
6
|
+
code;
|
|
7
|
+
data;
|
|
8
|
+
constructor(error) {
|
|
9
|
+
super(error.message);
|
|
10
|
+
this.name = 'PushNotificationsProtocolError';
|
|
11
|
+
this.code = error.code;
|
|
12
|
+
this.data = error.data;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function registerPushNotificationsServer(server, handlers, options = {}) {
|
|
16
|
+
server.registerCapabilities(withPushNotificationsCapability({}));
|
|
17
|
+
const supports = (metadata) => hasPerRequestPushNotificationsCapability(metadata) ||
|
|
18
|
+
(options.acceptInitializationCapabilities === true &&
|
|
19
|
+
hasPushNotificationsCapability(server.getClientCapabilities()));
|
|
20
|
+
const requireSupport = (context) => {
|
|
21
|
+
const metadata = context.mcpReq?.envelope;
|
|
22
|
+
if (!supports(metadata)) {
|
|
23
|
+
throw new PushNotificationsProtocolError(missingPushNotificationsCapabilityError());
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
server.setRequestHandler(SERVER_DISCOVER_METHOD, {
|
|
27
|
+
params: z.record(z.string(), z.unknown()),
|
|
28
|
+
result: ServerDiscoverResultSchema,
|
|
29
|
+
}, () => ({ capabilities: pushNotificationsCapabilities() }));
|
|
30
|
+
server.setRequestHandler(PUSH_NOTIFICATIONS_GET_METHOD, { params: GetEventsParamsSchema, result: GetEventsResultSchema }, async (params, context) => {
|
|
31
|
+
requireSupport(context);
|
|
32
|
+
return GetEventsResultSchema.parse(await handlers.getEvents(params, context));
|
|
33
|
+
});
|
|
34
|
+
server.setRequestHandler(PUSH_NOTIFICATIONS_ACK_METHOD, {
|
|
35
|
+
params: AcknowledgeEventsParamsSchema,
|
|
36
|
+
result: AcknowledgeEventsResultSchema,
|
|
37
|
+
}, async (params, context) => {
|
|
38
|
+
requireSupport(context);
|
|
39
|
+
await handlers.acknowledgeEvents(params, context);
|
|
40
|
+
return {};
|
|
41
|
+
});
|
|
42
|
+
return {
|
|
43
|
+
clientSupportsPushNotifications: supports,
|
|
44
|
+
async sendEvent(params, notificationOptions) {
|
|
45
|
+
if (!supports(notificationOptions?.metadata)) {
|
|
46
|
+
throw new PushNotificationsProtocolError(missingPushNotificationsCapabilityError());
|
|
47
|
+
}
|
|
48
|
+
await server.notification({
|
|
49
|
+
method: PUSH_NOTIFICATIONS_NOTIFICATION_METHOD,
|
|
50
|
+
params: PushNotificationNotificationParamsSchema.parse(params),
|
|
51
|
+
}, { relatedRequestId: notificationOptions?.relatedRequestId });
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=register-push-notifications-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-push-notifications-server.js","sourceRoot":"","sources":["../../src/server/register-push-notifications-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import type { ContentBlock } from '@modelcontextprotocol/client';
|
|
2
|
+
/**
|
|
3
|
+
* MCP Push Notifications Extension Schema
|
|
4
|
+
* Extension Identifier: io.stagewise/push-notifications
|
|
5
|
+
*
|
|
6
|
+
* This file contains the source TypeScript definitions for the extension.
|
|
7
|
+
* Run `pnpm generate:schemas` after changing it.
|
|
8
|
+
*/
|
|
9
|
+
interface JSONRPCRequest {
|
|
10
|
+
jsonrpc: '2.0';
|
|
11
|
+
id: string | number;
|
|
12
|
+
method: string;
|
|
13
|
+
params?: unknown;
|
|
14
|
+
}
|
|
15
|
+
interface JSONRPCNotification {
|
|
16
|
+
jsonrpc: '2.0';
|
|
17
|
+
method: string;
|
|
18
|
+
params?: unknown;
|
|
19
|
+
}
|
|
20
|
+
interface Result {
|
|
21
|
+
_meta?: Record<string, unknown>;
|
|
22
|
+
}
|
|
23
|
+
interface NotificationParams {
|
|
24
|
+
_meta?: Record<string, unknown>;
|
|
25
|
+
}
|
|
26
|
+
/** JSON data accepted in event-specific structured data. */
|
|
27
|
+
export type JSONPrimitive = string | number | boolean | null;
|
|
28
|
+
/** JSON data accepted in event-specific structured data. */
|
|
29
|
+
export type JSONValue = JSONPrimitive | JSONValue[] | {
|
|
30
|
+
[key: string]: JSONValue;
|
|
31
|
+
};
|
|
32
|
+
/** A durable event produced by an MCP server. */
|
|
33
|
+
export interface PushNotification {
|
|
34
|
+
/** Stable, globally unique identifier and deduplication key. */
|
|
35
|
+
eventId: string;
|
|
36
|
+
/** Stable identifier for the environment or channel that produced the event. */
|
|
37
|
+
sourceId: string;
|
|
38
|
+
/** Open event type whose data contract is owned by the producer. */
|
|
39
|
+
type: string;
|
|
40
|
+
/** ISO 8601 date-time at which the source created the event. */
|
|
41
|
+
createdAt: string;
|
|
42
|
+
/** Ordered MCP content blocks carrying the event's interoperable content. */
|
|
43
|
+
content: ContentBlock[];
|
|
44
|
+
/** Optional structured JSON data defined by the event type. */
|
|
45
|
+
data?: {
|
|
46
|
+
[key: string]: JSONValue;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** Parameters for retrieving pending durable events. */
|
|
50
|
+
export interface GetEventsParams {
|
|
51
|
+
[key: string]: unknown;
|
|
52
|
+
/** Requested maximum page size. Must be a positive integer. */
|
|
53
|
+
limit?: number;
|
|
54
|
+
}
|
|
55
|
+
/** Retrieves a bounded page of events pending for the authenticated consumer. */
|
|
56
|
+
export interface GetEventsRequest extends JSONRPCRequest {
|
|
57
|
+
method: 'io.stagewise/push-notifications/get';
|
|
58
|
+
params: GetEventsParams;
|
|
59
|
+
}
|
|
60
|
+
/** Result of retrieving pending events for the authenticated consumer. */
|
|
61
|
+
export type GetEventsResult = Result & {
|
|
62
|
+
/** Complete pending events in deterministic server order. */
|
|
63
|
+
events: PushNotification[];
|
|
64
|
+
/** Whether additional pending events were available when this page was read. */
|
|
65
|
+
hasMore: boolean;
|
|
66
|
+
};
|
|
67
|
+
/** Parameters for acknowledging durable acceptance of events. */
|
|
68
|
+
export interface AcknowledgeEventsParams {
|
|
69
|
+
[key: string]: unknown;
|
|
70
|
+
/** Event identifiers already committed to durable client storage. */
|
|
71
|
+
eventIds: string[];
|
|
72
|
+
}
|
|
73
|
+
/** Acknowledges durable client acceptance of one or more events. */
|
|
74
|
+
export interface AcknowledgeEventsRequest extends JSONRPCRequest {
|
|
75
|
+
method: 'io.stagewise/push-notifications/ack';
|
|
76
|
+
params: AcknowledgeEventsParams;
|
|
77
|
+
}
|
|
78
|
+
/** Empty, idempotent acknowledgement result. */
|
|
79
|
+
export type AcknowledgeEventsResult = Result;
|
|
80
|
+
/** Parameters sent with a subscribed push notification. */
|
|
81
|
+
export type PushNotificationNotificationParams = NotificationParams & {
|
|
82
|
+
/** Complete durable event already pending for the authenticated consumer. */
|
|
83
|
+
event: PushNotification;
|
|
84
|
+
};
|
|
85
|
+
/** Optional low-latency delivery of an event already available through retrieval. */
|
|
86
|
+
export interface PushNotificationNotification extends JSONRPCNotification {
|
|
87
|
+
method: 'io.stagewise/push-notifications/event';
|
|
88
|
+
params: PushNotificationNotificationParams;
|
|
89
|
+
}
|
|
90
|
+
/** Empty Push Notifications subscriptions/listen notification filter. */
|
|
91
|
+
export type PushNotificationsSubscription = Record<string, never>;
|
|
92
|
+
/** Extension-owned fields added to subscriptions/listen notifications. */
|
|
93
|
+
export interface PushNotificationsSubscriptionNotifications {
|
|
94
|
+
'io.stagewise/push-notifications'?: PushNotificationsSubscription;
|
|
95
|
+
}
|
|
96
|
+
/** Push Notifications fields returned in notifications/subscriptions/acknowledged. */
|
|
97
|
+
export interface PushNotificationsSubscriptionAcknowledgedNotifications {
|
|
98
|
+
'io.stagewise/push-notifications'?: PushNotificationsSubscription;
|
|
99
|
+
}
|
|
100
|
+
/** Empty capability object indicating support for the extension. */
|
|
101
|
+
export type PushNotificationsExtensionCapability = Record<string, never>;
|
|
102
|
+
/** Extensible MCP extension capability map. */
|
|
103
|
+
export interface ExtensionCapabilities {
|
|
104
|
+
[extensionId: string]: unknown;
|
|
105
|
+
'io.stagewise/push-notifications'?: PushNotificationsExtensionCapability;
|
|
106
|
+
}
|
|
107
|
+
/** Capability container used by discovery and initialization negotiation. */
|
|
108
|
+
export interface PushNotificationsCapabilities {
|
|
109
|
+
[key: string]: unknown;
|
|
110
|
+
extensions?: ExtensionCapabilities;
|
|
111
|
+
}
|
|
112
|
+
/** Future MCP per-request client capability metadata. */
|
|
113
|
+
export interface PushNotificationsClientCapabilitiesMeta {
|
|
114
|
+
[key: string]: unknown;
|
|
115
|
+
'io.modelcontextprotocol/clientCapabilities'?: PushNotificationsCapabilities;
|
|
116
|
+
}
|
|
117
|
+
/** Future MCP server discovery request. */
|
|
118
|
+
export interface ServerDiscoverRequest extends JSONRPCRequest {
|
|
119
|
+
method: 'server/discover';
|
|
120
|
+
params: {
|
|
121
|
+
[key: string]: unknown;
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/** Future MCP server discovery result. */
|
|
125
|
+
export type ServerDiscoverResult = Result & {
|
|
126
|
+
capabilities: PushNotificationsCapabilities;
|
|
127
|
+
};
|
|
128
|
+
/** Future MCP notification subscription request. */
|
|
129
|
+
export interface SubscriptionsListenRequest extends JSONRPCRequest {
|
|
130
|
+
method: 'subscriptions/listen';
|
|
131
|
+
params: {
|
|
132
|
+
[key: string]: unknown;
|
|
133
|
+
notifications: PushNotificationsSubscriptionNotifications & {
|
|
134
|
+
[key: string]: unknown;
|
|
135
|
+
};
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/** Empty acknowledgement for a subscription request. */
|
|
139
|
+
export type SubscriptionsListenResult = Result;
|
|
140
|
+
/** Notification confirming accepted subscription filters. */
|
|
141
|
+
export interface SubscriptionsAcknowledgedNotification extends JSONRPCNotification {
|
|
142
|
+
method: 'notifications/subscriptions/acknowledged';
|
|
143
|
+
params: NotificationParams & {
|
|
144
|
+
notifications: PushNotificationsSubscriptionAcknowledgedNotifications & {
|
|
145
|
+
[key: string]: unknown;
|
|
146
|
+
};
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/** JSON-RPC error data for a missing client capability. */
|
|
150
|
+
export interface MissingRequiredClientCapabilityData {
|
|
151
|
+
requiredCapabilities: PushNotificationsCapabilities;
|
|
152
|
+
}
|
|
153
|
+
export {};
|
|
154
|
+
//# sourceMappingURL=spec.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.types.d.ts","sourceRoot":"","sources":["../src/spec.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.types.js","sourceRoot":"","sources":["../src/spec.types.ts"],"names":[],"mappings":""}
|