@j0hanz/fetch-url-mcp 1.2.0 → 1.3.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 (184) hide show
  1. package/dist/cache.d.ts +9 -3
  2. package/dist/cache.d.ts.map +1 -0
  3. package/dist/cache.js +44 -110
  4. package/dist/cache.js.map +1 -0
  5. package/dist/cli.d.ts +1 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +9 -4
  8. package/dist/cli.js.map +1 -0
  9. package/dist/config.d.ts +2 -3
  10. package/dist/config.d.ts.map +1 -0
  11. package/dist/config.js +18 -25
  12. package/dist/config.js.map +1 -0
  13. package/dist/crypto.d.ts +1 -0
  14. package/dist/crypto.d.ts.map +1 -0
  15. package/dist/crypto.js +1 -0
  16. package/dist/crypto.js.map +1 -0
  17. package/dist/dom-noise-removal.d.ts +2 -1
  18. package/dist/dom-noise-removal.d.ts.map +1 -0
  19. package/dist/dom-noise-removal.js +8 -4
  20. package/dist/dom-noise-removal.js.map +1 -0
  21. package/dist/download.d.ts +4 -0
  22. package/dist/download.d.ts.map +1 -0
  23. package/dist/download.js +106 -0
  24. package/dist/download.js.map +1 -0
  25. package/dist/errors.d.ts +1 -0
  26. package/dist/errors.d.ts.map +1 -0
  27. package/dist/errors.js +1 -0
  28. package/dist/errors.js.map +1 -0
  29. package/dist/examples/mcp-fetch-url-client.js +19 -3
  30. package/dist/examples/mcp-fetch-url-client.js.map +1 -1
  31. package/dist/fetch-content.d.ts +1 -0
  32. package/dist/fetch-content.d.ts.map +1 -0
  33. package/dist/fetch-content.js +14 -14
  34. package/dist/fetch-content.js.map +1 -0
  35. package/dist/fetch-stream.d.ts +1 -0
  36. package/dist/fetch-stream.d.ts.map +1 -0
  37. package/dist/fetch-stream.js +6 -3
  38. package/dist/fetch-stream.js.map +1 -0
  39. package/dist/fetch.d.ts +1 -0
  40. package/dist/fetch.d.ts.map +1 -0
  41. package/dist/fetch.js +120 -51
  42. package/dist/fetch.js.map +1 -0
  43. package/dist/host-normalization.d.ts +1 -0
  44. package/dist/host-normalization.d.ts.map +1 -0
  45. package/dist/host-normalization.js +19 -6
  46. package/dist/host-normalization.js.map +1 -0
  47. package/dist/http/auth.d.ts +35 -0
  48. package/dist/http/auth.d.ts.map +1 -0
  49. package/dist/http/auth.js +283 -0
  50. package/dist/http/auth.js.map +1 -0
  51. package/dist/http/health.d.ts +7 -0
  52. package/dist/http/health.d.ts.map +1 -0
  53. package/dist/http/health.js +166 -0
  54. package/dist/http/health.js.map +1 -0
  55. package/dist/http/helpers.d.ts +58 -0
  56. package/dist/http/helpers.d.ts.map +1 -0
  57. package/dist/http/helpers.js +372 -0
  58. package/dist/http/helpers.js.map +1 -0
  59. package/dist/{http-native.d.ts → http/native.d.ts} +1 -0
  60. package/dist/http/native.d.ts.map +1 -0
  61. package/dist/http/native.js +529 -0
  62. package/dist/http/native.js.map +1 -0
  63. package/dist/http/rate-limit.d.ts +13 -0
  64. package/dist/http/rate-limit.d.ts.map +1 -0
  65. package/dist/http/rate-limit.js +81 -0
  66. package/dist/http/rate-limit.js.map +1 -0
  67. package/dist/index.d.ts +1 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +2 -1
  70. package/dist/index.js.map +1 -0
  71. package/dist/instructions.d.ts +2 -0
  72. package/dist/instructions.d.ts.map +1 -0
  73. package/dist/instructions.js +108 -0
  74. package/dist/instructions.js.map +1 -0
  75. package/dist/ip-blocklist.d.ts +1 -0
  76. package/dist/ip-blocklist.d.ts.map +1 -0
  77. package/dist/ip-blocklist.js +2 -0
  78. package/dist/ip-blocklist.js.map +1 -0
  79. package/dist/json.d.ts +2 -1
  80. package/dist/json.d.ts.map +1 -0
  81. package/dist/json.js +19 -6
  82. package/dist/json.js.map +1 -0
  83. package/dist/language-detection.d.ts +1 -0
  84. package/dist/language-detection.d.ts.map +1 -0
  85. package/dist/language-detection.js +1 -0
  86. package/dist/language-detection.js.map +1 -0
  87. package/dist/markdown-cleanup.d.ts +2 -1
  88. package/dist/markdown-cleanup.d.ts.map +1 -0
  89. package/dist/markdown-cleanup.js +51 -52
  90. package/dist/markdown-cleanup.js.map +1 -0
  91. package/dist/mcp-validator.d.ts +1 -0
  92. package/dist/mcp-validator.d.ts.map +1 -0
  93. package/dist/mcp-validator.js +16 -8
  94. package/dist/mcp-validator.js.map +1 -0
  95. package/dist/mcp.d.ts +2 -2
  96. package/dist/mcp.d.ts.map +1 -0
  97. package/dist/mcp.js +17 -333
  98. package/dist/mcp.js.map +1 -0
  99. package/dist/observability.d.ts +2 -0
  100. package/dist/observability.d.ts.map +1 -0
  101. package/dist/observability.js +30 -5
  102. package/dist/observability.js.map +1 -0
  103. package/dist/prompts.d.ts +1 -0
  104. package/dist/prompts.d.ts.map +1 -0
  105. package/dist/prompts.js +15 -3
  106. package/dist/prompts.js.map +1 -0
  107. package/dist/resources.d.ts +1 -0
  108. package/dist/resources.d.ts.map +1 -0
  109. package/dist/resources.js +30 -23
  110. package/dist/resources.js.map +1 -0
  111. package/dist/server-tuning.d.ts +1 -0
  112. package/dist/server-tuning.d.ts.map +1 -0
  113. package/dist/server-tuning.js +11 -15
  114. package/dist/server-tuning.js.map +1 -0
  115. package/dist/server.d.ts +1 -0
  116. package/dist/server.d.ts.map +1 -0
  117. package/dist/server.js +23 -23
  118. package/dist/server.js.map +1 -0
  119. package/dist/session.d.ts +1 -0
  120. package/dist/session.d.ts.map +1 -0
  121. package/dist/session.js +55 -28
  122. package/dist/session.js.map +1 -0
  123. package/dist/tasks/execution.d.ts +42 -0
  124. package/dist/tasks/execution.d.ts.map +1 -0
  125. package/dist/tasks/execution.js +232 -0
  126. package/dist/tasks/execution.js.map +1 -0
  127. package/dist/{tasks.d.ts → tasks/manager.d.ts} +6 -0
  128. package/dist/tasks/manager.d.ts.map +1 -0
  129. package/dist/{tasks.js → tasks/manager.js} +86 -37
  130. package/dist/tasks/manager.js.map +1 -0
  131. package/dist/tasks/owner.d.ts +33 -0
  132. package/dist/tasks/owner.d.ts.map +1 -0
  133. package/dist/tasks/owner.js +99 -0
  134. package/dist/tasks/owner.js.map +1 -0
  135. package/dist/timer-utils.d.ts +1 -0
  136. package/dist/timer-utils.d.ts.map +1 -0
  137. package/dist/timer-utils.js +12 -5
  138. package/dist/timer-utils.js.map +1 -0
  139. package/dist/tool-errors.d.ts +12 -0
  140. package/dist/tool-errors.d.ts.map +1 -0
  141. package/dist/tool-errors.js +52 -0
  142. package/dist/tool-errors.js.map +1 -0
  143. package/dist/tool-pipeline.d.ts +72 -0
  144. package/dist/tool-pipeline.d.ts.map +1 -0
  145. package/dist/tool-pipeline.js +407 -0
  146. package/dist/tool-pipeline.js.map +1 -0
  147. package/dist/tool-progress.d.ts +32 -0
  148. package/dist/tool-progress.d.ts.map +1 -0
  149. package/dist/tool-progress.js +123 -0
  150. package/dist/tool-progress.js.map +1 -0
  151. package/dist/tools.d.ts +35 -111
  152. package/dist/tools.d.ts.map +1 -0
  153. package/dist/tools.js +93 -566
  154. package/dist/tools.js.map +1 -0
  155. package/dist/{transform.d.ts → transform/transform.d.ts} +2 -1
  156. package/dist/transform/transform.d.ts.map +1 -0
  157. package/dist/{transform.js → transform/transform.js} +73 -769
  158. package/dist/transform/transform.js.map +1 -0
  159. package/dist/{transform-types.d.ts → transform/types.d.ts} +1 -0
  160. package/dist/transform/types.d.ts.map +1 -0
  161. package/dist/{transform-types.js → transform/types.js} +1 -0
  162. package/dist/transform/types.js.map +1 -0
  163. package/dist/transform/worker-pool.d.ts +93 -0
  164. package/dist/transform/worker-pool.d.ts.map +1 -0
  165. package/dist/transform/worker-pool.js +759 -0
  166. package/dist/transform/worker-pool.js.map +1 -0
  167. package/dist/transform/workers/transform-child.d.ts +2 -0
  168. package/dist/transform/workers/transform-child.d.ts.map +1 -0
  169. package/dist/{workers → transform/workers}/transform-child.js +3 -1
  170. package/dist/transform/workers/transform-child.js.map +1 -0
  171. package/dist/transform/workers/transform-worker.d.ts +2 -0
  172. package/dist/transform/workers/transform-worker.d.ts.map +1 -0
  173. package/dist/{workers → transform/workers}/transform-worker.js +2 -1
  174. package/dist/transform/workers/transform-worker.js.map +1 -0
  175. package/dist/type-guards.d.ts +1 -0
  176. package/dist/type-guards.d.ts.map +1 -0
  177. package/dist/type-guards.js +1 -0
  178. package/dist/type-guards.js.map +1 -0
  179. package/package.json +6 -7
  180. package/dist/AGENTS.md +0 -152
  181. package/dist/http-native.js +0 -1320
  182. package/dist/instructions.md +0 -113
  183. package/dist/workers/transform-child.d.ts +0 -1
  184. package/dist/workers/transform-worker.d.ts +0 -1
@@ -0,0 +1,232 @@
1
+ import { ErrorCode, McpError, } from '@modelcontextprotocol/sdk/types.js';
2
+ import { logWarn, runWithRequestContext } from '../observability.js';
3
+ import { FETCH_URL_TOOL_NAME, fetchUrlInputSchema, fetchUrlToolHandler, } from '../tools.js';
4
+ import { taskManager, } from './manager.js';
5
+ import { compact, isRecord, tryReadToolStructuredError, } from './owner.js';
6
+ /* -------------------------------------------------------------------------------------------------
7
+ * Abort-controller management for in-flight task executions
8
+ * ------------------------------------------------------------------------------------------------- */
9
+ const taskAbortControllers = new Map();
10
+ function attachAbortController(taskId) {
11
+ const existing = taskAbortControllers.get(taskId);
12
+ if (existing) {
13
+ taskAbortControllers.delete(taskId);
14
+ }
15
+ const controller = new AbortController();
16
+ taskAbortControllers.set(taskId, controller);
17
+ return controller;
18
+ }
19
+ export function abortTaskExecution(taskId) {
20
+ const controller = taskAbortControllers.get(taskId);
21
+ if (!controller)
22
+ return;
23
+ controller.abort();
24
+ taskAbortControllers.delete(taskId);
25
+ }
26
+ function clearTaskExecution(taskId) {
27
+ taskAbortControllers.delete(taskId);
28
+ }
29
+ export function cancelTasksForOwner(ownerKey, statusMessage = 'The task was cancelled because its owner session ended.') {
30
+ if (!ownerKey)
31
+ return 0;
32
+ const cancelled = taskManager.cancelTasksByOwner(ownerKey, statusMessage);
33
+ for (const task of cancelled) {
34
+ abortTaskExecution(task.taskId);
35
+ }
36
+ return cancelled.length;
37
+ }
38
+ export function abortAllTaskExecutions() {
39
+ for (const taskId of taskAbortControllers.keys())
40
+ abortTaskExecution(taskId);
41
+ }
42
+ export function toTaskSummary(task) {
43
+ return {
44
+ taskId: task.taskId,
45
+ status: task.status,
46
+ ...(task.statusMessage ? { statusMessage: task.statusMessage } : {}),
47
+ createdAt: task.createdAt,
48
+ lastUpdatedAt: task.lastUpdatedAt,
49
+ ttl: task.ttl,
50
+ pollInterval: task.pollInterval,
51
+ };
52
+ }
53
+ export function withRelatedTaskMeta(result, taskId) {
54
+ const relatedTaskMeta = {
55
+ 'io.modelcontextprotocol/related-task': { taskId },
56
+ };
57
+ return {
58
+ ...result,
59
+ _meta: {
60
+ ...result._meta,
61
+ ...relatedTaskMeta,
62
+ },
63
+ };
64
+ }
65
+ export function emitTaskStatusNotification(server, task) {
66
+ if (!server.isConnected())
67
+ return;
68
+ void server.server
69
+ .notification({
70
+ method: 'notifications/tasks/status',
71
+ params: toTaskSummary(task),
72
+ })
73
+ .catch((error) => {
74
+ logWarn('Failed to send task status notification', {
75
+ taskId: task.taskId,
76
+ status: task.status,
77
+ error,
78
+ });
79
+ });
80
+ }
81
+ /* -------------------------------------------------------------------------------------------------
82
+ * Validation helpers
83
+ * ------------------------------------------------------------------------------------------------- */
84
+ function requireFetchUrlArgs(args) {
85
+ const parsed = fetchUrlInputSchema.safeParse(args);
86
+ if (!parsed.success) {
87
+ throw new McpError(ErrorCode.InvalidParams, 'Invalid arguments for fetch-url');
88
+ }
89
+ return parsed.data;
90
+ }
91
+ export function throwTaskNotFound() {
92
+ throw new McpError(ErrorCode.InvalidParams, 'Failed to retrieve task: Task not found');
93
+ }
94
+ function requireFetchUrlToolName(name) {
95
+ if (name === FETCH_URL_TOOL_NAME)
96
+ return;
97
+ throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: '${name}'`);
98
+ }
99
+ /* -------------------------------------------------------------------------------------------------
100
+ * Task result builders
101
+ * ------------------------------------------------------------------------------------------------- */
102
+ function buildRelatedTaskMeta(taskId, meta) {
103
+ return {
104
+ ...(meta ?? {}),
105
+ 'io.modelcontextprotocol/related-task': { taskId },
106
+ };
107
+ }
108
+ function buildCreateTaskResult(task) {
109
+ return {
110
+ task,
111
+ _meta: {
112
+ 'io.modelcontextprotocol/related-task': {
113
+ taskId: task.taskId,
114
+ status: task.status,
115
+ ...(task.statusMessage ? { statusMessage: task.statusMessage } : {}),
116
+ createdAt: task.createdAt,
117
+ lastUpdatedAt: task.lastUpdatedAt,
118
+ ttl: task.ttl,
119
+ pollInterval: task.pollInterval,
120
+ },
121
+ },
122
+ };
123
+ }
124
+ /* -------------------------------------------------------------------------------------------------
125
+ * Execution pipeline
126
+ * ------------------------------------------------------------------------------------------------- */
127
+ function updateWorkingTaskStatus(server, taskId, statusMessage) {
128
+ const current = taskManager.getTask(taskId);
129
+ if (current?.status !== 'working')
130
+ return;
131
+ if (current.statusMessage === statusMessage)
132
+ return;
133
+ taskManager.updateTask(taskId, { statusMessage });
134
+ const updated = taskManager.getTask(taskId);
135
+ if (updated)
136
+ emitTaskStatusNotification(server, updated);
137
+ }
138
+ async function runFetchTaskExecution(params) {
139
+ const { server, taskId, args, meta, sendNotification } = params;
140
+ return runWithRequestContext({ requestId: taskId, operationId: taskId }, async () => {
141
+ const controller = attachAbortController(taskId);
142
+ try {
143
+ const relatedMeta = buildRelatedTaskMeta(taskId, meta);
144
+ const result = await fetchUrlToolHandler(args, {
145
+ signal: controller.signal,
146
+ requestId: taskId,
147
+ _meta: relatedMeta,
148
+ ...compact({ sendNotification }),
149
+ onProgress: (_progress, message) => {
150
+ updateWorkingTaskStatus(server, taskId, message);
151
+ },
152
+ });
153
+ const isToolError = isRecord(result) &&
154
+ typeof result['isError'] === 'boolean' &&
155
+ result['isError'];
156
+ taskManager.updateTask(taskId, {
157
+ status: isToolError ? 'failed' : 'completed',
158
+ statusMessage: isToolError
159
+ ? (tryReadToolStructuredError(result) ?? 'Tool execution failed')
160
+ : 'Task completed successfully.',
161
+ result,
162
+ });
163
+ const task = taskManager.getTask(taskId);
164
+ if (task)
165
+ emitTaskStatusNotification(server, task);
166
+ }
167
+ catch (error) {
168
+ const errorMessage = error instanceof Error ? error.message : String(error);
169
+ const errorPayload = error instanceof McpError
170
+ ? {
171
+ code: error.code,
172
+ message: errorMessage,
173
+ data: error.data,
174
+ }
175
+ : {
176
+ code: ErrorCode.InternalError,
177
+ message: errorMessage,
178
+ };
179
+ taskManager.updateTask(taskId, {
180
+ status: 'failed',
181
+ statusMessage: errorMessage,
182
+ error: errorPayload,
183
+ });
184
+ const task = taskManager.getTask(taskId);
185
+ if (task)
186
+ emitTaskStatusNotification(server, task);
187
+ }
188
+ finally {
189
+ clearTaskExecution(taskId);
190
+ }
191
+ });
192
+ }
193
+ function handleTaskToolCall(server, params, context) {
194
+ requireFetchUrlToolName(params.name);
195
+ const validArgs = requireFetchUrlArgs(params.arguments);
196
+ const task = taskManager.createTask(params.task?.ttl !== undefined ? { ttl: params.task.ttl } : undefined, 'Task started', context.ownerKey);
197
+ void runFetchTaskExecution({
198
+ server,
199
+ taskId: task.taskId,
200
+ args: validArgs,
201
+ ...compact({
202
+ meta: params._meta,
203
+ sendNotification: context.sendNotification,
204
+ }),
205
+ });
206
+ return buildCreateTaskResult(toTaskSummary(task));
207
+ }
208
+ async function handleDirectToolCall(params, context) {
209
+ const args = requireFetchUrlArgs(params.arguments);
210
+ const extra = {
211
+ ...(context.signal ? { signal: context.signal } : {}),
212
+ ...(context.requestId !== undefined
213
+ ? { requestId: context.requestId }
214
+ : {}),
215
+ ...(context.sendNotification
216
+ ? { sendNotification: context.sendNotification }
217
+ : {}),
218
+ ...(params._meta ? { _meta: params._meta } : {}),
219
+ };
220
+ return fetchUrlToolHandler(args, extra);
221
+ }
222
+ export async function handleToolCallRequest(server, request, context) {
223
+ const { params } = request;
224
+ if (params.task) {
225
+ return handleTaskToolCall(server, params, context);
226
+ }
227
+ if (params.name === FETCH_URL_TOOL_NAME) {
228
+ return handleDirectToolCall(params, context);
229
+ }
230
+ throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${params.name}`);
231
+ }
232
+ //# sourceMappingURL=execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/tasks/execution.ts"],"names":[],"mappings":"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"}
@@ -33,11 +33,15 @@ export interface CreateTaskResult {
33
33
  }
34
34
  declare class TaskManager {
35
35
  private tasks;
36
+ private ownerCounts;
36
37
  private waiters;
37
38
  constructor();
38
39
  private startCleanupLoop;
39
40
  private removeExpiredTasks;
41
+ private removeTask;
40
42
  private countTasksForOwner;
43
+ private incrementOwnerCount;
44
+ private decrementOwnerCount;
41
45
  private assertTaskCapacity;
42
46
  createTask(options?: CreateTaskOptions, statusMessage?: string, ownerKey?: string): TaskState;
43
47
  getTask(taskId: string, ownerKey?: string): TaskState | undefined;
@@ -56,8 +60,10 @@ declare class TaskManager {
56
60
  waitForTerminalTask(taskId: string, ownerKey: string, signal?: AbortSignal): Promise<TaskState | undefined>;
57
61
  private notifyWaiters;
58
62
  private isExpired;
63
+ shrinkTtlAfterDelivery(taskId: string): void;
59
64
  private encodeCursor;
60
65
  private decodeCursor;
61
66
  }
62
67
  export declare const taskManager: TaskManager;
63
68
  export {};
69
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/tasks/manager.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,10 @@
1
+ import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
1
2
  import { AsyncLocalStorage } from 'node:async_hooks';
2
3
  import { Buffer } from 'node:buffer';
3
4
  import { randomUUID } from 'node:crypto';
4
5
  import { setInterval } from 'node:timers';
5
- import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
6
- import { config } from './config.js';
7
- import { createUnrefTimeout } from './timer-utils.js';
6
+ import { config } from '../config.js';
7
+ import { createUnrefTimeout } from '../timer-utils.js';
8
8
  const DEFAULT_TTL_MS = 60_000;
9
9
  const MIN_TTL_MS = 1_000;
10
10
  const MAX_TTL_MS = 86_400_000;
@@ -13,6 +13,7 @@ const DEFAULT_OWNER_KEY = 'default';
13
13
  const DEFAULT_PAGE_SIZE = 50;
14
14
  const CLEANUP_INTERVAL_MS = 60_000;
15
15
  const MAX_CURSOR_LENGTH = 256;
16
+ const RESULT_DELIVERY_GRACE_MS = 10_000;
16
17
  function isTerminalStatus(status) {
17
18
  return (status === 'completed' || status === 'failed' || status === 'cancelled');
18
19
  }
@@ -28,6 +29,7 @@ function normalizeTaskTtl(ttl) {
28
29
  }
29
30
  class TaskManager {
30
31
  tasks = new Map();
32
+ ownerCounts = new Map();
31
33
  waiters = new Map();
32
34
  constructor() {
33
35
  this.startCleanupLoop();
@@ -40,19 +42,37 @@ class TaskManager {
40
42
  }
41
43
  removeExpiredTasks() {
42
44
  const now = Date.now();
45
+ const expired = [];
43
46
  for (const [id, task] of this.tasks) {
44
47
  if (this.isExpired(task, now)) {
45
- this.tasks.delete(id);
48
+ expired.push(id);
46
49
  }
47
50
  }
51
+ for (const id of expired) {
52
+ this.removeTask(id);
53
+ }
54
+ }
55
+ removeTask(taskId) {
56
+ const task = this.tasks.get(taskId);
57
+ if (!task)
58
+ return false;
59
+ this.tasks.delete(taskId);
60
+ this.decrementOwnerCount(task.ownerKey);
61
+ return true;
48
62
  }
49
63
  countTasksForOwner(ownerKey) {
50
- let count = 0;
51
- for (const task of this.tasks.values()) {
52
- if (task.ownerKey === ownerKey)
53
- count += 1;
64
+ return this.ownerCounts.get(ownerKey) ?? 0;
65
+ }
66
+ incrementOwnerCount(ownerKey) {
67
+ this.ownerCounts.set(ownerKey, (this.ownerCounts.get(ownerKey) ?? 0) + 1);
68
+ }
69
+ decrementOwnerCount(ownerKey) {
70
+ const previousCount = this.ownerCounts.get(ownerKey) ?? 0;
71
+ if (previousCount > 1) {
72
+ this.ownerCounts.set(ownerKey, previousCount - 1);
73
+ return;
54
74
  }
55
- return count;
75
+ this.ownerCounts.delete(ownerKey);
56
76
  }
57
77
  assertTaskCapacity(ownerKey) {
58
78
  const { maxPerOwner, maxTotal } = config.tasks;
@@ -81,6 +101,7 @@ class TaskManager {
81
101
  _createdAtMs: now.getTime(),
82
102
  };
83
103
  this.tasks.set(task.taskId, task);
104
+ this.incrementOwnerCount(ownerKey);
84
105
  return task;
85
106
  }
86
107
  getTask(taskId, ownerKey) {
@@ -90,7 +111,7 @@ class TaskManager {
90
111
  if (ownerKey && task.ownerKey !== ownerKey)
91
112
  return undefined;
92
113
  if (this.isExpired(task)) {
93
- this.tasks.delete(taskId);
114
+ this.removeTask(taskId);
94
115
  return undefined;
95
116
  }
96
117
  return task;
@@ -133,47 +154,64 @@ class TaskManager {
133
154
  status: 'cancelled',
134
155
  statusMessage,
135
156
  });
136
- const updated = this.tasks.get(task.taskId);
137
- if (updated)
138
- cancelled.push(updated);
157
+ cancelled.push(task);
139
158
  }
140
159
  return cancelled;
141
160
  }
142
- collectPage(ownerKey, startIndex, pageSize) {
161
+ collectPage(ownerKey, anchorTaskId, pageSize) {
143
162
  const page = [];
144
- let currentIndex = 0;
163
+ let collecting = anchorTaskId === null;
164
+ let anchorFound = anchorTaskId === null;
145
165
  const now = Date.now();
166
+ const expired = [];
146
167
  for (const task of this.tasks.values()) {
147
168
  if (task.ownerKey !== ownerKey)
148
169
  continue;
149
170
  if (this.isExpired(task, now)) {
150
- this.tasks.delete(task.taskId);
171
+ expired.push(task.taskId);
151
172
  continue;
152
173
  }
153
- if (currentIndex >= startIndex) {
154
- page.push(task);
155
- if (page.length > pageSize) {
156
- break;
174
+ if (!collecting) {
175
+ if (task.taskId === anchorTaskId) {
176
+ anchorFound = true;
177
+ collecting = true;
157
178
  }
179
+ continue;
158
180
  }
159
- currentIndex++;
181
+ page.push(task);
182
+ if (page.length > pageSize)
183
+ break;
184
+ }
185
+ for (const id of expired) {
186
+ this.removeTask(id);
187
+ }
188
+ // Anchor task expired between pages; return empty list so callers stop
189
+ // pagination cleanly. Silently falling back to page 0 risks infinite loops
190
+ // for automated clients that always follow nextCursor.
191
+ if (!anchorFound) {
192
+ return [];
160
193
  }
161
194
  return page;
162
195
  }
163
196
  listTasks(options) {
164
197
  const { ownerKey, cursor, limit } = options;
165
198
  const pageSize = limit && limit > 0 ? limit : DEFAULT_PAGE_SIZE;
166
- const startIndex = cursor ? this.decodeCursor(cursor) : 0;
167
- if (startIndex === null) {
168
- throw new McpError(ErrorCode.InvalidParams, 'Invalid cursor');
199
+ let anchorTaskId = null;
200
+ if (cursor !== undefined) {
201
+ const decoded = this.decodeCursor(cursor);
202
+ if (decoded === null) {
203
+ throw new McpError(ErrorCode.InvalidParams, 'Invalid cursor');
204
+ }
205
+ ({ anchorTaskId } = decoded);
169
206
  }
170
- const page = this.collectPage(ownerKey, startIndex, pageSize);
207
+ const page = this.collectPage(ownerKey, anchorTaskId, pageSize);
171
208
  const hasMore = page.length > pageSize;
172
209
  if (hasMore) {
173
210
  page.pop();
174
211
  }
175
- const nextCursor = hasMore
176
- ? this.encodeCursor(startIndex + page.length)
212
+ const lastTask = page.at(-1);
213
+ const nextCursor = hasMore && lastTask !== undefined
214
+ ? this.encodeCursor(lastTask.taskId)
177
215
  : undefined;
178
216
  return nextCursor ? { tasks: page, nextCursor } : { tasks: page };
179
217
  }
@@ -184,7 +222,7 @@ class TaskManager {
184
222
  if (ownerKey && task.ownerKey !== ownerKey)
185
223
  return undefined;
186
224
  if (this.isExpired(task)) {
187
- this.tasks.delete(taskId);
225
+ this.removeTask(taskId);
188
226
  return undefined;
189
227
  }
190
228
  if (isTerminalStatus(task.status))
@@ -192,7 +230,7 @@ class TaskManager {
192
230
  const deadlineMs = task._createdAtMs + task.ttl;
193
231
  const now = Date.now();
194
232
  if (deadlineMs <= now) {
195
- this.tasks.delete(taskId);
233
+ this.removeTask(taskId);
196
234
  return undefined;
197
235
  }
198
236
  return new Promise((resolve, reject) => {
@@ -267,7 +305,7 @@ class TaskManager {
267
305
  settleOnce(() => {
268
306
  cleanup();
269
307
  removeWaiter();
270
- this.tasks.delete(taskId);
308
+ this.removeTask(taskId);
271
309
  resolveInContext(undefined);
272
310
  });
273
311
  })
@@ -287,20 +325,30 @@ class TaskManager {
287
325
  isExpired(task, now = Date.now()) {
288
326
  return now - task._createdAtMs > task.ttl;
289
327
  }
290
- encodeCursor(index) {
291
- return Buffer.from(String(index), 'utf8').toString('base64url');
328
+ shrinkTtlAfterDelivery(taskId) {
329
+ const task = this.tasks.get(taskId);
330
+ if (!task)
331
+ return;
332
+ if (!isTerminalStatus(task.status))
333
+ return;
334
+ const elapsed = Date.now() - task._createdAtMs;
335
+ const newTtl = elapsed + RESULT_DELIVERY_GRACE_MS;
336
+ if (newTtl < task.ttl) {
337
+ task.ttl = newTtl;
338
+ }
339
+ }
340
+ encodeCursor(taskId) {
341
+ return Buffer.from(taskId, 'utf8').toString('base64url');
292
342
  }
293
343
  decodeCursor(cursor) {
294
344
  try {
295
345
  if (!isValidBase64UrlCursor(cursor))
296
346
  return null;
297
347
  const decoded = Buffer.from(cursor, 'base64url').toString('utf8');
298
- if (!/^\d+$/u.test(decoded))
299
- return null;
300
- const value = Number.parseInt(decoded, 10);
301
- if (!Number.isFinite(value) || value < 0)
348
+ // Basic sanity: non-empty and plausible taskId length (UUIDs are 36 chars)
349
+ if (!decoded || decoded.length > 128)
302
350
  return null;
303
- return value;
351
+ return { anchorTaskId: decoded };
304
352
  }
305
353
  catch {
306
354
  return null;
@@ -325,3 +373,4 @@ function isValidBase64UrlCursor(cursor) {
325
373
  return cursor.length % 4 !== 1;
326
374
  }
327
375
  export const taskManager = new TaskManager();
376
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/tasks/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { ServerResult } from '@modelcontextprotocol/sdk/types.js';
2
+ import type { ProgressNotification } from '../tools.js';
3
+ export interface HandlerExtra {
4
+ sessionId?: string;
5
+ authInfo?: {
6
+ clientId?: string;
7
+ token?: string;
8
+ };
9
+ signal?: AbortSignal;
10
+ requestId?: string | number;
11
+ sendNotification?: (notification: ProgressNotification) => Promise<void>;
12
+ }
13
+ export interface ToolCallContext {
14
+ ownerKey: string;
15
+ signal?: AbortSignal;
16
+ requestId?: string | number;
17
+ sendNotification?: (notification: ProgressNotification) => Promise<void>;
18
+ }
19
+ declare function isRecord(value: unknown): value is Record<string, unknown>;
20
+ /** Strip keys whose value is `undefined`, returning an object with only the
21
+ * present keys. Return type correctly omits the `undefined` union so the result
22
+ * is compatible with `exactOptionalPropertyTypes`. */
23
+ type Compacted<T extends object> = {
24
+ [K in keyof T as Exclude<T[K], undefined> extends never ? never : K]?: Exclude<T[K], undefined>;
25
+ };
26
+ export declare function compact<T extends object>(obj: T): Compacted<T>;
27
+ export declare function parseHandlerExtra(extra: unknown): HandlerExtra | undefined;
28
+ export declare function resolveTaskOwnerKey(extra?: HandlerExtra): string;
29
+ export declare function resolveToolCallContext(extra?: HandlerExtra): ToolCallContext;
30
+ export declare function isServerResult(value: unknown): value is ServerResult;
31
+ export declare function tryReadToolStructuredError(value: unknown): string | undefined;
32
+ export { isRecord };
33
+ //# sourceMappingURL=owner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owner.d.ts","sourceRoot":"","sources":["../../src/tasks/owner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAEvE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAOxD,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,CAAC,YAAY,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1E;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,CAAC,YAAY,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1E;AAED,iBAAS,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAElE;AAED;;sDAEsD;AACtD,KAAK,SAAS,CAAC,CAAC,SAAS,MAAM,IAAI;KAChC,CAAC,IAAI,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,SAAS,KAAK,GACnD,KAAK,GACL,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;CAClC,CAAC;AAEF,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAQ9D;AA2BD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,GAAG,SAAS,CAyB1E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,CAAC,EAAE,YAAY,GAAG,MAAM,CAKhE;AAED,wBAAgB,sBAAsB,CAAC,KAAK,CAAC,EAAE,YAAY,GAAG,eAAe,CAW5E;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAIpE;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAkB7E;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}