@j0hanz/fetch-url-mcp 1.3.1 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -21
- package/dist/cli.d.ts +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +15 -7
- package/dist/cli.js.map +1 -1
- package/dist/http/auth.d.ts +1 -3
- package/dist/http/auth.d.ts.map +1 -1
- package/dist/http/auth.js +18 -12
- package/dist/http/auth.js.map +1 -1
- package/dist/http/health.d.ts +1 -1
- package/dist/http/health.d.ts.map +1 -1
- package/dist/http/health.js +2 -2
- package/dist/http/health.js.map +1 -1
- package/dist/http/helpers.d.ts +1 -8
- package/dist/http/helpers.d.ts.map +1 -1
- package/dist/http/helpers.js +12 -10
- package/dist/http/helpers.js.map +1 -1
- package/dist/http/native.d.ts.map +1 -1
- package/dist/http/native.js +41 -27
- package/dist/http/native.js.map +1 -1
- package/dist/http/rate-limit.d.ts +2 -1
- package/dist/http/rate-limit.d.ts.map +1 -1
- package/dist/http/rate-limit.js +11 -15
- package/dist/http/rate-limit.js.map +1 -1
- package/dist/index.js +4 -6
- package/dist/index.js.map +1 -1
- package/dist/lib/cache.d.ts.map +1 -0
- package/dist/{cache.js → lib/cache.js} +5 -2
- package/dist/lib/cache.js.map +1 -0
- package/dist/{config.d.ts → lib/config.d.ts} +2 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/{config.js → lib/config.js} +3 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/crypto.d.ts.map +1 -0
- package/dist/lib/crypto.js.map +1 -0
- package/dist/lib/dom-noise-removal.d.ts.map +1 -0
- package/dist/lib/dom-noise-removal.js.map +1 -0
- package/dist/lib/download.d.ts.map +1 -0
- package/dist/lib/download.js.map +1 -0
- package/dist/{errors.d.ts → lib/errors.d.ts} +3 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/{errors.js → lib/errors.js} +7 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/fetch-content.d.ts.map +1 -0
- package/dist/lib/fetch-content.js.map +1 -0
- package/dist/lib/fetch-stream.d.ts.map +1 -0
- package/dist/lib/fetch-stream.js.map +1 -0
- package/dist/lib/fetch.d.ts.map +1 -0
- package/dist/{fetch.js → lib/fetch.js} +97 -142
- package/dist/lib/fetch.js.map +1 -0
- package/dist/lib/host-normalization.d.ts.map +1 -0
- package/dist/lib/host-normalization.js.map +1 -0
- package/dist/lib/ip-blocklist.d.ts.map +1 -0
- package/dist/lib/ip-blocklist.js.map +1 -0
- package/dist/lib/json.d.ts.map +1 -0
- package/dist/lib/json.js.map +1 -0
- package/dist/lib/language-detection.d.ts.map +1 -0
- package/dist/lib/language-detection.js.map +1 -0
- package/dist/{markdown-cleanup.d.ts → lib/markdown-cleanup.d.ts} +1 -1
- package/dist/lib/markdown-cleanup.d.ts.map +1 -0
- package/dist/{markdown-cleanup.js → lib/markdown-cleanup.js} +1 -3
- package/dist/lib/markdown-cleanup.js.map +1 -0
- package/dist/lib/mcp-lifecycle.d.ts +5 -0
- package/dist/lib/mcp-lifecycle.d.ts.map +1 -0
- package/dist/lib/mcp-lifecycle.js +51 -0
- package/dist/lib/mcp-lifecycle.js.map +1 -0
- package/dist/lib/mcp-validator.d.ts.map +1 -0
- package/dist/{mcp-validator.js → lib/mcp-validator.js} +1 -1
- package/dist/lib/mcp-validator.js.map +1 -0
- package/dist/{mcp.d.ts → lib/mcp.d.ts} +1 -1
- package/dist/lib/mcp.d.ts.map +1 -0
- package/dist/{mcp.js → lib/mcp.js} +39 -19
- package/dist/lib/mcp.js.map +1 -0
- package/dist/lib/observability.d.ts.map +1 -0
- package/dist/lib/observability.js.map +1 -0
- package/dist/lib/server-tuning.d.ts.map +1 -0
- package/dist/lib/server-tuning.js.map +1 -0
- package/dist/{session.d.ts → lib/session.d.ts} +4 -1
- package/dist/lib/session.d.ts.map +1 -0
- package/dist/{session.js → lib/session.js} +43 -35
- package/dist/lib/session.js.map +1 -0
- package/dist/lib/timer-utils.d.ts +13 -0
- package/dist/lib/timer-utils.d.ts.map +1 -0
- package/dist/lib/timer-utils.js +44 -0
- package/dist/lib/timer-utils.js.map +1 -0
- package/dist/lib/tool-errors.d.ts.map +1 -0
- package/dist/{tool-errors.js → lib/tool-errors.js} +2 -2
- package/dist/lib/tool-errors.js.map +1 -0
- package/dist/{tool-pipeline.d.ts → lib/tool-pipeline.d.ts} +1 -2
- package/dist/lib/tool-pipeline.d.ts.map +1 -0
- package/dist/{tool-pipeline.js → lib/tool-pipeline.js} +8 -25
- package/dist/lib/tool-pipeline.js.map +1 -0
- package/dist/{tool-progress.d.ts → lib/tool-progress.d.ts} +0 -1
- package/dist/lib/tool-progress.d.ts.map +1 -0
- package/dist/{tool-progress.js → lib/tool-progress.js} +1 -1
- package/dist/lib/tool-progress.js.map +1 -0
- package/dist/lib/type-guards.d.ts.map +1 -0
- package/dist/lib/type-guards.js.map +1 -0
- package/dist/{prompts.d.ts → prompts/index.d.ts} +1 -1
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/{prompts.js → prompts/index.js} +2 -2
- package/dist/prompts/index.js.map +1 -0
- package/dist/{resources.d.ts → resources/index.d.ts} +1 -1
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/{resources.js → resources/index.js} +19 -37
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/instructions.d.ts.map +1 -0
- package/dist/{instructions.js → resources/instructions.js} +4 -2
- package/dist/resources/instructions.js.map +1 -0
- package/dist/schemas/inputs.d.ts +8 -0
- package/dist/schemas/inputs.d.ts.map +1 -0
- package/dist/schemas/inputs.js +25 -0
- package/dist/schemas/inputs.js.map +1 -0
- package/dist/schemas/outputs.d.ts +24 -0
- package/dist/schemas/outputs.d.ts.map +1 -0
- package/dist/schemas/outputs.js +78 -0
- package/dist/schemas/outputs.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +25 -14
- package/dist/server.js.map +1 -1
- package/dist/tasks/execution.d.ts.map +1 -1
- package/dist/tasks/execution.js +88 -55
- package/dist/tasks/execution.js.map +1 -1
- package/dist/tasks/manager.d.ts +4 -0
- package/dist/tasks/manager.d.ts.map +1 -1
- package/dist/tasks/manager.js +51 -46
- package/dist/tasks/manager.js.map +1 -1
- package/dist/tasks/owner.d.ts +3 -2
- package/dist/tasks/owner.d.ts.map +1 -1
- package/dist/tasks/owner.js +2 -1
- package/dist/tasks/owner.js.map +1 -1
- package/dist/tasks/tool-registry.d.ts +12 -0
- package/dist/tasks/tool-registry.d.ts.map +1 -0
- package/dist/tasks/tool-registry.js +14 -0
- package/dist/tasks/tool-registry.js.map +1 -0
- package/dist/tools/fetch-url.d.ts +29 -0
- package/dist/tools/fetch-url.d.ts.map +1 -0
- package/dist/{tools.js → tools/fetch-url.js} +72 -132
- package/dist/tools/fetch-url.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +5 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/transform/transform.d.ts.map +1 -1
- package/dist/transform/transform.js +156 -174
- package/dist/transform/transform.js.map +1 -1
- package/dist/transform/types.d.ts +0 -1
- package/dist/transform/types.d.ts.map +1 -1
- package/dist/transform/worker-pool.d.ts.map +1 -1
- package/dist/transform/worker-pool.js +5 -5
- package/dist/transform/worker-pool.js.map +1 -1
- package/dist/transform/workers/shared.d.ts +8 -0
- package/dist/transform/workers/shared.d.ts.map +1 -0
- package/dist/transform/workers/shared.js +131 -0
- package/dist/transform/workers/shared.js.map +1 -0
- package/dist/transform/workers/transform-child.js +5 -134
- package/dist/transform/workers/transform-child.js.map +1 -1
- package/dist/transform/workers/transform-worker.js +7 -127
- package/dist/transform/workers/transform-worker.js.map +1 -1
- package/package.json +8 -7
- package/dist/cache.d.ts.map +0 -1
- package/dist/cache.js.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/crypto.d.ts.map +0 -1
- package/dist/crypto.js.map +0 -1
- package/dist/dom-noise-removal.d.ts.map +0 -1
- package/dist/dom-noise-removal.js.map +0 -1
- package/dist/download.d.ts.map +0 -1
- package/dist/download.js.map +0 -1
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js.map +0 -1
- package/dist/examples/mcp-fetch-url-client.js +0 -329
- package/dist/examples/mcp-fetch-url-client.js.map +0 -1
- package/dist/fetch-content.d.ts.map +0 -1
- package/dist/fetch-content.js.map +0 -1
- package/dist/fetch-stream.d.ts.map +0 -1
- package/dist/fetch-stream.js.map +0 -1
- package/dist/fetch.d.ts.map +0 -1
- package/dist/fetch.js.map +0 -1
- package/dist/host-normalization.d.ts.map +0 -1
- package/dist/host-normalization.js.map +0 -1
- package/dist/instructions.d.ts.map +0 -1
- package/dist/instructions.js.map +0 -1
- package/dist/ip-blocklist.d.ts.map +0 -1
- package/dist/ip-blocklist.js.map +0 -1
- package/dist/json.d.ts.map +0 -1
- package/dist/json.js.map +0 -1
- package/dist/language-detection.d.ts.map +0 -1
- package/dist/language-detection.js.map +0 -1
- package/dist/markdown-cleanup.d.ts.map +0 -1
- package/dist/markdown-cleanup.js.map +0 -1
- package/dist/mcp-validator.d.ts.map +0 -1
- package/dist/mcp-validator.js.map +0 -1
- package/dist/mcp.d.ts.map +0 -1
- package/dist/mcp.js.map +0 -1
- package/dist/observability.d.ts.map +0 -1
- package/dist/observability.js.map +0 -1
- package/dist/prompts.d.ts.map +0 -1
- package/dist/prompts.js.map +0 -1
- package/dist/resources.d.ts.map +0 -1
- package/dist/resources.js.map +0 -1
- package/dist/server-tuning.d.ts.map +0 -1
- package/dist/server-tuning.js.map +0 -1
- package/dist/session.d.ts.map +0 -1
- package/dist/session.js.map +0 -1
- package/dist/timer-utils.d.ts +0 -6
- package/dist/timer-utils.d.ts.map +0 -1
- package/dist/timer-utils.js +0 -27
- package/dist/timer-utils.js.map +0 -1
- package/dist/tool-errors.d.ts.map +0 -1
- package/dist/tool-errors.js.map +0 -1
- package/dist/tool-pipeline.d.ts.map +0 -1
- package/dist/tool-pipeline.js.map +0 -1
- package/dist/tool-progress.d.ts.map +0 -1
- package/dist/tool-progress.js.map +0 -1
- package/dist/tools.d.ts +0 -54
- package/dist/tools.d.ts.map +0 -1
- package/dist/tools.js.map +0 -1
- package/dist/type-guards.d.ts.map +0 -1
- package/dist/type-guards.js.map +0 -1
- /package/dist/{cache.d.ts → lib/cache.d.ts} +0 -0
- /package/dist/{crypto.d.ts → lib/crypto.d.ts} +0 -0
- /package/dist/{crypto.js → lib/crypto.js} +0 -0
- /package/dist/{dom-noise-removal.d.ts → lib/dom-noise-removal.d.ts} +0 -0
- /package/dist/{dom-noise-removal.js → lib/dom-noise-removal.js} +0 -0
- /package/dist/{download.d.ts → lib/download.d.ts} +0 -0
- /package/dist/{download.js → lib/download.js} +0 -0
- /package/dist/{fetch-content.d.ts → lib/fetch-content.d.ts} +0 -0
- /package/dist/{fetch-content.js → lib/fetch-content.js} +0 -0
- /package/dist/{fetch-stream.d.ts → lib/fetch-stream.d.ts} +0 -0
- /package/dist/{fetch-stream.js → lib/fetch-stream.js} +0 -0
- /package/dist/{fetch.d.ts → lib/fetch.d.ts} +0 -0
- /package/dist/{host-normalization.d.ts → lib/host-normalization.d.ts} +0 -0
- /package/dist/{host-normalization.js → lib/host-normalization.js} +0 -0
- /package/dist/{ip-blocklist.d.ts → lib/ip-blocklist.d.ts} +0 -0
- /package/dist/{ip-blocklist.js → lib/ip-blocklist.js} +0 -0
- /package/dist/{json.d.ts → lib/json.d.ts} +0 -0
- /package/dist/{json.js → lib/json.js} +0 -0
- /package/dist/{language-detection.d.ts → lib/language-detection.d.ts} +0 -0
- /package/dist/{language-detection.js → lib/language-detection.js} +0 -0
- /package/dist/{mcp-validator.d.ts → lib/mcp-validator.d.ts} +0 -0
- /package/dist/{observability.d.ts → lib/observability.d.ts} +0 -0
- /package/dist/{observability.js → lib/observability.js} +0 -0
- /package/dist/{server-tuning.d.ts → lib/server-tuning.d.ts} +0 -0
- /package/dist/{server-tuning.js → lib/server-tuning.js} +0 -0
- /package/dist/{tool-errors.d.ts → lib/tool-errors.d.ts} +0 -0
- /package/dist/{type-guards.d.ts → lib/type-guards.d.ts} +0 -0
- /package/dist/{type-guards.js → lib/type-guards.js} +0 -0
- /package/dist/{instructions.d.ts → resources/instructions.d.ts} +0 -0
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../src/tasks/execution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../src/tasks/execution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,oCAAoC,CAAC;AAa5C,OAAO,EACL,KAAK,gBAAgB,EAErB,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,KAAK,eAAe,EAErB,MAAM,YAAY,CAAC;AAWpB,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;QAChD,IAAI,CAAC,EACD;YACE,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;SAC1B,GACD,SAAS,CAAC;QACd,KAAK,CAAC,EACF;YACE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;YAC5C,sCAAsC,CAAC,EACnC;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,GAClB,SAAS,CAAC;YACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;SACxB,GACD,SAAS,CAAC;QACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAyBD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAKvD;AAMD,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,aAAa,SAA4D,GACxE,MAAM,CASR;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAgBD,KAAK,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAM5C,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,WAAW,CAed;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,GACb,YAAY,CAYd;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,GACd,IAAI,CAkBN;AAoBD,wBAAgB,iBAAiB,IAAI,KAAK,CAEzC;AAgND,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,uBAAuB,EAChC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,YAAY,CAAC,CAYvB"}
|
package/dist/tasks/execution.js
CHANGED
|
@@ -1,19 +1,25 @@
|
|
|
1
1
|
import { ErrorCode, McpError, } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { config } from '../lib/config.js';
|
|
3
|
+
import { getErrorMessage, RESOURCE_NOT_FOUND_ERROR_CODE, } from '../lib/errors.js';
|
|
4
|
+
import { logWarn, runWithRequestContext } from '../lib/observability.js';
|
|
5
|
+
import { isObject } from '../lib/type-guards.js';
|
|
5
6
|
import { taskManager, } from './manager.js';
|
|
6
7
|
import { compact, tryReadToolStructuredError, } from './owner.js';
|
|
8
|
+
import { getTaskCapableTool, hasTaskCapableTool, } from './tool-registry.js';
|
|
7
9
|
/* -------------------------------------------------------------------------------------------------
|
|
8
10
|
* Abort-controller management for in-flight task executions
|
|
9
11
|
* ------------------------------------------------------------------------------------------------- */
|
|
10
12
|
// Intentionally process-global (not session-scoped): abortAllTaskExecutions() is called
|
|
11
13
|
// during SIGTERM/SIGINT shutdown to cancel every in-flight task across all sessions.
|
|
12
|
-
//
|
|
14
|
+
// Keep this process-global so shutdown can cancel all in-flight tasks across sessions.
|
|
15
|
+
// Per-session isolation would require a different cancellation fan-out strategy.
|
|
13
16
|
const taskAbortControllers = new Map();
|
|
14
17
|
function attachAbortController(taskId) {
|
|
15
18
|
const existing = taskAbortControllers.get(taskId);
|
|
16
19
|
if (existing) {
|
|
20
|
+
// Abort the previous controller before replacing it — avoids stranding
|
|
21
|
+
// a running fetch that can no longer be cancelled via abortTaskExecution().
|
|
22
|
+
existing.abort();
|
|
17
23
|
taskAbortControllers.delete(taskId);
|
|
18
24
|
}
|
|
19
25
|
const controller = new AbortController();
|
|
@@ -72,6 +78,8 @@ export function withRelatedTaskMeta(result, taskId) {
|
|
|
72
78
|
};
|
|
73
79
|
}
|
|
74
80
|
export function emitTaskStatusNotification(server, task) {
|
|
81
|
+
if (!config.tasks.emitStatusNotifications)
|
|
82
|
+
return;
|
|
75
83
|
if (!server.isConnected())
|
|
76
84
|
return;
|
|
77
85
|
// NOTE: 'notifications/tasks/status' is not part of the MCP v2025-11-25 specification.
|
|
@@ -79,36 +87,46 @@ export function emitTaskStatusNotification(server, task) {
|
|
|
79
87
|
void server.server
|
|
80
88
|
.notification({
|
|
81
89
|
method: 'notifications/tasks/status',
|
|
82
|
-
params:
|
|
90
|
+
params: buildTaskStatusNotificationParams(task),
|
|
83
91
|
})
|
|
84
92
|
.catch((error) => {
|
|
85
93
|
logWarn('Failed to send task status notification', {
|
|
86
94
|
taskId: task.taskId,
|
|
87
95
|
status: task.status,
|
|
88
|
-
error,
|
|
96
|
+
error: getErrorMessage(error),
|
|
89
97
|
});
|
|
90
98
|
});
|
|
91
99
|
}
|
|
100
|
+
function buildTaskStatusNotificationParams(task) {
|
|
101
|
+
return {
|
|
102
|
+
taskId: task.taskId,
|
|
103
|
+
status: task.status,
|
|
104
|
+
...(task.statusMessage ? { statusMessage: task.statusMessage } : {}),
|
|
105
|
+
createdAt: task.createdAt,
|
|
106
|
+
lastUpdatedAt: task.lastUpdatedAt,
|
|
107
|
+
ttl: task.ttl,
|
|
108
|
+
pollInterval: task.pollInterval,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
92
111
|
/* -------------------------------------------------------------------------------------------------
|
|
93
112
|
* Validation helpers
|
|
94
113
|
* ------------------------------------------------------------------------------------------------- */
|
|
95
|
-
function requireFetchUrlArgs(args) {
|
|
96
|
-
const parsed = fetchUrlInputSchema.safeParse(args);
|
|
97
|
-
if (!parsed.success) {
|
|
98
|
-
throw new McpError(ErrorCode.InvalidParams, 'Invalid arguments for fetch-url');
|
|
99
|
-
}
|
|
100
|
-
return parsed.data;
|
|
101
|
-
}
|
|
102
|
-
// -32002 is the MCP extension code for resource-not-found; the SDK ErrorCode enum does not export it.
|
|
103
|
-
const RESOURCE_NOT_FOUND_ERROR_CODE = -32002;
|
|
104
114
|
export function throwTaskNotFound() {
|
|
105
115
|
throw new McpError(RESOURCE_NOT_FOUND_ERROR_CODE, 'Task not found');
|
|
106
116
|
}
|
|
107
|
-
function
|
|
108
|
-
|
|
109
|
-
|
|
117
|
+
function resolveTaskCapableTool(name) {
|
|
118
|
+
const descriptor = getTaskCapableTool(name);
|
|
119
|
+
if (descriptor)
|
|
120
|
+
return descriptor;
|
|
110
121
|
throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: '${name}'`);
|
|
111
122
|
}
|
|
123
|
+
// Validates that the tool name is recognized before we attempt to execute it.
|
|
124
|
+
// This ensures that an unknown tool produces a MethodNotFound error, rather than potentially executing and failing with an internal error if the tool handler does not properly validate its input.
|
|
125
|
+
function assertKnownTool(name) {
|
|
126
|
+
if (!hasTaskCapableTool(name)) {
|
|
127
|
+
throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: '${name}'`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
112
130
|
/* -------------------------------------------------------------------------------------------------
|
|
113
131
|
* Task result builders
|
|
114
132
|
* ------------------------------------------------------------------------------------------------- */
|
|
@@ -148,13 +166,43 @@ function updateWorkingTaskStatus(server, taskId, statusMessage) {
|
|
|
148
166
|
if (updated)
|
|
149
167
|
emitTaskStatusNotification(server, updated);
|
|
150
168
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
169
|
+
function updateTaskAndEmitStatus(server, taskId, update) {
|
|
170
|
+
taskManager.updateTask(taskId, update);
|
|
171
|
+
const task = taskManager.getTask(taskId);
|
|
172
|
+
if (task)
|
|
173
|
+
emitTaskStatusNotification(server, task);
|
|
174
|
+
}
|
|
175
|
+
function buildTaskFailureState(error) {
|
|
176
|
+
const statusMessage = getErrorMessage(error);
|
|
177
|
+
if (error instanceof McpError) {
|
|
178
|
+
return {
|
|
179
|
+
statusMessage,
|
|
180
|
+
error: {
|
|
181
|
+
code: error.code,
|
|
182
|
+
message: statusMessage,
|
|
183
|
+
data: error.data,
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
statusMessage,
|
|
189
|
+
error: {
|
|
190
|
+
code: ErrorCode.InternalError,
|
|
191
|
+
message: statusMessage,
|
|
192
|
+
},
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
async function runTaskToolExecution(params) {
|
|
196
|
+
const { server, taskId, args, tool, meta, sessionId, sendNotification } = params;
|
|
197
|
+
return runWithRequestContext({
|
|
198
|
+
requestId: taskId,
|
|
199
|
+
operationId: taskId,
|
|
200
|
+
...(sessionId ? { sessionId } : {}),
|
|
201
|
+
}, async () => {
|
|
154
202
|
const controller = attachAbortController(taskId);
|
|
155
203
|
try {
|
|
156
204
|
const relatedMeta = buildRelatedTaskMeta(taskId, meta);
|
|
157
|
-
const result = await
|
|
205
|
+
const result = await tool.execute(args, {
|
|
158
206
|
signal: controller.signal,
|
|
159
207
|
requestId: taskId,
|
|
160
208
|
_meta: relatedMeta,
|
|
@@ -163,40 +211,22 @@ async function runFetchTaskExecution(params) {
|
|
|
163
211
|
updateWorkingTaskStatus(server, taskId, message);
|
|
164
212
|
},
|
|
165
213
|
});
|
|
166
|
-
const isToolError = isObject(result) &&
|
|
167
|
-
|
|
168
|
-
result['isError'];
|
|
169
|
-
taskManager.updateTask(taskId, {
|
|
214
|
+
const isToolError = isObject(result) && 'isError' in result && result.isError === true;
|
|
215
|
+
updateTaskAndEmitStatus(server, taskId, {
|
|
170
216
|
status: isToolError ? 'failed' : 'completed',
|
|
171
217
|
statusMessage: isToolError
|
|
172
218
|
? (tryReadToolStructuredError(result) ?? 'Tool execution failed')
|
|
173
219
|
: 'Task completed successfully.',
|
|
174
220
|
result,
|
|
175
221
|
});
|
|
176
|
-
const task = taskManager.getTask(taskId);
|
|
177
|
-
if (task)
|
|
178
|
-
emitTaskStatusNotification(server, task);
|
|
179
222
|
}
|
|
180
223
|
catch (error) {
|
|
181
|
-
const
|
|
182
|
-
|
|
183
|
-
? {
|
|
184
|
-
code: error.code,
|
|
185
|
-
message: errorMessage,
|
|
186
|
-
data: error.data,
|
|
187
|
-
}
|
|
188
|
-
: {
|
|
189
|
-
code: ErrorCode.InternalError,
|
|
190
|
-
message: errorMessage,
|
|
191
|
-
};
|
|
192
|
-
taskManager.updateTask(taskId, {
|
|
224
|
+
const failure = buildTaskFailureState(error);
|
|
225
|
+
updateTaskAndEmitStatus(server, taskId, {
|
|
193
226
|
status: 'failed',
|
|
194
|
-
statusMessage:
|
|
195
|
-
error:
|
|
227
|
+
statusMessage: failure.statusMessage,
|
|
228
|
+
error: failure.error,
|
|
196
229
|
});
|
|
197
|
-
const task = taskManager.getTask(taskId);
|
|
198
|
-
if (task)
|
|
199
|
-
emitTaskStatusNotification(server, task);
|
|
200
230
|
}
|
|
201
231
|
finally {
|
|
202
232
|
clearTaskExecution(taskId);
|
|
@@ -204,38 +234,41 @@ async function runFetchTaskExecution(params) {
|
|
|
204
234
|
});
|
|
205
235
|
}
|
|
206
236
|
function handleTaskToolCall(server, params, context) {
|
|
207
|
-
|
|
208
|
-
const validArgs =
|
|
237
|
+
const tool = resolveTaskCapableTool(params.name);
|
|
238
|
+
const validArgs = tool.parseArguments(params.arguments);
|
|
209
239
|
const task = taskManager.createTask(params.task?.ttl !== undefined ? { ttl: params.task.ttl } : undefined, 'Task started', context.ownerKey);
|
|
210
|
-
void
|
|
240
|
+
void runTaskToolExecution({
|
|
211
241
|
server,
|
|
212
242
|
taskId: task.taskId,
|
|
213
243
|
args: validArgs,
|
|
244
|
+
tool,
|
|
214
245
|
...compact({
|
|
215
246
|
meta: params._meta,
|
|
247
|
+
sessionId: context.sessionId,
|
|
216
248
|
sendNotification: context.sendNotification,
|
|
217
249
|
}),
|
|
218
250
|
});
|
|
219
251
|
return buildCreateTaskResult(toTaskSummary(task));
|
|
220
252
|
}
|
|
221
253
|
async function handleDirectToolCall(params, context) {
|
|
222
|
-
const
|
|
254
|
+
const tool = resolveTaskCapableTool(params.name);
|
|
255
|
+
const args = tool.parseArguments(params.arguments);
|
|
223
256
|
const extra = compact({
|
|
224
257
|
signal: context.signal,
|
|
225
258
|
requestId: context.requestId,
|
|
226
259
|
sendNotification: context.sendNotification,
|
|
227
260
|
_meta: params._meta,
|
|
228
261
|
});
|
|
229
|
-
return
|
|
262
|
+
return tool.execute(args, extra);
|
|
230
263
|
}
|
|
231
264
|
export async function handleToolCallRequest(server, request, context) {
|
|
232
265
|
const { params } = request;
|
|
266
|
+
// Validate the tool name first so an unknown tool always produces MethodNotFound,
|
|
267
|
+
// regardless of whether a task:{} param was supplied (H-4).
|
|
268
|
+
assertKnownTool(params.name);
|
|
233
269
|
if (params.task) {
|
|
234
270
|
return handleTaskToolCall(server, params, context);
|
|
235
271
|
}
|
|
236
|
-
|
|
237
|
-
return handleDirectToolCall(params, context);
|
|
238
|
-
}
|
|
239
|
-
throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${params.name}`);
|
|
272
|
+
return handleDirectToolCall(params, context);
|
|
240
273
|
}
|
|
241
274
|
//# sourceMappingURL=execution.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/tasks/execution.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EACT,QAAQ,GAET,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/tasks/execution.ts"],"names":[],"mappings":"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"}
|
package/dist/tasks/manager.d.ts
CHANGED
|
@@ -44,11 +44,13 @@ declare class TaskManager {
|
|
|
44
44
|
private startCleanupLoop;
|
|
45
45
|
private removeExpiredTasks;
|
|
46
46
|
private removeTask;
|
|
47
|
+
private releaseOwnerCount;
|
|
47
48
|
private countTasksForOwner;
|
|
48
49
|
private incrementOwnerCount;
|
|
49
50
|
private decrementOwnerCount;
|
|
50
51
|
private assertTaskCapacity;
|
|
51
52
|
createTask(options?: CreateTaskOptions, statusMessage?: string, ownerKey?: string): TaskState;
|
|
53
|
+
private lookupActiveTask;
|
|
52
54
|
getTask(taskId: string, ownerKey?: string): TaskState | undefined;
|
|
53
55
|
updateTask(taskId: string, updates: Partial<Omit<TaskState, 'taskId' | 'createdAt'>>): void;
|
|
54
56
|
cancelTask(taskId: string, ownerKey?: string): TaskState | undefined;
|
|
@@ -62,6 +64,8 @@ declare class TaskManager {
|
|
|
62
64
|
tasks: TaskState[];
|
|
63
65
|
nextCursor?: string;
|
|
64
66
|
};
|
|
67
|
+
private addWaiter;
|
|
68
|
+
private removeWaiter;
|
|
65
69
|
waitForTerminalTask(taskId: string, ownerKey: string, signal?: AbortSignal): Promise<TaskState | undefined>;
|
|
66
70
|
private notifyWaiters;
|
|
67
71
|
private isExpired;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/tasks/manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/tasks/manager.ts"],"names":[],"mappings":"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"}
|
package/dist/tasks/manager.js
CHANGED
|
@@ -3,8 +3,9 @@ import { AsyncLocalStorage } from 'node:async_hooks';
|
|
|
3
3
|
import { Buffer } from 'node:buffer';
|
|
4
4
|
import { randomUUID } from 'node:crypto';
|
|
5
5
|
import { setInterval } from 'node:timers';
|
|
6
|
-
import { config } from '../config.js';
|
|
7
|
-
import {
|
|
6
|
+
import { config } from '../lib/config.js';
|
|
7
|
+
import { toError } from '../lib/errors.js';
|
|
8
|
+
import { createUnrefTimeout, } from '../lib/timer-utils.js';
|
|
8
9
|
const DEFAULT_TTL_MS = 60_000;
|
|
9
10
|
const MIN_TTL_MS = 1_000;
|
|
10
11
|
const MAX_TTL_MS = 86_400_000;
|
|
@@ -42,24 +43,29 @@ class TaskManager {
|
|
|
42
43
|
}
|
|
43
44
|
removeExpiredTasks() {
|
|
44
45
|
const now = Date.now();
|
|
45
|
-
const expired = [];
|
|
46
46
|
for (const [id, task] of this.tasks) {
|
|
47
47
|
if (this.isExpired(task, now)) {
|
|
48
|
-
|
|
48
|
+
this.removeTask(id);
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
-
for (const id of expired) {
|
|
52
|
-
this.removeTask(id);
|
|
53
|
-
}
|
|
54
51
|
}
|
|
55
52
|
removeTask(taskId) {
|
|
56
53
|
const task = this.tasks.get(taskId);
|
|
57
54
|
if (!task)
|
|
58
55
|
return false;
|
|
59
56
|
this.tasks.delete(taskId);
|
|
60
|
-
this.
|
|
57
|
+
this.releaseOwnerCount(task);
|
|
61
58
|
return true;
|
|
62
59
|
}
|
|
60
|
+
releaseOwnerCount(task) {
|
|
61
|
+
const internal = task;
|
|
62
|
+
if (internal._ownerCounted === false)
|
|
63
|
+
return;
|
|
64
|
+
if ('_ownerCounted' in internal) {
|
|
65
|
+
internal._ownerCounted = false;
|
|
66
|
+
}
|
|
67
|
+
this.decrementOwnerCount(task.ownerKey);
|
|
68
|
+
}
|
|
63
69
|
countTasksForOwner(ownerKey) {
|
|
64
70
|
return this.ownerCounts.get(ownerKey) ?? 0;
|
|
65
71
|
}
|
|
@@ -99,12 +105,13 @@ class TaskManager {
|
|
|
99
105
|
ttl: normalizeTaskTtl(options?.ttl),
|
|
100
106
|
pollInterval: DEFAULT_POLL_INTERVAL_MS,
|
|
101
107
|
_createdAtMs: now.getTime(),
|
|
108
|
+
_ownerCounted: true,
|
|
102
109
|
};
|
|
103
110
|
this.tasks.set(task.taskId, task);
|
|
104
111
|
this.incrementOwnerCount(ownerKey);
|
|
105
112
|
return task;
|
|
106
113
|
}
|
|
107
|
-
|
|
114
|
+
lookupActiveTask(taskId, ownerKey) {
|
|
108
115
|
const task = this.tasks.get(taskId);
|
|
109
116
|
if (!task)
|
|
110
117
|
return undefined;
|
|
@@ -116,16 +123,17 @@ class TaskManager {
|
|
|
116
123
|
}
|
|
117
124
|
return task;
|
|
118
125
|
}
|
|
126
|
+
getTask(taskId, ownerKey) {
|
|
127
|
+
return this.lookupActiveTask(taskId, ownerKey);
|
|
128
|
+
}
|
|
119
129
|
updateTask(taskId, updates) {
|
|
120
130
|
const task = this.tasks.get(taskId);
|
|
121
131
|
if (!task)
|
|
122
132
|
return;
|
|
123
133
|
if (isTerminalStatus(task.status))
|
|
124
134
|
return;
|
|
125
|
-
Object.assign(task,
|
|
126
|
-
|
|
127
|
-
lastUpdatedAt: new Date().toISOString(),
|
|
128
|
-
});
|
|
135
|
+
Object.assign(task, updates);
|
|
136
|
+
task.lastUpdatedAt = new Date().toISOString();
|
|
129
137
|
this.notifyWaiters(task);
|
|
130
138
|
}
|
|
131
139
|
cancelTask(taskId, ownerKey) {
|
|
@@ -139,7 +147,7 @@ class TaskManager {
|
|
|
139
147
|
status: 'cancelled',
|
|
140
148
|
statusMessage: 'The task was cancelled by request.',
|
|
141
149
|
});
|
|
142
|
-
this.
|
|
150
|
+
this.releaseOwnerCount(task);
|
|
143
151
|
return this.tasks.get(taskId);
|
|
144
152
|
}
|
|
145
153
|
cancelTasksByOwner(ownerKey, statusMessage = 'The task was cancelled because its owner is no longer active.') {
|
|
@@ -155,7 +163,7 @@ class TaskManager {
|
|
|
155
163
|
status: 'cancelled',
|
|
156
164
|
statusMessage,
|
|
157
165
|
});
|
|
158
|
-
this.
|
|
166
|
+
this.releaseOwnerCount(task);
|
|
159
167
|
cancelled.push(task);
|
|
160
168
|
}
|
|
161
169
|
return cancelled;
|
|
@@ -165,12 +173,11 @@ class TaskManager {
|
|
|
165
173
|
let collecting = anchorTaskId === null;
|
|
166
174
|
let anchorFound = anchorTaskId === null;
|
|
167
175
|
const now = Date.now();
|
|
168
|
-
const expired = [];
|
|
169
176
|
for (const task of this.tasks.values()) {
|
|
170
177
|
if (task.ownerKey !== ownerKey)
|
|
171
178
|
continue;
|
|
172
179
|
if (this.isExpired(task, now)) {
|
|
173
|
-
|
|
180
|
+
this.removeTask(task.taskId);
|
|
174
181
|
continue;
|
|
175
182
|
}
|
|
176
183
|
if (!collecting) {
|
|
@@ -184,9 +191,6 @@ class TaskManager {
|
|
|
184
191
|
if (page.length > pageSize)
|
|
185
192
|
break;
|
|
186
193
|
}
|
|
187
|
-
for (const id of expired) {
|
|
188
|
-
this.removeTask(id);
|
|
189
|
-
}
|
|
190
194
|
// Anchor task expired between pages; return empty list so callers stop
|
|
191
195
|
// pagination cleanly. Silently falling back to page 0 risks infinite loops
|
|
192
196
|
// for automated clients that always follow nextCursor.
|
|
@@ -214,27 +218,41 @@ class TaskManager {
|
|
|
214
218
|
const nextCursor = this.resolveNextCursor(page, hasMore);
|
|
215
219
|
return nextCursor ? { tasks: page, nextCursor } : { tasks: page };
|
|
216
220
|
}
|
|
221
|
+
addWaiter(taskId, waiter) {
|
|
222
|
+
let set = this.waiters.get(taskId);
|
|
223
|
+
if (!set) {
|
|
224
|
+
set = new Set();
|
|
225
|
+
this.waiters.set(taskId, set);
|
|
226
|
+
}
|
|
227
|
+
set.add(waiter);
|
|
228
|
+
}
|
|
229
|
+
removeWaiter(taskId, waiter) {
|
|
230
|
+
if (!waiter)
|
|
231
|
+
return;
|
|
232
|
+
const set = this.waiters.get(taskId);
|
|
233
|
+
if (!set)
|
|
234
|
+
return;
|
|
235
|
+
set.delete(waiter);
|
|
236
|
+
if (set.size === 0) {
|
|
237
|
+
this.waiters.delete(taskId);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
217
240
|
async waitForTerminalTask(taskId, ownerKey, signal) {
|
|
218
|
-
const task = this.
|
|
241
|
+
const task = this.lookupActiveTask(taskId, ownerKey);
|
|
219
242
|
if (!task)
|
|
220
243
|
return undefined;
|
|
221
|
-
if (ownerKey && task.ownerKey !== ownerKey)
|
|
222
|
-
return undefined;
|
|
223
|
-
if (this.isExpired(task)) {
|
|
224
|
-
this.removeTask(taskId);
|
|
225
|
-
return undefined;
|
|
226
|
-
}
|
|
227
244
|
if (isTerminalStatus(task.status))
|
|
228
245
|
return task;
|
|
229
246
|
// isExpired() above guarantees task.ttl has not elapsed; compute deadlineMs
|
|
230
247
|
// for the promise-based timeout below.
|
|
231
248
|
const deadlineMs = task._createdAtMs + task.ttl;
|
|
232
249
|
return new Promise((resolve, reject) => {
|
|
250
|
+
// Bind resolve/reject to the AsyncLocalStorage context of the caller, so that any context values (e.g. requestId) are preserved when we later call them from a different tick.
|
|
233
251
|
const resolveInContext = AsyncLocalStorage.bind((value) => {
|
|
234
252
|
resolve(value);
|
|
235
253
|
});
|
|
236
254
|
const rejectInContext = AsyncLocalStorage.bind((error) => {
|
|
237
|
-
reject(
|
|
255
|
+
reject(toError(error));
|
|
238
256
|
});
|
|
239
257
|
let settled = false;
|
|
240
258
|
let waiter = null;
|
|
@@ -248,16 +266,6 @@ class TaskManager {
|
|
|
248
266
|
signal.removeEventListener('abort', onAbort);
|
|
249
267
|
}
|
|
250
268
|
};
|
|
251
|
-
const removeWaiter = () => {
|
|
252
|
-
if (waiter) {
|
|
253
|
-
const set = this.waiters.get(taskId);
|
|
254
|
-
if (set) {
|
|
255
|
-
set.delete(waiter);
|
|
256
|
-
if (set.size === 0)
|
|
257
|
-
this.waiters.delete(taskId);
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
};
|
|
261
269
|
const settleOnce = (fn) => {
|
|
262
270
|
if (settled)
|
|
263
271
|
return;
|
|
@@ -267,7 +275,7 @@ class TaskManager {
|
|
|
267
275
|
const onAbort = () => {
|
|
268
276
|
settleOnce(() => {
|
|
269
277
|
cleanup();
|
|
270
|
-
removeWaiter();
|
|
278
|
+
this.removeWaiter(taskId, waiter);
|
|
271
279
|
rejectInContext(new McpError(ErrorCode.ConnectionClosed, 'Request was cancelled'));
|
|
272
280
|
});
|
|
273
281
|
};
|
|
@@ -285,12 +293,7 @@ class TaskManager {
|
|
|
285
293
|
onAbort();
|
|
286
294
|
return;
|
|
287
295
|
}
|
|
288
|
-
|
|
289
|
-
if (!set) {
|
|
290
|
-
set = new Set();
|
|
291
|
-
this.waiters.set(taskId, set);
|
|
292
|
-
}
|
|
293
|
-
set.add(waiter);
|
|
296
|
+
this.addWaiter(taskId, waiter);
|
|
294
297
|
if (signal) {
|
|
295
298
|
signal.addEventListener('abort', onAbort, { once: true });
|
|
296
299
|
}
|
|
@@ -300,7 +303,7 @@ class TaskManager {
|
|
|
300
303
|
.then(() => {
|
|
301
304
|
settleOnce(() => {
|
|
302
305
|
cleanup();
|
|
303
|
-
removeWaiter();
|
|
306
|
+
this.removeWaiter(taskId, waiter);
|
|
304
307
|
this.removeTask(taskId);
|
|
305
308
|
resolveInContext(undefined);
|
|
306
309
|
});
|
|
@@ -335,6 +338,8 @@ class TaskManager {
|
|
|
335
338
|
}
|
|
336
339
|
}
|
|
337
340
|
encodeCursor(taskId) {
|
|
341
|
+
// Base64url-encode the taskId to produce a compact opaque cursor string.
|
|
342
|
+
// The taskId is a UUID, which is 36 ASCII chars, so the resulting cursor will be 48 chars (36 * 4/3) plus padding if any.
|
|
338
343
|
return Buffer.from(taskId, 'utf8').toString('base64url');
|
|
339
344
|
}
|
|
340
345
|
decodeCursor(cursor) {
|