@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
package/dist/mcp.js CHANGED
@@ -1,10 +1,12 @@
1
+ import { CallToolRequestSchema, ErrorCode, McpError, } from '@modelcontextprotocol/sdk/types.js';
1
2
  import { randomUUID } from 'node:crypto';
2
3
  import { z } from 'zod';
3
- import { CallToolRequestSchema, ErrorCode, McpError, } from '@modelcontextprotocol/sdk/types.js';
4
- import { logWarn, runWithRequestContext } from './observability.js';
5
- import { taskManager } from './tasks.js';
6
- import { FETCH_URL_TOOL_NAME, fetchUrlInputSchema, fetchUrlToolHandler, } from './tools.js';
7
- import { isObject } from './type-guards.js';
4
+ import { runWithRequestContext } from './observability.js';
5
+ import { abortTaskExecution, emitTaskStatusNotification, handleToolCallRequest, throwTaskNotFound, toTaskSummary, withRelatedTaskMeta, } from './tasks/execution.js';
6
+ import { taskManager } from './tasks/manager.js';
7
+ import { isServerResult, parseHandlerExtra, resolveTaskOwnerKey, resolveToolCallContext, } from './tasks/owner.js';
8
+ // Re-export public API so existing consumers (tests, other modules) keep working.
9
+ export { cancelTasksForOwner, abortAllTaskExecutions, } from './tasks/execution.js';
8
10
  /* -------------------------------------------------------------------------------------------------
9
11
  * Tasks API schemas
10
12
  * ------------------------------------------------------------------------------------------------- */
@@ -37,6 +39,9 @@ const TaskResultSchema = z
37
39
  params: z.object({ taskId: z.string() }).loose(),
38
40
  })
39
41
  .loose();
42
+ /* -------------------------------------------------------------------------------------------------
43
+ * Tool call interception (tools/call) with task support
44
+ * ------------------------------------------------------------------------------------------------- */
40
45
  const MIN_TASK_TTL_MS = 1_000;
41
46
  const MAX_TASK_TTL_MS = 86_400_000;
42
47
  const ExtendedCallToolRequestSchema = z
@@ -77,293 +82,6 @@ function parseExtendedCallToolRequest(request) {
77
82
  return parsed.data;
78
83
  throw new McpError(ErrorCode.InvalidParams, 'Invalid tool request');
79
84
  }
80
- function isRecord(value) {
81
- return isObject(value);
82
- }
83
- function normalizeSendNotification(sendNotification) {
84
- if (typeof sendNotification !== 'function')
85
- return undefined;
86
- const notify = sendNotification;
87
- return async (notification) => {
88
- await Promise.resolve(notify(notification));
89
- };
90
- }
91
- function parseHandlerExtra(extra) {
92
- if (!isObject(extra))
93
- return undefined;
94
- const parsed = {};
95
- const { sessionId, authInfo, signal, requestId, sendNotification } = extra;
96
- if (typeof sessionId === 'string')
97
- parsed.sessionId = sessionId;
98
- if (isObject(authInfo)) {
99
- const { clientId, token } = authInfo;
100
- const normalized = {};
101
- if (typeof clientId === 'string')
102
- normalized.clientId = clientId;
103
- if (typeof token === 'string')
104
- normalized.token = token;
105
- if (normalized.clientId || normalized.token)
106
- parsed.authInfo = normalized;
107
- }
108
- if (signal instanceof AbortSignal)
109
- parsed.signal = signal;
110
- if (typeof requestId === 'string' || typeof requestId === 'number') {
111
- parsed.requestId = requestId;
112
- }
113
- const normalizedSendNotification = normalizeSendNotification(sendNotification);
114
- if (normalizedSendNotification) {
115
- parsed.sendNotification = normalizedSendNotification;
116
- }
117
- return parsed;
118
- }
119
- function isServerResult(value) {
120
- return (isObject(value) && Array.isArray(value.content));
121
- }
122
- function tryReadToolStructuredError(value) {
123
- if (!isObject(value))
124
- return undefined;
125
- const record = value;
126
- if (!isObject(record.structuredContent))
127
- return undefined;
128
- const structured = record.structuredContent;
129
- return typeof structured.error === 'string' ? structured.error : undefined;
130
- }
131
- function resolveTaskOwnerKey(extra) {
132
- if (extra?.sessionId)
133
- return `session:${extra.sessionId}`;
134
- if (extra?.authInfo?.clientId)
135
- return `client:${extra.authInfo.clientId}`;
136
- if (extra?.authInfo?.token)
137
- return `token:${extra.authInfo.token}`;
138
- return 'default';
139
- }
140
- function resolveToolCallContext(extra) {
141
- const context = {
142
- ownerKey: resolveTaskOwnerKey(extra),
143
- };
144
- if (extra?.signal)
145
- context.signal = extra.signal;
146
- if (extra?.requestId !== undefined)
147
- context.requestId = extra.requestId;
148
- if (extra?.sendNotification)
149
- context.sendNotification = extra.sendNotification;
150
- return context;
151
- }
152
- function requireFetchUrlArgs(args) {
153
- const parsed = fetchUrlInputSchema.safeParse(args);
154
- if (!parsed.success) {
155
- throw new McpError(ErrorCode.InvalidParams, 'Invalid arguments for fetch-url');
156
- }
157
- return parsed.data;
158
- }
159
- function throwTaskNotFound() {
160
- throw new McpError(ErrorCode.InvalidParams, 'Failed to retrieve task: Task not found');
161
- }
162
- function requireFetchUrlToolName(name) {
163
- if (name === FETCH_URL_TOOL_NAME)
164
- return;
165
- throw new McpError(ErrorCode.MethodNotFound, `Tool '${name}' does not support task execution`);
166
- }
167
- function buildRelatedTaskMeta(taskId, meta) {
168
- return {
169
- ...(meta ?? {}),
170
- 'io.modelcontextprotocol/related-task': { taskId },
171
- };
172
- }
173
- function buildCreateTaskResult(task) {
174
- return {
175
- task,
176
- _meta: {
177
- 'io.modelcontextprotocol/related-task': {
178
- taskId: task.taskId,
179
- status: task.status,
180
- ...(task.statusMessage ? { statusMessage: task.statusMessage } : {}),
181
- createdAt: task.createdAt,
182
- lastUpdatedAt: task.lastUpdatedAt,
183
- ttl: task.ttl,
184
- pollInterval: task.pollInterval,
185
- },
186
- },
187
- };
188
- }
189
- /**
190
- * Track in-flight task executions so `tasks/cancel` can actually abort work.
191
- * This is intentionally local to this module (no new files, no global singletons elsewhere).
192
- */
193
- const taskAbortControllers = new Map();
194
- function attachAbortController(taskId) {
195
- const existing = taskAbortControllers.get(taskId);
196
- if (existing) {
197
- // Defensive: should not happen, but avoid leaking the old controller.
198
- taskAbortControllers.delete(taskId);
199
- }
200
- const controller = new AbortController();
201
- taskAbortControllers.set(taskId, controller);
202
- return controller;
203
- }
204
- function abortTaskExecution(taskId) {
205
- const controller = taskAbortControllers.get(taskId);
206
- if (!controller)
207
- return;
208
- controller.abort();
209
- taskAbortControllers.delete(taskId);
210
- }
211
- function clearTaskExecution(taskId) {
212
- taskAbortControllers.delete(taskId);
213
- }
214
- export function cancelTasksForOwner(ownerKey, statusMessage = 'The task was cancelled because its owner session ended.') {
215
- if (!ownerKey)
216
- return 0;
217
- const cancelled = taskManager.cancelTasksByOwner(ownerKey, statusMessage);
218
- for (const task of cancelled) {
219
- abortTaskExecution(task.taskId);
220
- }
221
- return cancelled.length;
222
- }
223
- export function abortAllTaskExecutions() {
224
- for (const taskId of taskAbortControllers.keys())
225
- abortTaskExecution(taskId);
226
- }
227
- function buildTaskStatusParams(task) {
228
- return {
229
- taskId: task.taskId,
230
- status: task.status,
231
- ...(task.statusMessage ? { statusMessage: task.statusMessage } : {}),
232
- createdAt: task.createdAt,
233
- lastUpdatedAt: task.lastUpdatedAt,
234
- ttl: task.ttl,
235
- pollInterval: task.pollInterval,
236
- };
237
- }
238
- function emitTaskStatusNotification(server, task) {
239
- if (!server.isConnected())
240
- return;
241
- void server.server
242
- .notification({
243
- method: 'notifications/tasks/status',
244
- params: buildTaskStatusParams(task),
245
- })
246
- .catch((error) => {
247
- logWarn('Failed to send task status notification', {
248
- taskId: task.taskId,
249
- status: task.status,
250
- error,
251
- });
252
- });
253
- }
254
- function updateWorkingTaskStatus(server, taskId, statusMessage) {
255
- const current = taskManager.getTask(taskId);
256
- if (current?.status !== 'working')
257
- return;
258
- if (current.statusMessage === statusMessage)
259
- return;
260
- taskManager.updateTask(taskId, { statusMessage });
261
- const updated = taskManager.getTask(taskId);
262
- if (updated)
263
- emitTaskStatusNotification(server, updated);
264
- }
265
- async function runFetchTaskExecution(params) {
266
- const { server, taskId, args, meta, sendNotification } = params;
267
- return runWithRequestContext({ requestId: taskId, operationId: taskId }, async () => {
268
- const controller = attachAbortController(taskId);
269
- try {
270
- const relatedMeta = buildRelatedTaskMeta(taskId, meta);
271
- const result = await fetchUrlToolHandler(args, {
272
- signal: controller.signal,
273
- requestId: taskId, // Correlation
274
- _meta: relatedMeta,
275
- ...(sendNotification ? { sendNotification } : {}),
276
- onProgress: (_progress, message) => {
277
- updateWorkingTaskStatus(server, taskId, message);
278
- },
279
- });
280
- const isToolError = isRecord(result) &&
281
- typeof result['isError'] === 'boolean' &&
282
- result['isError'];
283
- taskManager.updateTask(taskId, {
284
- status: isToolError ? 'failed' : 'completed',
285
- statusMessage: isToolError
286
- ? (tryReadToolStructuredError(result) ?? 'Tool execution failed')
287
- : 'Task completed successfully.',
288
- result,
289
- });
290
- const task = taskManager.getTask(taskId);
291
- if (task)
292
- emitTaskStatusNotification(server, task);
293
- }
294
- catch (error) {
295
- const errorMessage = error instanceof Error ? error.message : String(error);
296
- const errorPayload = error instanceof McpError
297
- ? {
298
- code: error.code,
299
- message: errorMessage,
300
- data: error.data,
301
- }
302
- : {
303
- code: ErrorCode.InternalError,
304
- message: errorMessage,
305
- };
306
- taskManager.updateTask(taskId, {
307
- status: 'failed',
308
- statusMessage: errorMessage,
309
- error: errorPayload,
310
- });
311
- const task = taskManager.getTask(taskId);
312
- if (task)
313
- emitTaskStatusNotification(server, task);
314
- }
315
- finally {
316
- clearTaskExecution(taskId);
317
- }
318
- });
319
- }
320
- function handleTaskToolCall(server, params, context) {
321
- requireFetchUrlToolName(params.name);
322
- const validArgs = requireFetchUrlArgs(params.arguments);
323
- const task = taskManager.createTask(params.task?.ttl !== undefined ? { ttl: params.task.ttl } : undefined, 'Task started', context.ownerKey);
324
- void runFetchTaskExecution({
325
- server,
326
- taskId: task.taskId,
327
- args: validArgs,
328
- ...(params._meta ? { meta: params._meta } : {}),
329
- ...(context.sendNotification
330
- ? { sendNotification: context.sendNotification }
331
- : {}),
332
- });
333
- return buildCreateTaskResult({
334
- taskId: task.taskId,
335
- status: task.status,
336
- ...(task.statusMessage ? { statusMessage: task.statusMessage } : {}),
337
- createdAt: task.createdAt,
338
- lastUpdatedAt: task.lastUpdatedAt,
339
- ttl: task.ttl,
340
- pollInterval: task.pollInterval,
341
- });
342
- }
343
- async function handleDirectToolCall(params, context) {
344
- const args = requireFetchUrlArgs(params.arguments);
345
- const extra = {
346
- ...(context.signal ? { signal: context.signal } : {}),
347
- ...(context.requestId !== undefined
348
- ? { requestId: context.requestId }
349
- : {}),
350
- ...(context.sendNotification
351
- ? { sendNotification: context.sendNotification }
352
- : {}),
353
- ...(params._meta ? { _meta: params._meta } : {}),
354
- };
355
- return fetchUrlToolHandler(args, extra);
356
- }
357
- async function handleToolCallRequest(server, request, context) {
358
- const { params } = request;
359
- if (params.task) {
360
- return handleTaskToolCall(server, params, context);
361
- }
362
- if (params.name === FETCH_URL_TOOL_NAME) {
363
- return handleDirectToolCall(params, context);
364
- }
365
- throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${params.name}`);
366
- }
367
85
  /* -------------------------------------------------------------------------------------------------
368
86
  * Register handlers
369
87
  * ------------------------------------------------------------------------------------------------- */
@@ -391,15 +109,7 @@ export function registerTaskHandlers(server) {
391
109
  const task = taskManager.getTask(taskId, ownerKey);
392
110
  if (!task)
393
111
  throwTaskNotFound();
394
- return Promise.resolve({
395
- taskId: task.taskId,
396
- status: task.status,
397
- statusMessage: task.statusMessage,
398
- createdAt: task.createdAt,
399
- lastUpdatedAt: task.lastUpdatedAt,
400
- ttl: task.ttl,
401
- pollInterval: task.pollInterval,
402
- });
112
+ return Promise.resolve(toTaskSummary(task));
403
113
  });
404
114
  server.server.setRequestHandler(TaskResultSchema, async (request, extra) => {
405
115
  const { taskId } = request.params;
@@ -408,6 +118,7 @@ export function registerTaskHandlers(server) {
408
118
  const task = await taskManager.waitForTerminalTask(taskId, ownerKey, parsedExtra?.signal);
409
119
  if (!task)
410
120
  throwTaskNotFound();
121
+ taskManager.shrinkTtlAfterDelivery(taskId);
411
122
  if (task.status === 'failed') {
412
123
  if (task.error) {
413
124
  throw new McpError(task.error.code, task.error.message, task.error.data);
@@ -422,13 +133,7 @@ export function registerTaskHandlers(server) {
422
133
  ],
423
134
  isError: true,
424
135
  };
425
- return Promise.resolve({
426
- ...fallback,
427
- _meta: {
428
- ...fallback._meta,
429
- 'io.modelcontextprotocol/related-task': { taskId: task.taskId },
430
- },
431
- });
136
+ return Promise.resolve(withRelatedTaskMeta(fallback, task.taskId));
432
137
  }
433
138
  if (task.status === 'cancelled') {
434
139
  throw new McpError(ErrorCode.InvalidRequest, 'Task was cancelled');
@@ -436,13 +141,7 @@ export function registerTaskHandlers(server) {
436
141
  const result = isServerResult(task.result)
437
142
  ? task.result
438
143
  : { content: [] };
439
- return Promise.resolve({
440
- ...result,
441
- _meta: {
442
- ...result._meta,
443
- 'io.modelcontextprotocol/related-task': { taskId: task.taskId },
444
- },
445
- });
144
+ return Promise.resolve(withRelatedTaskMeta(result, task.taskId));
446
145
  });
447
146
  server.server.setRequestHandler(TaskListSchema, async (request, extra) => {
448
147
  const parsedExtra = parseHandlerExtra(extra);
@@ -450,14 +149,7 @@ export function registerTaskHandlers(server) {
450
149
  const cursor = request.params?.cursor;
451
150
  const { tasks, nextCursor } = taskManager.listTasks(cursor === undefined ? { ownerKey } : { ownerKey, cursor });
452
151
  return Promise.resolve({
453
- tasks: tasks.map((t) => ({
454
- taskId: t.taskId,
455
- status: t.status,
456
- createdAt: t.createdAt,
457
- lastUpdatedAt: t.lastUpdatedAt,
458
- ttl: t.ttl,
459
- pollInterval: t.pollInterval,
460
- })),
152
+ tasks: tasks.map((task) => toTaskSummary(task)),
461
153
  nextCursor,
462
154
  });
463
155
  });
@@ -468,17 +160,9 @@ export function registerTaskHandlers(server) {
468
160
  const task = taskManager.cancelTask(taskId, ownerKey);
469
161
  if (!task)
470
162
  throwTaskNotFound();
471
- // Make cancellation actionable: abort any in-flight execution.
472
163
  abortTaskExecution(taskId);
473
164
  emitTaskStatusNotification(server, task);
474
- return Promise.resolve({
475
- taskId: task.taskId,
476
- status: task.status,
477
- statusMessage: task.statusMessage,
478
- createdAt: task.createdAt,
479
- lastUpdatedAt: task.lastUpdatedAt,
480
- ttl: task.ttl,
481
- pollInterval: task.pollInterval,
482
- });
165
+ return Promise.resolve(toTaskSummary(task));
483
166
  });
484
167
  }
168
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
@@ -17,5 +17,7 @@ export declare function logInfo(message: string, meta?: LogMetadata): void;
17
17
  export declare function logDebug(message: string, meta?: LogMetadata): void;
18
18
  export declare function logWarn(message: string, meta?: LogMetadata): void;
19
19
  export declare function logError(message: string, error?: Error | LogMetadata): void;
20
+ export declare function setLogLevel(level: string): void;
20
21
  export declare function redactUrl(rawUrl: string): string;
21
22
  export {};
23
+ //# sourceMappingURL=observability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../src/observability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQzE,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3C,UAAU,cAAc;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAaD,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAEpD;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,SAAS,GAChB,IAAI,CAGN;AAED,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAGlE;AAED,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAK1E;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,SAAS,GAChB,MAAM,GAAG,SAAS,CAKpB;AAED,wBAAgB,qBAAqB,CAAC,CAAC,EACrC,OAAO,EAAE,cAAc,EACvB,EAAE,EAAE,MAAM,CAAC,GACV,CAAC,CAEH;AAMD,wBAAgB,YAAY,IAAI,MAAM,GAAG,SAAS,CAEjD;AAMD,wBAAgB,cAAc,IAAI,MAAM,GAAG,SAAS,CAEnD;AA4JD,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,IAAI,CAEjE;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,IAAI,CAElE;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,IAAI,CAEjE;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG,IAAI,CAM3E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAiB/C;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAWhD"}
@@ -108,12 +108,14 @@ function formatLogEntry(level, message, meta) {
108
108
  }
109
109
  return `[${createTimestamp()}] ${level.toUpperCase()}: ${message}${formatMetadata(meta)}`;
110
110
  }
111
+ const LEVEL_PRIORITY = {
112
+ debug: 0,
113
+ info: 1,
114
+ warn: 2,
115
+ error: 3,
116
+ };
111
117
  function shouldLog(level) {
112
- // Debug logs only when LOG_LEVEL=debug
113
- if (level === 'debug')
114
- return isDebugEnabled();
115
- // All other levels always log
116
- return true;
118
+ return LEVEL_PRIORITY[level] >= LEVEL_PRIORITY[config.logging.level];
117
119
  }
118
120
  function mapToMcpLevel(level) {
119
121
  switch (level) {
@@ -161,10 +163,13 @@ function writeLog(level, message, meta) {
161
163
  : mcpServer;
162
164
  if (!server)
163
165
  return;
166
+ if (!server.isConnected())
167
+ return;
164
168
  try {
165
169
  server.server
166
170
  .sendLoggingMessage({
167
171
  level: mapToMcpLevel(level),
172
+ logger: 'fetch-url-mcp',
168
173
  // Preserve existing behavior: MCP payload includes only message + provided meta (not ALS context meta).
169
174
  data: meta ? { message, ...meta } : message,
170
175
  }, sessionId)
@@ -197,6 +202,25 @@ export function logError(message, error) {
197
202
  : (error ?? {});
198
203
  writeLog('error', message, errorMeta);
199
204
  }
205
+ export function setLogLevel(level) {
206
+ const normalized = level.toLowerCase();
207
+ // Map MCP logging levels (RFC 5424 subset) to internal levels.
208
+ if (normalized === 'debug') {
209
+ config.logging.level = 'debug';
210
+ }
211
+ else if (normalized === 'info' || normalized === 'notice') {
212
+ config.logging.level = 'info';
213
+ }
214
+ else if (normalized === 'warning' || normalized === 'warn') {
215
+ config.logging.level = 'warn';
216
+ }
217
+ else if (normalized === 'error' ||
218
+ normalized === 'critical' ||
219
+ normalized === 'alert' ||
220
+ normalized === 'emergency') {
221
+ config.logging.level = 'error';
222
+ }
223
+ }
200
224
  export function redactUrl(rawUrl) {
201
225
  try {
202
226
  const url = new URL(rawUrl);
@@ -210,3 +234,4 @@ export function redactUrl(rawUrl) {
210
234
  return rawUrl;
211
235
  }
212
236
  }
237
+ //# sourceMappingURL=observability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.js","sourceRoot":"","sources":["../src/observability.ts"],"names":[],"mappings":"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"}
package/dist/prompts.d.ts CHANGED
@@ -5,3 +5,4 @@ interface IconInfo {
5
5
  }
6
6
  export declare function registerGetHelpPrompt(server: McpServer, instructions: string, iconInfo?: IconInfo): void;
7
7
  export {};
8
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,UAAU,QAAQ;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAgBD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,QAAQ,GAClB,IAAI,CAwBN"}
package/dist/prompts.js CHANGED
@@ -1,10 +1,21 @@
1
+ function buildOptionalPromptIcons(iconInfo) {
2
+ if (!iconInfo)
3
+ return {};
4
+ return {
5
+ icons: [
6
+ {
7
+ src: iconInfo.src,
8
+ mimeType: iconInfo.mimeType,
9
+ },
10
+ ],
11
+ };
12
+ }
1
13
  export function registerGetHelpPrompt(server, instructions, iconInfo) {
2
- const description = 'Return the Fetch URL usage instructions.';
3
- const iconConfig = iconInfo ? { icons: [{ ...iconInfo }] } : {};
14
+ const description = 'Return Fetch URL server instructions: how to fetch URLs, handle truncated content, recover full content via cacheResourceUri, use task mode for long pages, and route errors by code.';
4
15
  server.registerPrompt('get-help', {
5
16
  title: 'Get Help',
6
17
  description,
7
- ...iconConfig,
18
+ ...buildOptionalPromptIcons(iconInfo),
8
19
  }, () => ({
9
20
  description,
10
21
  messages: [
@@ -18,3 +29,4 @@ export function registerGetHelpPrompt(server, instructions, iconInfo) {
18
29
  ],
19
30
  }));
20
31
  }
32
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAQA,SAAS,wBAAwB,CAC/B,QAAmB;IAEnB,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzB,OAAO;QACL,KAAK,EAAE;YACL;gBACE,GAAG,EAAE,QAAQ,CAAC,GAAG;gBACjB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;aAC5B;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,YAAoB,EACpB,QAAmB;IAEnB,MAAM,WAAW,GACf,uLAAuL,CAAC;IAE1L,MAAM,CAAC,cAAc,CACnB,UAAU,EACV;QACE,KAAK,EAAE,UAAU;QACjB,WAAW;QACX,GAAG,wBAAwB,CAAC,QAAQ,CAAC;KACtC,EACD,GAAoB,EAAE,CAAC,CAAC;QACtB,WAAW;QACX,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,YAAY;iBACnB;aACF;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -6,3 +6,4 @@ interface IconInfo {
6
6
  export declare function registerInstructionResource(server: McpServer, instructions: string, iconInfo?: IconInfo): void;
7
7
  export declare function registerCacheResourceTemplate(server: McpServer, iconInfo?: IconInfo): void;
8
8
  export {};
9
+ //# sourceMappingURL=resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EAEf,MAAM,yCAAyC,CAAC;AAqBjD,UAAU,QAAQ;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAgVD,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,QAAQ,GAClB,IAAI,CAwBN;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,SAAS,EACjB,QAAQ,CAAC,EAAE,QAAQ,GAClB,IAAI,CA4BN"}