@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.
Files changed (240) hide show
  1. package/README.md +82 -161
  2. package/bin/mcp-core-jest.mjs +112 -0
  3. package/dist/auth.d.ts +57 -0
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/auth.js +74 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/bootstrap.d.ts +129 -0
  8. package/dist/bootstrap.d.ts.map +1 -0
  9. package/dist/bootstrap.js +206 -0
  10. package/dist/bootstrap.js.map +1 -0
  11. package/dist/client-input.d.ts +72 -0
  12. package/dist/client-input.d.ts.map +1 -0
  13. package/dist/client-input.js +109 -0
  14. package/dist/client-input.js.map +1 -0
  15. package/dist/credential-checks.d.ts +80 -0
  16. package/dist/credential-checks.d.ts.map +1 -0
  17. package/dist/credential-checks.js +189 -0
  18. package/dist/credential-checks.js.map +1 -0
  19. package/dist/credential-health.d.ts +12 -0
  20. package/dist/credential-health.d.ts.map +1 -0
  21. package/dist/credential-health.js +12 -0
  22. package/dist/credential-health.js.map +1 -0
  23. package/dist/credential-report.d.ts +46 -0
  24. package/dist/credential-report.d.ts.map +1 -0
  25. package/dist/credential-report.js +135 -0
  26. package/dist/credential-report.js.map +1 -0
  27. package/dist/credential-status-tool.d.ts +20 -0
  28. package/dist/credential-status-tool.d.ts.map +1 -0
  29. package/dist/credential-status-tool.js +33 -0
  30. package/dist/credential-status-tool.js.map +1 -0
  31. package/dist/credentials.d.ts +288 -0
  32. package/dist/credentials.d.ts.map +1 -0
  33. package/dist/credentials.js +652 -0
  34. package/dist/credentials.js.map +1 -0
  35. package/dist/express-peers.d.ts +29 -0
  36. package/dist/express-peers.d.ts.map +1 -0
  37. package/dist/express-peers.js +36 -0
  38. package/dist/express-peers.js.map +1 -0
  39. package/dist/express.d.ts +74 -0
  40. package/dist/express.d.ts.map +1 -0
  41. package/dist/express.js +164 -0
  42. package/dist/express.js.map +1 -0
  43. package/dist/http-client.d.ts +278 -43
  44. package/dist/http-client.d.ts.map +1 -1
  45. package/dist/http-client.js +620 -182
  46. package/dist/http-client.js.map +1 -1
  47. package/dist/index.d.ts +27 -6
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +49 -10
  50. package/dist/index.js.map +1 -1
  51. package/dist/limits.d.ts +28 -0
  52. package/dist/limits.d.ts.map +1 -0
  53. package/dist/limits.js +37 -0
  54. package/dist/limits.js.map +1 -0
  55. package/dist/list-pagination.d.ts +41 -0
  56. package/dist/list-pagination.d.ts.map +1 -0
  57. package/dist/list-pagination.js +104 -0
  58. package/dist/list-pagination.js.map +1 -0
  59. package/dist/net.d.ts +112 -0
  60. package/dist/net.d.ts.map +1 -0
  61. package/dist/net.js +490 -0
  62. package/dist/net.js.map +1 -0
  63. package/dist/notifications.d.ts +78 -0
  64. package/dist/notifications.d.ts.map +1 -0
  65. package/dist/notifications.js +173 -0
  66. package/dist/notifications.js.map +1 -0
  67. package/dist/pagination.d.ts +236 -5
  68. package/dist/pagination.d.ts.map +1 -1
  69. package/dist/pagination.js +393 -6
  70. package/dist/pagination.js.map +1 -1
  71. package/dist/prompts.d.ts +70 -0
  72. package/dist/prompts.d.ts.map +1 -0
  73. package/dist/prompts.js +109 -0
  74. package/dist/prompts.js.map +1 -0
  75. package/dist/protocol-errors.d.ts +15 -0
  76. package/dist/protocol-errors.d.ts.map +1 -0
  77. package/dist/protocol-errors.js +28 -0
  78. package/dist/protocol-errors.js.map +1 -0
  79. package/dist/protocol-logging.d.ts +37 -0
  80. package/dist/protocol-logging.d.ts.map +1 -0
  81. package/dist/protocol-logging.js +77 -0
  82. package/dist/protocol-logging.js.map +1 -0
  83. package/dist/rate-limiter.d.ts +36 -0
  84. package/dist/rate-limiter.d.ts.map +1 -0
  85. package/dist/rate-limiter.js +79 -0
  86. package/dist/rate-limiter.js.map +1 -0
  87. package/dist/request-state.d.ts +74 -0
  88. package/dist/request-state.d.ts.map +1 -0
  89. package/dist/request-state.js +190 -0
  90. package/dist/request-state.js.map +1 -0
  91. package/dist/resources.d.ts +181 -0
  92. package/dist/resources.d.ts.map +1 -0
  93. package/dist/resources.js +302 -0
  94. package/dist/resources.js.map +1 -0
  95. package/dist/result-limits.d.ts +80 -0
  96. package/dist/result-limits.d.ts.map +1 -0
  97. package/dist/result-limits.js +248 -0
  98. package/dist/result-limits.js.map +1 -0
  99. package/dist/retry.d.ts +79 -23
  100. package/dist/retry.d.ts.map +1 -1
  101. package/dist/retry.js +170 -57
  102. package/dist/retry.js.map +1 -1
  103. package/dist/sdk/client-stdio.d.ts +6 -0
  104. package/dist/sdk/client-stdio.d.ts.map +1 -0
  105. package/dist/sdk/client-stdio.js +6 -0
  106. package/dist/sdk/client-stdio.js.map +1 -0
  107. package/dist/sdk/client.d.ts +6 -0
  108. package/dist/sdk/client.d.ts.map +1 -0
  109. package/dist/sdk/client.js +6 -0
  110. package/dist/sdk/client.js.map +1 -0
  111. package/dist/sdk/express.d.ts +3 -0
  112. package/dist/sdk/express.d.ts.map +1 -0
  113. package/dist/sdk/express.js +11 -0
  114. package/dist/sdk/express.js.map +1 -0
  115. package/dist/sdk/node.d.ts +6 -0
  116. package/dist/sdk/node.d.ts.map +1 -0
  117. package/dist/sdk/node.js +6 -0
  118. package/dist/sdk/node.js.map +1 -0
  119. package/dist/sdk/server-stdio.d.ts +6 -0
  120. package/dist/sdk/server-stdio.d.ts.map +1 -0
  121. package/dist/sdk/server-stdio.js +6 -0
  122. package/dist/sdk/server-stdio.js.map +1 -0
  123. package/dist/sdk/server.d.ts +6 -0
  124. package/dist/sdk/server.d.ts.map +1 -0
  125. package/dist/sdk/server.js +6 -0
  126. package/dist/sdk/server.js.map +1 -0
  127. package/dist/server.d.ts +88 -36
  128. package/dist/server.d.ts.map +1 -1
  129. package/dist/server.js +98 -44
  130. package/dist/server.js.map +1 -1
  131. package/dist/task-request.d.ts +20 -0
  132. package/dist/task-request.d.ts.map +1 -0
  133. package/dist/task-request.js +43 -0
  134. package/dist/task-request.js.map +1 -0
  135. package/dist/task-store.d.ts +230 -0
  136. package/dist/task-store.d.ts.map +1 -0
  137. package/dist/task-store.js +459 -0
  138. package/dist/task-store.js.map +1 -0
  139. package/dist/task-tools.d.ts +115 -0
  140. package/dist/task-tools.d.ts.map +1 -0
  141. package/dist/task-tools.js +397 -0
  142. package/dist/task-tools.js.map +1 -0
  143. package/dist/testing/client.d.ts +25 -0
  144. package/dist/testing/client.d.ts.map +1 -0
  145. package/dist/testing/client.js +11 -0
  146. package/dist/testing/client.js.map +1 -0
  147. package/dist/testing/in-memory.d.ts +26 -0
  148. package/dist/testing/in-memory.d.ts.map +1 -0
  149. package/dist/testing/in-memory.js +41 -0
  150. package/dist/testing/in-memory.js.map +1 -0
  151. package/dist/testing/index.d.ts +20 -0
  152. package/dist/testing/index.d.ts.map +1 -0
  153. package/dist/testing/index.js +20 -0
  154. package/dist/testing/index.js.map +1 -0
  155. package/dist/testing/isolated-dirs.d.ts +27 -0
  156. package/dist/testing/isolated-dirs.d.ts.map +1 -0
  157. package/dist/testing/isolated-dirs.js +67 -0
  158. package/dist/testing/isolated-dirs.js.map +1 -0
  159. package/dist/testing/logs.d.ts +61 -0
  160. package/dist/testing/logs.d.ts.map +1 -0
  161. package/dist/testing/logs.js +113 -0
  162. package/dist/testing/logs.js.map +1 -0
  163. package/dist/testing/raw-http.d.ts +25 -0
  164. package/dist/testing/raw-http.d.ts.map +1 -0
  165. package/dist/testing/raw-http.js +41 -0
  166. package/dist/testing/raw-http.js.map +1 -0
  167. package/dist/testing/raw-peer.d.ts +43 -0
  168. package/dist/testing/raw-peer.d.ts.map +1 -0
  169. package/dist/testing/raw-peer.js +101 -0
  170. package/dist/testing/raw-peer.js.map +1 -0
  171. package/dist/testing/recording-server.d.ts +38 -0
  172. package/dist/testing/recording-server.d.ts.map +1 -0
  173. package/dist/testing/recording-server.js +38 -0
  174. package/dist/testing/recording-server.js.map +1 -0
  175. package/dist/testing/server-process.d.ts +76 -0
  176. package/dist/testing/server-process.d.ts.map +1 -0
  177. package/dist/testing/server-process.js +241 -0
  178. package/dist/testing/server-process.js.map +1 -0
  179. package/dist/testing/tools.d.ts +53 -0
  180. package/dist/testing/tools.d.ts.map +1 -0
  181. package/dist/testing/tools.js +98 -0
  182. package/dist/testing/tools.js.map +1 -0
  183. package/dist/testing/unit.d.ts +52 -0
  184. package/dist/testing/unit.d.ts.map +1 -0
  185. package/dist/testing/unit.js +95 -0
  186. package/dist/testing/unit.js.map +1 -0
  187. package/dist/tools.d.ts +205 -0
  188. package/dist/tools.d.ts.map +1 -0
  189. package/dist/tools.js +370 -0
  190. package/dist/tools.js.map +1 -0
  191. package/dist/transport.d.ts +144 -53
  192. package/dist/transport.d.ts.map +1 -1
  193. package/dist/transport.js +305 -122
  194. package/dist/transport.js.map +1 -1
  195. package/dist/url-path.d.ts +49 -0
  196. package/dist/url-path.d.ts.map +1 -0
  197. package/dist/url-path.js +165 -0
  198. package/dist/url-path.js.map +1 -0
  199. package/dist/utils/dataStore.d.ts +143 -0
  200. package/dist/utils/dataStore.d.ts.map +1 -0
  201. package/dist/utils/dataStore.js +429 -0
  202. package/dist/utils/dataStore.js.map +1 -0
  203. package/dist/utils/envLoader.d.ts +129 -0
  204. package/dist/utils/envLoader.d.ts.map +1 -0
  205. package/dist/utils/envLoader.js +399 -0
  206. package/dist/utils/envLoader.js.map +1 -0
  207. package/dist/utils/logger.d.ts +181 -0
  208. package/dist/utils/logger.d.ts.map +1 -0
  209. package/dist/utils/logger.js +664 -0
  210. package/dist/utils/logger.js.map +1 -0
  211. package/dist/utils/redact.d.ts +50 -0
  212. package/dist/utils/redact.d.ts.map +1 -0
  213. package/dist/utils/redact.js +318 -0
  214. package/dist/utils/redact.js.map +1 -0
  215. package/docs/api-reference.md +29 -0
  216. package/docs/building-a-server.md +63 -0
  217. package/docs/credentials.md +131 -0
  218. package/docs/data-store.md +37 -0
  219. package/docs/env.md +38 -0
  220. package/docs/features.md +28 -0
  221. package/docs/http-client.md +116 -0
  222. package/docs/logger.md +100 -0
  223. package/docs/migrating-to-v3.md +45 -0
  224. package/docs/outbound-urls.md +104 -0
  225. package/docs/pagination.md +45 -0
  226. package/docs/protocol-features.md +62 -0
  227. package/docs/resources-prompts-tasks.md +95 -0
  228. package/docs/sdk.md +33 -0
  229. package/docs/server.md +68 -0
  230. package/docs/testing-harness.md +139 -0
  231. package/docs/testing.md +151 -0
  232. package/docs/tools.md +88 -0
  233. package/docs/transport.md +85 -0
  234. package/examples/testing/tools.integration.test.example.ts +312 -0
  235. package/examples/testing/tools.unit.test.example.ts +149 -0
  236. package/package.json +140 -18
  237. package/dist/logger.d.ts +0 -80
  238. package/dist/logger.d.ts.map +0 -1
  239. package/dist/logger.js +0 -236
  240. package/dist/logger.js.map +0 -1
@@ -0,0 +1,173 @@
1
+ /**
2
+ * @novorb/mcp-core - Change notifications (list changed, resource updated) and the server event bus
3
+ *
4
+ * The SDK sources change events from a `ServerEventBus` (`publish` / `subscribe`): `createMcpHandler`
5
+ * serves 2026-07-28 `subscriptions/listen` streams from it (ack, filtering and subscription ids are the
6
+ * SDK's). mcp-core makes that bus process-wide and connects it to every transport, so one call reaches
7
+ * every connection this process serves:
8
+ *
9
+ * const notify = createNotifier(); // or ctx.notify in runMcpServer's setup
10
+ * notify.toolsChanged(); // notifications/tools/list_changed
11
+ * notify.resourceUpdated('gitlab://repo/README.md');
12
+ *
13
+ * Delivery per era (what the SDK can carry; mcp-core adds no transport of its own):
14
+ *
15
+ * | Connection | Delivery |
16
+ * |---|---|
17
+ * | HTTP, 2026-07-28 | `subscriptions/listen` SSE streams on this process (the SDK listen router filters by the client's honored filter) |
18
+ * | stdio, 2026-07-28 | the pinned instance's change notifications, rewritten by the SDK onto the connection's open subscriptions |
19
+ * | stdio, 2025-era | unsolicited notifications on the connection; `resources/updated` only for URIs the client subscribed to |
20
+ * | HTTP, 2025-era stateless | none: every request is answered by a fresh instance and the standalone GET stream is 405, so there is no channel |
21
+ *
22
+ * Multi-instance hosts replace the in-memory bus with a shared one (`setProcessBus`, or `bus` on the
23
+ * transport options). A shared `ServerEventBus` implementation must: fan `publish(event)` out to the
24
+ * listeners of EVERY instance (its own included); return an idempotent unsubscribe from `subscribe`;
25
+ * never throw from `publish` (a failing listener must not stop the others); never echo an event back
26
+ * to the listener that published it from inside that listener; and carry the event value as is
27
+ * (`{ kind }` or `{ kind: 'resource_updated', uri }`, JSON-serialisable). No persistence or replay is
28
+ * needed: listen streams are live and a client re-lists after reconnecting. Events are not addressed to
29
+ * a caller: every open stream that opted in receives them (the SDK event has no principal).
30
+ */
31
+ import { InMemoryServerEventBus, McpServer, } from '@modelcontextprotocol/server';
32
+ import { getLogger } from './utils/logger.js';
33
+ export { InMemoryServerEventBus } from '@modelcontextprotocol/server';
34
+ function reportListenerError(error) {
35
+ getLogger().warn(`notification listener failed: ${error.message}`, 'Notifications');
36
+ }
37
+ let current;
38
+ /** The process-wide bus every mcp-core transport uses by default (in memory unless replaced). */
39
+ export function processBus() {
40
+ current ??= new InMemoryServerEventBus(reportListenerError);
41
+ return current;
42
+ }
43
+ /**
44
+ * Replace the process bus (a shared pub/sub on multi-instance hosts). Call it before starting the
45
+ * transport; `undefined` restores a fresh in-memory bus on next use.
46
+ */
47
+ export function setProcessBus(bus) {
48
+ current = bus;
49
+ }
50
+ /** The typed publish facade over a bus (the same shape as the SDK's `handler.notify`). */
51
+ export function createNotifier(bus = processBus()) {
52
+ return {
53
+ toolsChanged: () => bus.publish({ kind: 'tools_list_changed' }),
54
+ promptsChanged: () => bus.publish({ kind: 'prompts_list_changed' }),
55
+ resourcesChanged: () => bus.publish({ kind: 'resources_list_changed' }),
56
+ resourceUpdated: (uri) => bus.publish({ kind: 'resource_updated', uri }),
57
+ };
58
+ }
59
+ const SUBSCRIPTIONS = Symbol.for('@novorb/mcp-core/resourceSubscriptions');
60
+ function lowLevel(server) {
61
+ return server instanceof McpServer ? server.server : server;
62
+ }
63
+ /** The URIs a 2025-era client subscribed to on this instance (`resources/subscribe`). */
64
+ export function resourceSubscriptions(server) {
65
+ const target = lowLevel(server);
66
+ target[SUBSCRIPTIONS] ??= new Set();
67
+ return target[SUBSCRIPTIONS];
68
+ }
69
+ function send(server, event, era) {
70
+ switch (event.kind) {
71
+ case 'tools_list_changed':
72
+ return server.sendToolListChanged();
73
+ case 'prompts_list_changed':
74
+ return server.sendPromptListChanged();
75
+ case 'resources_list_changed':
76
+ return server.sendResourceListChanged();
77
+ case 'resource_updated':
78
+ // On a 2025-era connection only subscribed URIs are sent; on 2026-07-28 the SDK router filters.
79
+ if (era === 'legacy' && !resourceSubscriptions(server).has(event.uri))
80
+ return undefined;
81
+ return server.sendResourceUpdated({ uri: event.uri });
82
+ }
83
+ }
84
+ /**
85
+ * Forward bus events to a long-lived instance (a stdio connection): each event becomes the instance's
86
+ * own change notification. Detaches when the instance closes; returns the detach function. A send that
87
+ * fails (not connected, capability not advertised) is dropped: notifications never fail the server.
88
+ */
89
+ export function attachNotifications(server, era, bus = processBus()) {
90
+ const target = lowLevel(server);
91
+ const unsubscribe = bus.subscribe((event) => {
92
+ try {
93
+ send(target, event, era)?.catch(() => undefined);
94
+ }
95
+ catch {
96
+ // A notification the instance cannot send (capability not advertised) is dropped.
97
+ }
98
+ });
99
+ let detached = false;
100
+ const detach = () => {
101
+ if (detached)
102
+ return;
103
+ detached = true;
104
+ unsubscribe();
105
+ };
106
+ const previous = target.onclose;
107
+ target.onclose = () => {
108
+ detach();
109
+ previous?.();
110
+ };
111
+ return detach;
112
+ }
113
+ /**
114
+ * Process-level enable/disable state for tools, prompts and resources, so a runtime change works the
115
+ * same in both serving models: per-request HTTP instances read it when they are built, live stdio
116
+ * instances have their SDK handles toggled in place, and ONE list-changed event goes out on the bus.
117
+ * Pass it as `surface` to `registerTools` / `registerResources` / `registerPrompts`.
118
+ */
119
+ export function createRuntimeSurface(notifier = createNotifier()) {
120
+ const disabled = new Set();
121
+ const listeners = new Set();
122
+ const key = (kind, name) => `${kind}\0${name}`;
123
+ const publish = (kind) => {
124
+ if (kind === 'tool')
125
+ notifier.toolsChanged();
126
+ else if (kind === 'prompt')
127
+ notifier.promptsChanged();
128
+ else
129
+ notifier.resourcesChanged();
130
+ };
131
+ const set = (kind, name, enabled) => {
132
+ const k = key(kind, name);
133
+ if (enabled === !disabled.has(k))
134
+ return;
135
+ if (enabled)
136
+ disabled.delete(k);
137
+ else
138
+ disabled.add(k);
139
+ for (const listener of [...listeners])
140
+ listener(kind, name, enabled);
141
+ publish(kind);
142
+ };
143
+ return {
144
+ isEnabled: (kind, name) => !disabled.has(key(kind, name)),
145
+ enable: (kind, name) => set(kind, name, true),
146
+ disable: (kind, name) => set(kind, name, false),
147
+ subscribe(listener) {
148
+ listeners.add(listener);
149
+ return () => {
150
+ listeners.delete(listener);
151
+ };
152
+ },
153
+ };
154
+ }
155
+ /**
156
+ * Bind one SDK handle (a registered tool, prompt, resource or template) to a surface: its `enabled`
157
+ * flag follows the surface, set directly so the instance itself sends no list-changed notification
158
+ * (the surface publishes exactly one on the bus). The binding is released when the instance closes.
159
+ */
160
+ export function bindToSurface(server, surface, kind, name, handle) {
161
+ handle.enabled = surface.isEnabled(kind, name);
162
+ const unsubscribe = surface.subscribe((k, n, enabled) => {
163
+ if (k === kind && n === name)
164
+ handle.enabled = enabled;
165
+ });
166
+ const target = server.server;
167
+ const previous = target.onclose;
168
+ target.onclose = () => {
169
+ unsubscribe();
170
+ previous?.();
171
+ };
172
+ }
173
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../src/notifications.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,17 @@
1
1
  /**
2
- * @novorb/mcp-core — Pagination utilities
2
+ * @novorb/mcp-core - Pagination utilities
3
3
  *
4
- * Normalize and compute pagination metadata across MCP servers.
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 type { HttpResponse, RequestOptions } from './http-client.js';
6
15
  export interface PaginationParams {
7
16
  /** Page number (1-based, default: 1) */
8
17
  page?: number;
@@ -19,14 +28,22 @@ export interface PaginationMetadata {
19
28
  perPage: number;
20
29
  totalPages: number;
21
30
  }
31
+ export interface NormalizePaginationOptions {
32
+ /** Maximum allowed per_page (default: 100). */
33
+ maxPerPage?: number;
34
+ /** Default per_page (default: 20). */
35
+ defaultPerPage?: number;
36
+ /** `clamp` (default) bounds out-of-range values; `throw` rejects them with a RangeError. */
37
+ onInvalid?: 'clamp' | 'throw';
38
+ }
22
39
  /**
23
40
  * Normalize pagination parameters with sensible bounds.
24
41
  *
25
42
  * @param params - Raw pagination params
26
- * @param maxPerPage - Maximum allowed per_page (default: 100)
27
- * @param defaultPerPage - Default per_page (default: 20)
43
+ * @param maxPerPageOrOptions - Maximum per_page (default: 100), or an options object
44
+ * @param defaultPerPage - Default per_page (default: 20; ignored when an options object is passed)
28
45
  */
29
- export declare function normalizePagination(params?: PaginationParams, maxPerPage?: number, defaultPerPage?: number): NormalizedPagination;
46
+ export declare function normalizePagination(params?: PaginationParams, maxPerPageOrOptions?: number | NormalizePaginationOptions, defaultPerPage?: number): NormalizedPagination;
30
47
  /**
31
48
  * Create pagination metadata from total count and normalized params.
32
49
  */
@@ -42,4 +59,218 @@ export declare function paginateArray<T>(items: T[], params: NormalizedPaginatio
42
59
  data: T[];
43
60
  metadata: PaginationMetadata;
44
61
  };
62
+ /** One fetched page. */
63
+ export interface Page<T> {
64
+ items: T[];
65
+ /** 0-based index of the page in this walk. */
66
+ pageIndex: number;
67
+ /** Total item count when the API reports one. */
68
+ total?: number;
69
+ }
70
+ /** What a strategy extracts from one response. `next` absent = the last page. */
71
+ export interface PageParseResult<T> {
72
+ items: T[];
73
+ total?: number;
74
+ next?: RequestOptions;
75
+ }
76
+ /** How to walk one API's pages. */
77
+ export interface PaginationStrategy<T> {
78
+ readonly name: string;
79
+ /** Decorates the caller's first request (page size, start page). */
80
+ first(request: RequestOptions): RequestOptions;
81
+ /** Extracts the page's items, the total, and the next request (absent = stop). */
82
+ parse(response: HttpResponse<unknown>, request: RequestOptions): PageParseResult<T>;
83
+ }
84
+ export interface PaginateOptions {
85
+ /** Stop after this many pages (default 100, never above HARD_MAX_PAGES). */
86
+ maxPages?: number;
87
+ /**
88
+ * Stop once this many items are collected (the last page is trimmed). Default MCP_MAX_RESULT_ITEMS
89
+ * (100); never above HARD_MAX_COLLECT_ITEMS (100000). `collect()` reports `truncated` when it stopped.
90
+ */
91
+ maxItems?: number;
92
+ }
93
+ export type PaginationStopReason = 'end' | 'maxPages' | 'maxItems' | 'repeated';
94
+ export interface CollectResult<T> {
95
+ items: T[];
96
+ total?: number;
97
+ pages: number;
98
+ /** Why the walk stopped. `repeated` = the API sent the same next request twice. */
99
+ stopReason: PaginationStopReason;
100
+ /** True when the walk stopped before the API's last page. */
101
+ truncated: boolean;
102
+ }
103
+ export interface PageIterator<T> extends AsyncIterable<Page<T>> {
104
+ /** Iterate items across pages. */
105
+ items(): AsyncIterable<T>;
106
+ /** Walk every page (within the caps) and gather the items. */
107
+ collect(): Promise<CollectResult<T>>;
108
+ }
109
+ export declare const DEFAULT_MAX_PAGES = 100;
110
+ /** Absolute ceiling on any walk, whatever the caller asks for. */
111
+ export declare const HARD_MAX_PAGES = 10000;
112
+ /** Extracts the items of a response body. */
113
+ export type ItemsExtractor<T> = (body: unknown) => T[];
114
+ /** Default items extractor: an array body, else the first array under value/items/data/results. */
115
+ export declare function defaultItems<T>(body: unknown): T[];
116
+ /** Reads a non-negative integer header (e.g. `X-Total`, `X-Total-Count`); undefined when absent. */
117
+ export declare function readHeaderTotal(headers: Record<string, string>, name: string): number | undefined;
118
+ interface TotalSource {
119
+ /** Response header carrying the total (e.g. `x-total`, `x-total-count`). */
120
+ totalHeader?: string;
121
+ /** Body field carrying the total (e.g. `@odata.count`, `total`). */
122
+ totalField?: string;
123
+ }
124
+ export interface PagePerPageOptions<T> extends TotalSource {
125
+ /** Page query parameter (default `page`). */
126
+ pageParam?: string;
127
+ /** Page size query parameter (default `per_page`). */
128
+ sizeParam?: string;
129
+ /** Page size (default 100). */
130
+ pageSize?: number;
131
+ /** First page number (default 1). */
132
+ startPage?: number;
133
+ /** Items field name or extractor (default `defaultItems`). */
134
+ items?: string | ItemsExtractor<T>;
135
+ }
136
+ /**
137
+ * Page-number pagination (`page` + `per_page`). Stops on an empty or short page, or once
138
+ * page * size reaches the total (from `totalHeader` / `totalField`).
139
+ */
140
+ export declare function pagePerPage<T>(options?: PagePerPageOptions<T>): PaginationStrategy<T>;
141
+ export interface NextPageHeaderOptions<T> extends TotalSource {
142
+ /** Header naming the next page number (default `x-next-page`); empty or absent = last page. */
143
+ header?: string;
144
+ pageParam?: string;
145
+ sizeParam?: string;
146
+ pageSize?: number;
147
+ items?: string | ItemsExtractor<T>;
148
+ }
149
+ /**
150
+ * Next-page header pagination (GitLab: `X-Next-Page`, empty on the last page; total from `X-Total`,
151
+ * which gitlab.com omits above 10k rows, so the header and not the total drives the walk).
152
+ */
153
+ export declare function nextPageHeader<T>(options?: NextPageHeaderOptions<T>): PaginationStrategy<T>;
154
+ export interface OffsetLimitOptions<T> extends TotalSource {
155
+ offsetParam?: string;
156
+ limitParam?: string;
157
+ /** Page size (default 100). */
158
+ limit?: number;
159
+ /** First offset (default 0). */
160
+ startOffset?: number;
161
+ items?: string | ItemsExtractor<T>;
162
+ }
163
+ /** Offset/limit pagination. Stops on an empty or short page, or once offset + items reaches the total. */
164
+ export declare function offsetLimit<T>(options?: OffsetLimitOptions<T>): PaginationStrategy<T>;
165
+ /** Parses an RFC 8288 (RFC 5988) `Link` header into rel -> URL. Space-separated rels map each. */
166
+ export declare function parseLinkHeader(value: string | undefined): Record<string, string>;
167
+ export interface LinkHeaderOptions<T> extends TotalSource {
168
+ /** Link relation to follow (default `next`). */
169
+ rel?: string;
170
+ items?: string | ItemsExtractor<T>;
171
+ }
172
+ /**
173
+ * RFC 5988 `Link: <url>; rel="next"` pagination (GitLab keyset, GitHub). The next URL is used as-is
174
+ * (it carries its own query), so the caller's query is dropped on follow-up requests.
175
+ */
176
+ export declare function linkHeader<T>(options?: LinkHeaderOptions<T>): PaginationStrategy<T>;
177
+ export interface NextLinkFieldOptions<T> extends TotalSource {
178
+ /** Body field holding the absolute next URL (default `@odata.nextLink`). */
179
+ field?: string;
180
+ /** Items field (default `value`). */
181
+ items?: string | ItemsExtractor<T>;
182
+ }
183
+ /**
184
+ * Body next-link pagination (Microsoft Graph `@odata.nextLink`, total `@odata.count`). The next link
185
+ * is absolute and already contains the API version segment, so it is requested as-is.
186
+ */
187
+ export declare function nextLinkField<T>(options?: NextLinkFieldOptions<T>): PaginationStrategy<T>;
188
+ export interface ContinuationTokenOptions<T> extends TotalSource {
189
+ /** Query parameter that carries the token on the next request (default `continuationToken`). */
190
+ requestParam?: string;
191
+ /** Body field holding the token, or a function of (body, items) (default `continuationToken`). */
192
+ token?: string | ((body: unknown, items: T[]) => string | undefined);
193
+ /** Items field (default `items`). */
194
+ items?: string | ItemsExtractor<T>;
195
+ }
196
+ /**
197
+ * Continuation-token pagination (Nexus `continuationToken`; Trello `before=<last id>` via a token
198
+ * function). Stops when the token is absent or empty, or the page is empty.
199
+ */
200
+ export declare function continuationToken<T>(options?: ContinuationTokenOptions<T>): PaginationStrategy<T>;
201
+ /**
202
+ * Walks pages with a strategy. Each iteration of the returned iterator restarts the walk. Stops at the
203
+ * strategy's last page, `maxPages` (default 100, capped at HARD_MAX_PAGES), `maxItems`, or when the API
204
+ * repeats a next request (a loop).
205
+ */
206
+ export declare function paginateRequests<T>(fetchPage: (request: RequestOptions) => Promise<HttpResponse<unknown>>, request: RequestOptions, strategy: PaginationStrategy<T>, options?: PaginateOptions): PageIterator<T>;
207
+ export type JsonValue = string | number | boolean | null | JsonValue[] | {
208
+ [key: string]: JsonValue;
209
+ };
210
+ export declare const CURSOR_VERSION = 1;
211
+ /** Longest cursor `decodeCursor` accepts (bounded input). */
212
+ export declare const MAX_CURSOR_LENGTH = 2048;
213
+ /** Thrown by `decodeCursor` for a malformed, foreign, or stale cursor. */
214
+ export declare class InvalidCursorError extends Error {
215
+ constructor(reason: string);
216
+ }
217
+ /** Encodes cursor state as an opaque, versioned base64url JSON string. */
218
+ export declare function encodeCursor(data: JsonValue, version?: number): string;
219
+ export interface DecodeCursorOptions<T extends JsonValue> {
220
+ /** Expected version (default CURSOR_VERSION); another version is rejected as stale. */
221
+ version?: number;
222
+ /** Type guard for the payload; a false result is rejected. */
223
+ validate?: (data: JsonValue) => data is T;
224
+ }
225
+ /**
226
+ * Decodes a cursor made by `encodeCursor`. Throws `InvalidCursorError` (message starts with
227
+ * `Invalid cursor:`) for anything else.
228
+ */
229
+ export declare function decodeCursor<T extends JsonValue = JsonValue>(cursor: string, options?: DecodeCursorOptions<T>): T;
230
+ /** Tool result for a bad cursor: `isError` with the error's message (a generic one otherwise). */
231
+ export declare function invalidCursorResult(error: unknown): {
232
+ isError: true;
233
+ content: [{
234
+ type: 'text';
235
+ text: string;
236
+ }];
237
+ };
238
+ /** The one paged result shape list tools return. */
239
+ export interface PagedResult<T> {
240
+ items: T[];
241
+ /** Opaque cursor for the next page; absent on the last page. */
242
+ nextCursor?: string;
243
+ /** Total item count when known. */
244
+ total?: number;
245
+ }
246
+ /**
247
+ * The zod members `pagedResultSchema` uses, as a structural contract: any zod 4.x namespace satisfies
248
+ * it, so a consumer on a different zod copy typechecks without sharing mcp-core's zod identity.
249
+ */
250
+ export interface PagedResultZod {
251
+ object: (...args: never[]) => unknown;
252
+ array: (...args: never[]) => unknown;
253
+ string: (...args: never[]) => unknown;
254
+ number: (...args: never[]) => unknown;
255
+ }
256
+ /**
257
+ * The zod output schema of `PagedResult<item>`. Takes the consumer's `z` so mcp-core never loads zod
258
+ * at runtime: `outputSchema: pagedResultSchema(z, Project)`. The result is the caller's own `z.object`
259
+ * type (its members are not narrowed to the paged shape).
260
+ */
261
+ export declare function pagedResultSchema<Z extends PagedResultZod>(z: Z, item: unknown): ReturnType<Z['object']>;
262
+ export interface CursorPageOptions {
263
+ /** Cursor from the previous page (absent = first page). */
264
+ cursor?: string;
265
+ /** Requested page size (default `defaultLimit`, clamped to 1..maxLimit). */
266
+ limit?: number;
267
+ defaultLimit?: number;
268
+ maxLimit?: number;
269
+ }
270
+ /**
271
+ * Cursor pagination over an in-memory array: returns a `PagedResult` whose `nextCursor` encodes the
272
+ * next offset. Throws `InvalidCursorError` for a bad or out-of-range cursor.
273
+ */
274
+ export declare function paginateArrayByCursor<T>(items: T[], options?: CursorPageOptions): PagedResult<T>;
275
+ export {};
45
276
  //# sourceMappingURL=pagination.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,CAAC,EAAE,gBAAgB,EACzB,UAAU,SAAM,EAChB,cAAc,SAAK,GAClB,oBAAoB,CAItB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,oBAAoB,GAC3B,kBAAkB,CAOpB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAElE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAC7B,KAAK,EAAE,CAAC,EAAE,EACV,MAAM,EAAE,oBAAoB,GAC3B;IAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAAC,QAAQ,EAAE,kBAAkB,CAAA;CAAE,CAO7C"}
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"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"}