@novorb/mcp-core 2.1.1 → 3.0.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 +82 -161
- package/bin/mcp-core-jest.mjs +112 -0
- package/dist/auth.d.ts +57 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +74 -0
- package/dist/auth.js.map +1 -0
- package/dist/bootstrap.d.ts +129 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +206 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/client-input.d.ts +72 -0
- package/dist/client-input.d.ts.map +1 -0
- package/dist/client-input.js +109 -0
- package/dist/client-input.js.map +1 -0
- package/dist/credential-checks.d.ts +80 -0
- package/dist/credential-checks.d.ts.map +1 -0
- package/dist/credential-checks.js +189 -0
- package/dist/credential-checks.js.map +1 -0
- package/dist/credential-health.d.ts +12 -0
- package/dist/credential-health.d.ts.map +1 -0
- package/dist/credential-health.js +12 -0
- package/dist/credential-health.js.map +1 -0
- package/dist/credential-report.d.ts +46 -0
- package/dist/credential-report.d.ts.map +1 -0
- package/dist/credential-report.js +135 -0
- package/dist/credential-report.js.map +1 -0
- package/dist/credential-status-tool.d.ts +20 -0
- package/dist/credential-status-tool.d.ts.map +1 -0
- package/dist/credential-status-tool.js +33 -0
- package/dist/credential-status-tool.js.map +1 -0
- package/dist/credentials.d.ts +288 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +652 -0
- package/dist/credentials.js.map +1 -0
- package/dist/express-peers.d.ts +29 -0
- package/dist/express-peers.d.ts.map +1 -0
- package/dist/express-peers.js +36 -0
- package/dist/express-peers.js.map +1 -0
- package/dist/express.d.ts +74 -0
- package/dist/express.d.ts.map +1 -0
- package/dist/express.js +164 -0
- package/dist/express.js.map +1 -0
- package/dist/http-client.d.ts +278 -43
- package/dist/http-client.d.ts.map +1 -1
- package/dist/http-client.js +620 -182
- package/dist/http-client.js.map +1 -1
- package/dist/index.d.ts +27 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -10
- package/dist/index.js.map +1 -1
- package/dist/limits.d.ts +28 -0
- package/dist/limits.d.ts.map +1 -0
- package/dist/limits.js +37 -0
- package/dist/limits.js.map +1 -0
- package/dist/list-pagination.d.ts +41 -0
- package/dist/list-pagination.d.ts.map +1 -0
- package/dist/list-pagination.js +104 -0
- package/dist/list-pagination.js.map +1 -0
- package/dist/net.d.ts +112 -0
- package/dist/net.d.ts.map +1 -0
- package/dist/net.js +490 -0
- package/dist/net.js.map +1 -0
- package/dist/notifications.d.ts +78 -0
- package/dist/notifications.d.ts.map +1 -0
- package/dist/notifications.js +173 -0
- package/dist/notifications.js.map +1 -0
- package/dist/pagination.d.ts +236 -5
- package/dist/pagination.d.ts.map +1 -1
- package/dist/pagination.js +393 -6
- package/dist/pagination.js.map +1 -1
- package/dist/prompts.d.ts +70 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +109 -0
- package/dist/prompts.js.map +1 -0
- package/dist/protocol-errors.d.ts +15 -0
- package/dist/protocol-errors.d.ts.map +1 -0
- package/dist/protocol-errors.js +28 -0
- package/dist/protocol-errors.js.map +1 -0
- package/dist/protocol-logging.d.ts +37 -0
- package/dist/protocol-logging.d.ts.map +1 -0
- package/dist/protocol-logging.js +77 -0
- package/dist/protocol-logging.js.map +1 -0
- package/dist/rate-limiter.d.ts +36 -0
- package/dist/rate-limiter.d.ts.map +1 -0
- package/dist/rate-limiter.js +79 -0
- package/dist/rate-limiter.js.map +1 -0
- package/dist/request-state.d.ts +74 -0
- package/dist/request-state.d.ts.map +1 -0
- package/dist/request-state.js +190 -0
- package/dist/request-state.js.map +1 -0
- package/dist/resources.d.ts +181 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +302 -0
- package/dist/resources.js.map +1 -0
- package/dist/result-limits.d.ts +80 -0
- package/dist/result-limits.d.ts.map +1 -0
- package/dist/result-limits.js +248 -0
- package/dist/result-limits.js.map +1 -0
- package/dist/retry.d.ts +79 -23
- package/dist/retry.d.ts.map +1 -1
- package/dist/retry.js +170 -57
- package/dist/retry.js.map +1 -1
- package/dist/sdk/client-stdio.d.ts +6 -0
- package/dist/sdk/client-stdio.d.ts.map +1 -0
- package/dist/sdk/client-stdio.js +6 -0
- package/dist/sdk/client-stdio.js.map +1 -0
- package/dist/sdk/client.d.ts +6 -0
- package/dist/sdk/client.d.ts.map +1 -0
- package/dist/sdk/client.js +6 -0
- package/dist/sdk/client.js.map +1 -0
- package/dist/sdk/express.d.ts +3 -0
- package/dist/sdk/express.d.ts.map +1 -0
- package/dist/sdk/express.js +11 -0
- package/dist/sdk/express.js.map +1 -0
- package/dist/sdk/node.d.ts +6 -0
- package/dist/sdk/node.d.ts.map +1 -0
- package/dist/sdk/node.js +6 -0
- package/dist/sdk/node.js.map +1 -0
- package/dist/sdk/server-stdio.d.ts +6 -0
- package/dist/sdk/server-stdio.d.ts.map +1 -0
- package/dist/sdk/server-stdio.js +6 -0
- package/dist/sdk/server-stdio.js.map +1 -0
- package/dist/sdk/server.d.ts +6 -0
- package/dist/sdk/server.d.ts.map +1 -0
- package/dist/sdk/server.js +6 -0
- package/dist/sdk/server.js.map +1 -0
- package/dist/server.d.ts +88 -36
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +98 -44
- package/dist/server.js.map +1 -1
- package/dist/task-request.d.ts +20 -0
- package/dist/task-request.d.ts.map +1 -0
- package/dist/task-request.js +43 -0
- package/dist/task-request.js.map +1 -0
- package/dist/task-store.d.ts +230 -0
- package/dist/task-store.d.ts.map +1 -0
- package/dist/task-store.js +459 -0
- package/dist/task-store.js.map +1 -0
- package/dist/task-tools.d.ts +115 -0
- package/dist/task-tools.d.ts.map +1 -0
- package/dist/task-tools.js +397 -0
- package/dist/task-tools.js.map +1 -0
- package/dist/testing/client.d.ts +25 -0
- package/dist/testing/client.d.ts.map +1 -0
- package/dist/testing/client.js +11 -0
- package/dist/testing/client.js.map +1 -0
- package/dist/testing/in-memory.d.ts +26 -0
- package/dist/testing/in-memory.d.ts.map +1 -0
- package/dist/testing/in-memory.js +41 -0
- package/dist/testing/in-memory.js.map +1 -0
- package/dist/testing/index.d.ts +20 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +20 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/isolated-dirs.d.ts +27 -0
- package/dist/testing/isolated-dirs.d.ts.map +1 -0
- package/dist/testing/isolated-dirs.js +67 -0
- package/dist/testing/isolated-dirs.js.map +1 -0
- package/dist/testing/logs.d.ts +61 -0
- package/dist/testing/logs.d.ts.map +1 -0
- package/dist/testing/logs.js +113 -0
- package/dist/testing/logs.js.map +1 -0
- package/dist/testing/raw-http.d.ts +25 -0
- package/dist/testing/raw-http.d.ts.map +1 -0
- package/dist/testing/raw-http.js +41 -0
- package/dist/testing/raw-http.js.map +1 -0
- package/dist/testing/raw-peer.d.ts +43 -0
- package/dist/testing/raw-peer.d.ts.map +1 -0
- package/dist/testing/raw-peer.js +101 -0
- package/dist/testing/raw-peer.js.map +1 -0
- package/dist/testing/recording-server.d.ts +38 -0
- package/dist/testing/recording-server.d.ts.map +1 -0
- package/dist/testing/recording-server.js +38 -0
- package/dist/testing/recording-server.js.map +1 -0
- package/dist/testing/server-process.d.ts +76 -0
- package/dist/testing/server-process.d.ts.map +1 -0
- package/dist/testing/server-process.js +241 -0
- package/dist/testing/server-process.js.map +1 -0
- package/dist/testing/tools.d.ts +53 -0
- package/dist/testing/tools.d.ts.map +1 -0
- package/dist/testing/tools.js +98 -0
- package/dist/testing/tools.js.map +1 -0
- package/dist/testing/unit.d.ts +52 -0
- package/dist/testing/unit.d.ts.map +1 -0
- package/dist/testing/unit.js +95 -0
- package/dist/testing/unit.js.map +1 -0
- package/dist/tools.d.ts +205 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +370 -0
- package/dist/tools.js.map +1 -0
- package/dist/transport.d.ts +144 -53
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +305 -122
- package/dist/transport.js.map +1 -1
- package/dist/url-path.d.ts +49 -0
- package/dist/url-path.d.ts.map +1 -0
- package/dist/url-path.js +165 -0
- package/dist/url-path.js.map +1 -0
- package/dist/utils/dataStore.d.ts +143 -0
- package/dist/utils/dataStore.d.ts.map +1 -0
- package/dist/utils/dataStore.js +429 -0
- package/dist/utils/dataStore.js.map +1 -0
- package/dist/utils/envLoader.d.ts +129 -0
- package/dist/utils/envLoader.d.ts.map +1 -0
- package/dist/utils/envLoader.js +399 -0
- package/dist/utils/envLoader.js.map +1 -0
- package/dist/utils/logger.d.ts +181 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +664 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/redact.d.ts +50 -0
- package/dist/utils/redact.d.ts.map +1 -0
- package/dist/utils/redact.js +318 -0
- package/dist/utils/redact.js.map +1 -0
- package/docs/api-reference.md +29 -0
- package/docs/building-a-server.md +63 -0
- package/docs/credentials.md +131 -0
- package/docs/data-store.md +37 -0
- package/docs/env.md +38 -0
- package/docs/features.md +28 -0
- package/docs/http-client.md +116 -0
- package/docs/logger.md +100 -0
- package/docs/migrating-to-v3.md +45 -0
- package/docs/outbound-urls.md +104 -0
- package/docs/pagination.md +45 -0
- package/docs/protocol-features.md +62 -0
- package/docs/resources-prompts-tasks.md +95 -0
- package/docs/sdk.md +33 -0
- package/docs/server.md +68 -0
- package/docs/testing-harness.md +139 -0
- package/docs/testing.md +151 -0
- package/docs/tools.md +88 -0
- package/docs/transport.md +85 -0
- package/examples/testing/tools.integration.test.example.ts +312 -0
- package/examples/testing/tools.unit.test.example.ts +149 -0
- package/package.json +140 -18
- package/dist/logger.d.ts +0 -80
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js +0 -236
- package/dist/logger.js.map +0 -1
package/dist/pagination.js
CHANGED
|
@@ -1,18 +1,41 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @novorb/mcp-core
|
|
2
|
+
* @novorb/mcp-core - Pagination utilities
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Three groups:
|
|
5
|
+
* - page-number helpers for list tools (`normalizePagination`, `createPaginationMetadata`,
|
|
6
|
+
* `pageToOffset`, `paginateArray`);
|
|
7
|
+
* - HTTP-side strategies that walk an upstream API's pages (`pagePerPage`, `nextPageHeader`,
|
|
8
|
+
* `offsetLimit`, `linkHeader`, `nextLinkField`, `continuationToken`), run by `paginateRequests`
|
|
9
|
+
* (and `McpHttpClient.paginate`) with a stop condition per strategy and a hard page cap;
|
|
10
|
+
* - MCP-side opaque cursors and one paged result contract for list tools (`encodeCursor`,
|
|
11
|
+
* `decodeCursor`, `invalidCursorResult`, `paginateArrayByCursor`, `PagedResult`,
|
|
12
|
+
* `pagedResultSchema`).
|
|
5
13
|
*/
|
|
14
|
+
import { HARD_MAX_COLLECT_ITEMS, resolveLimits } from './limits.js';
|
|
6
15
|
/**
|
|
7
16
|
* Normalize pagination parameters with sensible bounds.
|
|
8
17
|
*
|
|
9
18
|
* @param params - Raw pagination params
|
|
10
|
-
* @param
|
|
11
|
-
* @param defaultPerPage - Default per_page (default: 20)
|
|
19
|
+
* @param maxPerPageOrOptions - Maximum per_page (default: 100), or an options object
|
|
20
|
+
* @param defaultPerPage - Default per_page (default: 20; ignored when an options object is passed)
|
|
12
21
|
*/
|
|
13
|
-
export function normalizePagination(params,
|
|
22
|
+
export function normalizePagination(params, maxPerPageOrOptions = 100, defaultPerPage = 20) {
|
|
23
|
+
const opts = typeof maxPerPageOrOptions === 'number' ? { maxPerPage: maxPerPageOrOptions, defaultPerPage } : maxPerPageOrOptions;
|
|
24
|
+
const maxPerPage = opts.maxPerPage ?? 100;
|
|
25
|
+
const fallbackPerPage = opts.defaultPerPage ?? 20;
|
|
26
|
+
if (opts.onInvalid === 'throw') {
|
|
27
|
+
const page = params?.page ?? 1;
|
|
28
|
+
const perPage = params?.per_page ?? fallbackPerPage;
|
|
29
|
+
if (!Number.isInteger(page) || page < 1) {
|
|
30
|
+
throw new RangeError(`page must be an integer >= 1 (got ${page})`);
|
|
31
|
+
}
|
|
32
|
+
if (!Number.isInteger(perPage) || perPage < 1 || perPage > maxPerPage) {
|
|
33
|
+
throw new RangeError(`per_page must be an integer between 1 and ${maxPerPage} (got ${perPage})`);
|
|
34
|
+
}
|
|
35
|
+
return { page, per_page: perPage };
|
|
36
|
+
}
|
|
14
37
|
const page = Math.max(1, params?.page ?? 1);
|
|
15
|
-
const per_page = Math.min(maxPerPage, Math.max(1, params?.per_page ??
|
|
38
|
+
const per_page = Math.min(maxPerPage, Math.max(1, params?.per_page ?? fallbackPerPage));
|
|
16
39
|
return { page, per_page };
|
|
17
40
|
}
|
|
18
41
|
/**
|
|
@@ -43,4 +66,368 @@ export function paginateArray(items, params) {
|
|
|
43
66
|
metadata: createPaginationMetadata(items.length, params),
|
|
44
67
|
};
|
|
45
68
|
}
|
|
69
|
+
export const DEFAULT_MAX_PAGES = 100;
|
|
70
|
+
/** Absolute ceiling on any walk, whatever the caller asks for. */
|
|
71
|
+
export const HARD_MAX_PAGES = 10000;
|
|
72
|
+
function asRecord(value) {
|
|
73
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value)
|
|
74
|
+
? value
|
|
75
|
+
: undefined;
|
|
76
|
+
}
|
|
77
|
+
/** Default items extractor: an array body, else the first array under value/items/data/results. */
|
|
78
|
+
export function defaultItems(body) {
|
|
79
|
+
if (Array.isArray(body))
|
|
80
|
+
return body;
|
|
81
|
+
const record = asRecord(body);
|
|
82
|
+
if (record) {
|
|
83
|
+
for (const key of ['value', 'items', 'data', 'results']) {
|
|
84
|
+
const candidate = record[key];
|
|
85
|
+
if (Array.isArray(candidate))
|
|
86
|
+
return candidate;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
function itemsFrom(items) {
|
|
92
|
+
if (typeof items === 'function')
|
|
93
|
+
return items;
|
|
94
|
+
if (typeof items === 'string') {
|
|
95
|
+
return (body) => {
|
|
96
|
+
const candidate = asRecord(body)?.[items];
|
|
97
|
+
return Array.isArray(candidate) ? candidate : [];
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
return defaultItems;
|
|
101
|
+
}
|
|
102
|
+
/** Reads a non-negative integer header (e.g. `X-Total`, `X-Total-Count`); undefined when absent. */
|
|
103
|
+
export function readHeaderTotal(headers, name) {
|
|
104
|
+
const raw = headers[name.toLowerCase()];
|
|
105
|
+
if (raw === undefined || !/^\s*\d+\s*$/.test(raw))
|
|
106
|
+
return undefined;
|
|
107
|
+
return Number(raw.trim());
|
|
108
|
+
}
|
|
109
|
+
function readBodyNumber(body, field) {
|
|
110
|
+
const value = asRecord(body)?.[field];
|
|
111
|
+
return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : undefined;
|
|
112
|
+
}
|
|
113
|
+
function readBodyString(body, field) {
|
|
114
|
+
const value = asRecord(body)?.[field];
|
|
115
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
116
|
+
}
|
|
117
|
+
function totalOf(response, source) {
|
|
118
|
+
if (source.totalHeader) {
|
|
119
|
+
const total = readHeaderTotal(response.headers, source.totalHeader);
|
|
120
|
+
if (total !== undefined)
|
|
121
|
+
return total;
|
|
122
|
+
}
|
|
123
|
+
return source.totalField ? readBodyNumber(response.data, source.totalField) : undefined;
|
|
124
|
+
}
|
|
125
|
+
function withQuery(request, patch) {
|
|
126
|
+
return { ...request, query: { ...request.query, ...patch } };
|
|
127
|
+
}
|
|
128
|
+
function numericQuery(request, name, fallback) {
|
|
129
|
+
const value = request.query?.[name];
|
|
130
|
+
const num = typeof value === 'number' ? value : typeof value === 'string' ? Number(value) : Number.NaN;
|
|
131
|
+
return Number.isFinite(num) ? num : fallback;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Page-number pagination (`page` + `per_page`). Stops on an empty or short page, or once
|
|
135
|
+
* page * size reaches the total (from `totalHeader` / `totalField`).
|
|
136
|
+
*/
|
|
137
|
+
export function pagePerPage(options = {}) {
|
|
138
|
+
const pageParam = options.pageParam ?? 'page';
|
|
139
|
+
const sizeParam = options.sizeParam ?? 'per_page';
|
|
140
|
+
const pageSize = options.pageSize ?? 100;
|
|
141
|
+
const startPage = options.startPage ?? 1;
|
|
142
|
+
const extract = itemsFrom(options.items);
|
|
143
|
+
return {
|
|
144
|
+
name: 'pagePerPage',
|
|
145
|
+
first: (request) => withQuery(request, { [pageParam]: startPage, [sizeParam]: pageSize }),
|
|
146
|
+
parse: (response, request) => {
|
|
147
|
+
const items = extract(response.data);
|
|
148
|
+
const total = totalOf(response, options);
|
|
149
|
+
const page = numericQuery(request, pageParam, startPage);
|
|
150
|
+
const seen = (page - startPage + 1) * pageSize;
|
|
151
|
+
const done = items.length === 0 || items.length < pageSize || (total !== undefined && seen >= total);
|
|
152
|
+
return { items, total, next: done ? undefined : withQuery(request, { [pageParam]: page + 1 }) };
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Next-page header pagination (GitLab: `X-Next-Page`, empty on the last page; total from `X-Total`,
|
|
158
|
+
* which gitlab.com omits above 10k rows, so the header and not the total drives the walk).
|
|
159
|
+
*/
|
|
160
|
+
export function nextPageHeader(options = {}) {
|
|
161
|
+
const header = (options.header ?? 'x-next-page').toLowerCase();
|
|
162
|
+
const pageParam = options.pageParam ?? 'page';
|
|
163
|
+
const sizeParam = options.sizeParam ?? 'per_page';
|
|
164
|
+
const pageSize = options.pageSize ?? 100;
|
|
165
|
+
const source = { totalHeader: options.totalHeader ?? 'x-total', totalField: options.totalField };
|
|
166
|
+
const extract = itemsFrom(options.items);
|
|
167
|
+
return {
|
|
168
|
+
name: 'nextPageHeader',
|
|
169
|
+
first: (request) => withQuery(request, { [pageParam]: 1, [sizeParam]: pageSize }),
|
|
170
|
+
parse: (response, request) => {
|
|
171
|
+
const items = extract(response.data);
|
|
172
|
+
const raw = (response.headers[header] ?? '').trim();
|
|
173
|
+
const nextPage = /^\d+$/.test(raw) ? Number(raw) : undefined;
|
|
174
|
+
const next = nextPage !== undefined && items.length > 0 ? withQuery(request, { [pageParam]: nextPage }) : undefined;
|
|
175
|
+
return { items, total: totalOf(response, source), next };
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/** Offset/limit pagination. Stops on an empty or short page, or once offset + items reaches the total. */
|
|
180
|
+
export function offsetLimit(options = {}) {
|
|
181
|
+
const offsetParam = options.offsetParam ?? 'offset';
|
|
182
|
+
const limitParam = options.limitParam ?? 'limit';
|
|
183
|
+
const limit = options.limit ?? 100;
|
|
184
|
+
const startOffset = options.startOffset ?? 0;
|
|
185
|
+
const extract = itemsFrom(options.items);
|
|
186
|
+
return {
|
|
187
|
+
name: 'offsetLimit',
|
|
188
|
+
first: (request) => withQuery(request, { [offsetParam]: startOffset, [limitParam]: limit }),
|
|
189
|
+
parse: (response, request) => {
|
|
190
|
+
const items = extract(response.data);
|
|
191
|
+
const total = totalOf(response, options);
|
|
192
|
+
const offset = numericQuery(request, offsetParam, startOffset);
|
|
193
|
+
const reached = offset + items.length;
|
|
194
|
+
const done = items.length === 0 || items.length < limit || (total !== undefined && reached >= total);
|
|
195
|
+
return { items, total, next: done ? undefined : withQuery(request, { [offsetParam]: reached }) };
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
/** Parses an RFC 8288 (RFC 5988) `Link` header into rel -> URL. Space-separated rels map each. */
|
|
200
|
+
export function parseLinkHeader(value) {
|
|
201
|
+
const links = {};
|
|
202
|
+
if (!value)
|
|
203
|
+
return links;
|
|
204
|
+
const pattern = /<([^>]*)>((?:\s*;\s*[^;,]+)*)/g;
|
|
205
|
+
for (const match of value.matchAll(pattern)) {
|
|
206
|
+
const url = match[1];
|
|
207
|
+
const relMatch = /;\s*rel\s*=\s*"?([^";]+)"?/i.exec(match[2]);
|
|
208
|
+
if (!relMatch)
|
|
209
|
+
continue;
|
|
210
|
+
for (const rel of relMatch[1].trim().split(/\s+/)) {
|
|
211
|
+
if (!(rel in links))
|
|
212
|
+
links[rel] = url;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return links;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* RFC 5988 `Link: <url>; rel="next"` pagination (GitLab keyset, GitHub). The next URL is used as-is
|
|
219
|
+
* (it carries its own query), so the caller's query is dropped on follow-up requests.
|
|
220
|
+
*/
|
|
221
|
+
export function linkHeader(options = {}) {
|
|
222
|
+
const rel = options.rel ?? 'next';
|
|
223
|
+
const extract = itemsFrom(options.items);
|
|
224
|
+
return {
|
|
225
|
+
name: 'linkHeader',
|
|
226
|
+
first: (request) => request,
|
|
227
|
+
parse: (response, request) => {
|
|
228
|
+
const nextUrl = parseLinkHeader(response.headers.link)[rel];
|
|
229
|
+
return {
|
|
230
|
+
items: extract(response.data),
|
|
231
|
+
total: totalOf(response, options),
|
|
232
|
+
next: nextUrl ? { ...request, path: nextUrl, query: undefined } : undefined,
|
|
233
|
+
};
|
|
234
|
+
},
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Body next-link pagination (Microsoft Graph `@odata.nextLink`, total `@odata.count`). The next link
|
|
239
|
+
* is absolute and already contains the API version segment, so it is requested as-is.
|
|
240
|
+
*/
|
|
241
|
+
export function nextLinkField(options = {}) {
|
|
242
|
+
const field = options.field ?? '@odata.nextLink';
|
|
243
|
+
const source = { totalHeader: options.totalHeader, totalField: options.totalField ?? '@odata.count' };
|
|
244
|
+
const extract = itemsFrom(options.items ?? 'value');
|
|
245
|
+
return {
|
|
246
|
+
name: 'nextLinkField',
|
|
247
|
+
first: (request) => request,
|
|
248
|
+
parse: (response, request) => {
|
|
249
|
+
const nextUrl = readBodyString(response.data, field);
|
|
250
|
+
return {
|
|
251
|
+
items: extract(response.data),
|
|
252
|
+
total: totalOf(response, source),
|
|
253
|
+
next: nextUrl ? { ...request, path: nextUrl, query: undefined } : undefined,
|
|
254
|
+
};
|
|
255
|
+
},
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Continuation-token pagination (Nexus `continuationToken`; Trello `before=<last id>` via a token
|
|
260
|
+
* function). Stops when the token is absent or empty, or the page is empty.
|
|
261
|
+
*/
|
|
262
|
+
export function continuationToken(options = {}) {
|
|
263
|
+
const requestParam = options.requestParam ?? 'continuationToken';
|
|
264
|
+
const tokenSource = options.token ?? 'continuationToken';
|
|
265
|
+
const extract = itemsFrom(options.items ?? 'items');
|
|
266
|
+
return {
|
|
267
|
+
name: 'continuationToken',
|
|
268
|
+
first: (request) => request,
|
|
269
|
+
parse: (response, request) => {
|
|
270
|
+
const items = extract(response.data);
|
|
271
|
+
const token = typeof tokenSource === 'function'
|
|
272
|
+
? tokenSource(response.data, items)
|
|
273
|
+
: readBodyString(response.data, tokenSource);
|
|
274
|
+
const next = token && items.length > 0 ? withQuery(request, { [requestParam]: token }) : undefined;
|
|
275
|
+
return { items, total: totalOf(response, options), next };
|
|
276
|
+
},
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
function requestKey(request) {
|
|
280
|
+
const query = request.query ?? {};
|
|
281
|
+
const sorted = Object.keys(query)
|
|
282
|
+
.sort()
|
|
283
|
+
.map((key) => [key, query[key]]);
|
|
284
|
+
return `${request.path}?${JSON.stringify(sorted)}`;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Walks pages with a strategy. Each iteration of the returned iterator restarts the walk. Stops at the
|
|
288
|
+
* strategy's last page, `maxPages` (default 100, capped at HARD_MAX_PAGES), `maxItems`, or when the API
|
|
289
|
+
* repeats a next request (a loop).
|
|
290
|
+
*/
|
|
291
|
+
export function paginateRequests(fetchPage, request, strategy, options = {}) {
|
|
292
|
+
const maxPages = Math.min(HARD_MAX_PAGES, Math.max(1, options.maxPages ?? DEFAULT_MAX_PAGES));
|
|
293
|
+
// Bounded by default: the same per-response item cap the tools enforce (MCP_MAX_RESULT_ITEMS), and an
|
|
294
|
+
// explicit maxItems is still capped, so no walk pulls an unbounded upstream list into memory.
|
|
295
|
+
const maxItems = Math.min(HARD_MAX_COLLECT_ITEMS, Math.max(1, Math.floor(options.maxItems ?? resolveLimits().maxResultItems)));
|
|
296
|
+
async function* walk(onStop) {
|
|
297
|
+
let current = strategy.first(request);
|
|
298
|
+
const seen = new Set();
|
|
299
|
+
let collected = 0;
|
|
300
|
+
for (let pageIndex = 0; current; pageIndex++) {
|
|
301
|
+
if (pageIndex >= maxPages) {
|
|
302
|
+
onStop('maxPages');
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
const key = requestKey(current);
|
|
306
|
+
if (seen.has(key)) {
|
|
307
|
+
onStop('repeated');
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
seen.add(key);
|
|
311
|
+
const response = await fetchPage(current);
|
|
312
|
+
const parsed = strategy.parse(response, current);
|
|
313
|
+
let items = parsed.items;
|
|
314
|
+
if (collected + items.length >= maxItems) {
|
|
315
|
+
items = items.slice(0, Math.max(0, maxItems - collected));
|
|
316
|
+
const more = parsed.next !== undefined || items.length < parsed.items.length;
|
|
317
|
+
yield { items, pageIndex, total: parsed.total };
|
|
318
|
+
onStop(more ? 'maxItems' : 'end');
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
collected += items.length;
|
|
322
|
+
yield { items, pageIndex, total: parsed.total };
|
|
323
|
+
current = parsed.next;
|
|
324
|
+
}
|
|
325
|
+
onStop('end');
|
|
326
|
+
}
|
|
327
|
+
return {
|
|
328
|
+
[Symbol.asyncIterator]: () => walk(() => undefined),
|
|
329
|
+
items: () => ({
|
|
330
|
+
async *[Symbol.asyncIterator]() {
|
|
331
|
+
for await (const page of walk(() => undefined))
|
|
332
|
+
yield* page.items;
|
|
333
|
+
},
|
|
334
|
+
}),
|
|
335
|
+
collect: async () => {
|
|
336
|
+
let stopReason = 'end';
|
|
337
|
+
const items = [];
|
|
338
|
+
let total;
|
|
339
|
+
let pages = 0;
|
|
340
|
+
for await (const page of walk((reason) => {
|
|
341
|
+
stopReason = reason;
|
|
342
|
+
})) {
|
|
343
|
+
items.push(...page.items);
|
|
344
|
+
total = page.total ?? total;
|
|
345
|
+
pages++;
|
|
346
|
+
}
|
|
347
|
+
return { items, total, pages, stopReason, truncated: stopReason !== 'end' };
|
|
348
|
+
},
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
export const CURSOR_VERSION = 1;
|
|
352
|
+
/** Longest cursor `decodeCursor` accepts (bounded input). */
|
|
353
|
+
export const MAX_CURSOR_LENGTH = 2048;
|
|
354
|
+
/** Thrown by `decodeCursor` for a malformed, foreign, or stale cursor. */
|
|
355
|
+
export class InvalidCursorError extends Error {
|
|
356
|
+
constructor(reason) {
|
|
357
|
+
super(`Invalid cursor: ${reason}`);
|
|
358
|
+
this.name = 'InvalidCursorError';
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
/** Encodes cursor state as an opaque, versioned base64url JSON string. */
|
|
362
|
+
export function encodeCursor(data, version = CURSOR_VERSION) {
|
|
363
|
+
return Buffer.from(JSON.stringify({ v: version, d: data }), 'utf8').toString('base64url');
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Decodes a cursor made by `encodeCursor`. Throws `InvalidCursorError` (message starts with
|
|
367
|
+
* `Invalid cursor:`) for anything else.
|
|
368
|
+
*/
|
|
369
|
+
export function decodeCursor(cursor, options = {}) {
|
|
370
|
+
if (typeof cursor !== 'string' || cursor.length === 0)
|
|
371
|
+
throw new InvalidCursorError('empty');
|
|
372
|
+
if (cursor.length > MAX_CURSOR_LENGTH)
|
|
373
|
+
throw new InvalidCursorError('too long');
|
|
374
|
+
if (!/^[A-Za-z0-9_-]+$/.test(cursor))
|
|
375
|
+
throw new InvalidCursorError('not base64url');
|
|
376
|
+
let parsed;
|
|
377
|
+
try {
|
|
378
|
+
parsed = JSON.parse(Buffer.from(cursor, 'base64url').toString('utf8'));
|
|
379
|
+
}
|
|
380
|
+
catch {
|
|
381
|
+
throw new InvalidCursorError('not decodable');
|
|
382
|
+
}
|
|
383
|
+
const envelope = asRecord(parsed);
|
|
384
|
+
if (!envelope || typeof envelope.v !== 'number' || !('d' in envelope)) {
|
|
385
|
+
throw new InvalidCursorError('unrecognised format');
|
|
386
|
+
}
|
|
387
|
+
const expected = options.version ?? CURSOR_VERSION;
|
|
388
|
+
if (envelope.v !== expected)
|
|
389
|
+
throw new InvalidCursorError(`version ${envelope.v} is not ${expected}`);
|
|
390
|
+
const data = envelope.d;
|
|
391
|
+
if (options.validate && !options.validate(data))
|
|
392
|
+
throw new InvalidCursorError('unexpected content');
|
|
393
|
+
return data;
|
|
394
|
+
}
|
|
395
|
+
/** Tool result for a bad cursor: `isError` with the error's message (a generic one otherwise). */
|
|
396
|
+
export function invalidCursorResult(error) {
|
|
397
|
+
const text = error instanceof InvalidCursorError ? error.message : 'Invalid cursor';
|
|
398
|
+
return { isError: true, content: [{ type: 'text', text }] };
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* The zod output schema of `PagedResult<item>`. Takes the consumer's `z` so mcp-core never loads zod
|
|
402
|
+
* at runtime: `outputSchema: pagedResultSchema(z, Project)`. The result is the caller's own `z.object`
|
|
403
|
+
* type (its members are not narrowed to the paged shape).
|
|
404
|
+
*/
|
|
405
|
+
export function pagedResultSchema(z, item) {
|
|
406
|
+
const zod = z;
|
|
407
|
+
return zod.object({
|
|
408
|
+
items: zod.array(item),
|
|
409
|
+
nextCursor: zod.string().optional(),
|
|
410
|
+
total: zod.number().int().nonnegative().optional(),
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
function isOffsetCursor(data) {
|
|
414
|
+
const record = asRecord(data);
|
|
415
|
+
return record !== undefined && typeof record.o === 'number' && Number.isInteger(record.o) && record.o >= 0;
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Cursor pagination over an in-memory array: returns a `PagedResult` whose `nextCursor` encodes the
|
|
419
|
+
* next offset. Throws `InvalidCursorError` for a bad or out-of-range cursor.
|
|
420
|
+
*/
|
|
421
|
+
export function paginateArrayByCursor(items, options = {}) {
|
|
422
|
+
const maxLimit = options.maxLimit ?? 100;
|
|
423
|
+
const limit = Math.min(maxLimit, Math.max(1, Math.floor(options.limit ?? options.defaultLimit ?? 20)));
|
|
424
|
+
const offset = options.cursor ? decodeCursor(options.cursor, { validate: isOffsetCursor }).o : 0;
|
|
425
|
+
if (offset > items.length)
|
|
426
|
+
throw new InvalidCursorError('out of range');
|
|
427
|
+
const end = offset + limit;
|
|
428
|
+
const result = { items: items.slice(offset, end), total: items.length };
|
|
429
|
+
if (end < items.length)
|
|
430
|
+
result.nextCursor = encodeCursor({ o: end });
|
|
431
|
+
return result;
|
|
432
|
+
}
|
|
46
433
|
//# sourceMappingURL=pagination.js.map
|
package/dist/pagination.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAqBH;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAyB,EACzB,UAAU,GAAG,GAAG,EAChB,cAAc,GAAG,EAAE;IAEnB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,IAAI,cAAc,CAAC,CAAC,CAAC;IACvF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,UAAkB,EAClB,MAA4B;IAE5B,OAAO;QACL,UAAU;QACV,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,QAAQ;QACxB,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC;KACpD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,OAAe;IACxD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAU,EACV,MAA4B;IAE5B,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC3D,OAAO;QACL,IAAI;QACJ,QAAQ,EAAE,wBAAwB,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC;KACzD,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @novorb/mcp-core - Prompts
|
|
3
|
+
*
|
|
4
|
+
* `registerPrompts` mirrors `registerTools` for `McpServer.registerPrompt`: the SDK keeps
|
|
5
|
+
* `prompts/list`, argument validation from `argsSchema`, `completion/complete` for `completable`
|
|
6
|
+
* arguments and the unknown-prompt error; mcp-core adds the same wrapper conventions:
|
|
7
|
+
*
|
|
8
|
+
* - `Prompt get: <name>` / `Prompt result: <name>` log lines (argument SHAPE only, never values);
|
|
9
|
+
* - thrown errors become JSON-RPC errors through `mapError`, masked;
|
|
10
|
+
* - degraded mode (`requires`): listed, and answers `<server> is not configured: set <KEYS>`;
|
|
11
|
+
* - a string result is shorthand for one user message;
|
|
12
|
+
* - `enabled` filter, `surface` runtime toggles, and the list pagination of `prompts/list`.
|
|
13
|
+
*
|
|
14
|
+
* registerPrompts(server, [
|
|
15
|
+
* definePrompt({
|
|
16
|
+
* name: 'review-mr',
|
|
17
|
+
* description: 'Review a merge request',
|
|
18
|
+
* argsSchema: z.object({ project: completable(z.string(), (v) => projects.filter((p) => p.startsWith(v))) }),
|
|
19
|
+
* handler: async ({ project }) => `Review the open merge requests of ${project}.`,
|
|
20
|
+
* }),
|
|
21
|
+
* ], { env, serverName: 'my-mcp' });
|
|
22
|
+
*/
|
|
23
|
+
import type { AuthInfo, GetPromptResult, Icon, InputRequiredResult, RegisteredPrompt, ScopeChallengeHandler, ServerContext, StandardSchemaWithJSON } from '@modelcontextprotocol/server';
|
|
24
|
+
import { type RequestEra } from './client-input.js';
|
|
25
|
+
import { type RuntimeSurface } from './notifications.js';
|
|
26
|
+
import { type MapError } from './protocol-errors.js';
|
|
27
|
+
import type { McpServer } from './server.js';
|
|
28
|
+
import type { LoadedEnv } from './utils/envLoader.js';
|
|
29
|
+
import { type Logger } from './utils/logger.js';
|
|
30
|
+
/** What a prompt handler may return. A string is one user text message. */
|
|
31
|
+
export type PromptOutcome = GetPromptResult | InputRequiredResult | string;
|
|
32
|
+
export interface PromptContext {
|
|
33
|
+
prompt: string;
|
|
34
|
+
signal: AbortSignal;
|
|
35
|
+
authInfo?: AuthInfo;
|
|
36
|
+
era?: RequestEra;
|
|
37
|
+
logger: Logger;
|
|
38
|
+
sdk?: ServerContext;
|
|
39
|
+
}
|
|
40
|
+
export interface PromptDefinition<A extends StandardSchemaWithJSON = StandardSchemaWithJSON> {
|
|
41
|
+
name: string;
|
|
42
|
+
title?: string;
|
|
43
|
+
description?: string;
|
|
44
|
+
/** Arguments (a zod 4 object; `completable(...)` fields get completions). Omit for no arguments. */
|
|
45
|
+
argsSchema?: A;
|
|
46
|
+
icons?: Icon[];
|
|
47
|
+
_meta?: Record<string, unknown>;
|
|
48
|
+
scopeChallenge?: ScopeChallengeHandler;
|
|
49
|
+
requires?: readonly string[];
|
|
50
|
+
handler: (args: StandardSchemaWithJSON.InferOutput<A>, ctx: PromptContext) => Promise<PromptOutcome>;
|
|
51
|
+
}
|
|
52
|
+
/** A prompt definition in a heterogeneous list (see `AnyToolDefinition`). */
|
|
53
|
+
export type AnyPromptDefinition = Omit<PromptDefinition, 'handler'> & {
|
|
54
|
+
handler: (args: never, ctx: PromptContext) => Promise<PromptOutcome>;
|
|
55
|
+
};
|
|
56
|
+
/** Identity helper that types a prompt handler's arguments from its own schema. */
|
|
57
|
+
export declare function definePrompt<A extends StandardSchemaWithJSON>(definition: PromptDefinition<A>): AnyPromptDefinition;
|
|
58
|
+
export interface RegisterPromptsOptions {
|
|
59
|
+
env?: LoadedEnv;
|
|
60
|
+
enabled?: readonly string[];
|
|
61
|
+
prefix?: string;
|
|
62
|
+
serverName?: string;
|
|
63
|
+
mapError?: MapError;
|
|
64
|
+
surface?: RuntimeSurface;
|
|
65
|
+
}
|
|
66
|
+
/** Map a prompt outcome onto a `GetPromptResult` (string shorthand). */
|
|
67
|
+
export declare function normalizePromptOutcome(outcome: PromptOutcome): GetPromptResult | InputRequiredResult;
|
|
68
|
+
/** Register `defs` on `server`; returns the SDK handles by registered name. */
|
|
69
|
+
export declare function registerPrompts(server: McpServer, defs: readonly AnyPromptDefinition[], opts?: RegisterPromptsOptions): Map<string, RegisteredPrompt>;
|
|
70
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EACV,QAAQ,EACR,eAAe,EACf,IAAI,EACJ,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,aAAa,EACb,sBAAsB,EACvB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,KAAK,UAAU,EAAc,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,KAAK,QAAQ,EAAmB,MAAM,sBAAsB,CAAC;AAEtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAa,KAAK,MAAM,EAAiB,MAAM,mBAAmB,CAAC;AAE1E,2EAA2E;AAC3E,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,mBAAmB,GAAG,MAAM,CAAC;AAE3E,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,aAAa,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,sBAAsB,GAAG,sBAAsB;IACzF,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oGAAoG;IACpG,UAAU,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,OAAO,EAAE,CAAC,IAAI,EAAE,sBAAsB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;CACtG;AAED,6EAA6E;AAC7E,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,GAAG;IACpE,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;CACtE,CAAC;AAEF,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,CAAC,SAAS,sBAAsB,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAEnH;AAED,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED,wEAAwE;AACxE,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,aAAa,GAAG,eAAe,GAAG,mBAAmB,CAGpG;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,mBAAmB,EAAE,EACpC,IAAI,GAAE,sBAA2B,GAChC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAmE/B"}
|
package/dist/prompts.js
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @novorb/mcp-core - Prompts
|
|
3
|
+
*
|
|
4
|
+
* `registerPrompts` mirrors `registerTools` for `McpServer.registerPrompt`: the SDK keeps
|
|
5
|
+
* `prompts/list`, argument validation from `argsSchema`, `completion/complete` for `completable`
|
|
6
|
+
* arguments and the unknown-prompt error; mcp-core adds the same wrapper conventions:
|
|
7
|
+
*
|
|
8
|
+
* - `Prompt get: <name>` / `Prompt result: <name>` log lines (argument SHAPE only, never values);
|
|
9
|
+
* - thrown errors become JSON-RPC errors through `mapError`, masked;
|
|
10
|
+
* - degraded mode (`requires`): listed, and answers `<server> is not configured: set <KEYS>`;
|
|
11
|
+
* - a string result is shorthand for one user message;
|
|
12
|
+
* - `enabled` filter, `surface` runtime toggles, and the list pagination of `prompts/list`.
|
|
13
|
+
*
|
|
14
|
+
* registerPrompts(server, [
|
|
15
|
+
* definePrompt({
|
|
16
|
+
* name: 'review-mr',
|
|
17
|
+
* description: 'Review a merge request',
|
|
18
|
+
* argsSchema: z.object({ project: completable(z.string(), (v) => projects.filter((p) => p.startsWith(v))) }),
|
|
19
|
+
* handler: async ({ project }) => `Review the open merge requests of ${project}.`,
|
|
20
|
+
* }),
|
|
21
|
+
* ], { env, serverName: 'my-mcp' });
|
|
22
|
+
*/
|
|
23
|
+
import { ProtocolError, ProtocolErrorCode } from '@modelcontextprotocol/server';
|
|
24
|
+
import { requestEra } from './client-input.js';
|
|
25
|
+
import { bindToSurface } from './notifications.js';
|
|
26
|
+
import { toProtocolError } from './protocol-errors.js';
|
|
27
|
+
import { runWithRequestContext } from './protocol-logging.js';
|
|
28
|
+
import { notConfiguredMessage } from './tools.js';
|
|
29
|
+
import { getLogger, summarizeArgs } from './utils/logger.js';
|
|
30
|
+
/** Identity helper that types a prompt handler's arguments from its own schema. */
|
|
31
|
+
export function definePrompt(definition) {
|
|
32
|
+
return definition;
|
|
33
|
+
}
|
|
34
|
+
/** Map a prompt outcome onto a `GetPromptResult` (string shorthand). */
|
|
35
|
+
export function normalizePromptOutcome(outcome) {
|
|
36
|
+
if (typeof outcome === 'string')
|
|
37
|
+
return { messages: [{ role: 'user', content: { type: 'text', text: outcome } }] };
|
|
38
|
+
return outcome;
|
|
39
|
+
}
|
|
40
|
+
/** Register `defs` on `server`; returns the SDK handles by registered name. */
|
|
41
|
+
export function registerPrompts(server, defs, opts = {}) {
|
|
42
|
+
const handles = new Map();
|
|
43
|
+
const enabled = opts.enabled ? new Set(opts.enabled) : undefined;
|
|
44
|
+
const serverName = opts.serverName ?? 'this server';
|
|
45
|
+
const declared = new Set(opts.env?.schema.map((s) => s.key));
|
|
46
|
+
for (const def of defs) {
|
|
47
|
+
if (enabled && !enabled.has(def.name))
|
|
48
|
+
continue;
|
|
49
|
+
const name = `${opts.prefix ?? ''}${def.name}`;
|
|
50
|
+
const requires = def.requires ?? [];
|
|
51
|
+
if (requires.length > 0 && !opts.env) {
|
|
52
|
+
throw new Error(`registerPrompts: prompt ${name} declares requires but no env was passed`);
|
|
53
|
+
}
|
|
54
|
+
const undeclared = requires.filter((k) => !declared.has(k));
|
|
55
|
+
if (undeclared.length > 0) {
|
|
56
|
+
throw new Error(`registerPrompts: prompt ${name} requires ${undeclared.join(', ')}, which the env schema does not declare`);
|
|
57
|
+
}
|
|
58
|
+
const get = async (args, sdk) => {
|
|
59
|
+
const log = getLogger();
|
|
60
|
+
const started = Date.now();
|
|
61
|
+
log.info(`Prompt get: ${name}`, 'Prompts', { prompt: name, args: summarizeArgs(args) });
|
|
62
|
+
let isError = true;
|
|
63
|
+
try {
|
|
64
|
+
const missing = requires.filter((k) => !opts.env?.has(k));
|
|
65
|
+
if (missing.length > 0) {
|
|
66
|
+
throw new ProtocolError(ProtocolErrorCode.InternalError, notConfiguredMessage(serverName, missing));
|
|
67
|
+
}
|
|
68
|
+
const ctx = {
|
|
69
|
+
prompt: name,
|
|
70
|
+
signal: sdk.mcpReq.signal,
|
|
71
|
+
era: requestEra(sdk),
|
|
72
|
+
logger: log,
|
|
73
|
+
sdk,
|
|
74
|
+
...(sdk.http?.authInfo ? { authInfo: sdk.http.authInfo } : {}),
|
|
75
|
+
};
|
|
76
|
+
const result = normalizePromptOutcome(await def.handler(args, ctx));
|
|
77
|
+
isError = false;
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
throw toProtocolError(err, opts.mapError);
|
|
82
|
+
}
|
|
83
|
+
finally {
|
|
84
|
+
const meta = { prompt: name, isError, durationMs: Math.round(Date.now() - started) };
|
|
85
|
+
if (isError)
|
|
86
|
+
log.warn(`Prompt result: ${name}`, 'Prompts', meta);
|
|
87
|
+
else
|
|
88
|
+
log.info(`Prompt result: ${name}`, 'Prompts', meta);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
const run = (args, sdk) => runWithRequestContext(sdk, () => get(args, sdk));
|
|
92
|
+
const config = {
|
|
93
|
+
...(def.title !== undefined ? { title: def.title } : {}),
|
|
94
|
+
...(def.description !== undefined ? { description: def.description } : {}),
|
|
95
|
+
...(def.icons !== undefined ? { icons: def.icons } : {}),
|
|
96
|
+
...(def._meta !== undefined ? { _meta: def._meta } : {}),
|
|
97
|
+
...(def.scopeChallenge !== undefined ? { scopeChallenge: def.scopeChallenge } : {}),
|
|
98
|
+
};
|
|
99
|
+
const argsSchema = def.argsSchema;
|
|
100
|
+
const handle = argsSchema
|
|
101
|
+
? server.registerPrompt(name, { ...config, argsSchema }, (args, sdk) => run(args, sdk))
|
|
102
|
+
: server.registerPrompt(name, config, (sdk) => run(undefined, sdk));
|
|
103
|
+
if (opts.surface)
|
|
104
|
+
bindToSurface(server, opts.surface, 'prompt', name, handle);
|
|
105
|
+
handles.set(name, handle);
|
|
106
|
+
}
|
|
107
|
+
return handles;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
|