@j0hanz/fetch-url-mcp 1.11.2 → 1.11.4
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/dist/http/helpers.d.ts +1 -1
- package/dist/http/helpers.d.ts.map +1 -1
- package/dist/http/helpers.js +1 -1
- package/dist/http/native.js +1 -1
- package/dist/lib/config.d.ts +152 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +478 -0
- package/dist/lib/core.d.ts +1 -150
- package/dist/lib/core.d.ts.map +1 -1
- package/dist/lib/core.js +3 -459
- package/dist/lib/{mcp-tools.d.ts → mcp-interop.d.ts} +49 -1
- package/dist/lib/mcp-interop.d.ts.map +1 -0
- package/dist/lib/mcp-interop.js +354 -0
- package/dist/lib/task-handlers.js +1 -1
- package/dist/resources/index.js +1 -1
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +1 -1
- package/dist/server.js +2 -2
- package/dist/tasks/handlers.d.ts +11 -0
- package/dist/tasks/handlers.d.ts.map +1 -0
- package/dist/tasks/handlers.js +151 -0
- package/dist/tasks/owner.d.ts +1 -2
- package/dist/tasks/owner.d.ts.map +1 -1
- package/dist/tasks/registry.d.ts +1 -1
- package/dist/tasks/registry.d.ts.map +1 -1
- package/dist/tools/fetch-url.d.ts +2 -3
- package/dist/tools/fetch-url.d.ts.map +1 -1
- package/dist/tools/fetch-url.js +3 -4
- package/dist/{lib → transform}/dom-prep.d.ts +1 -1
- package/dist/transform/dom-prep.d.ts.map +1 -0
- package/dist/{lib → transform}/dom-prep.js +2 -2
- package/dist/transform/html-translators.d.ts.map +1 -1
- package/dist/transform/html-translators.js +1 -1
- package/dist/transform/metadata.d.ts +8 -0
- package/dist/transform/metadata.d.ts.map +1 -1
- package/dist/transform/metadata.js +66 -0
- package/dist/transform/transform.d.ts.map +1 -1
- package/dist/transform/transform.js +2 -3
- package/package.json +1 -1
- package/dist/lib/dom-prep.d.ts.map +0 -1
- package/dist/lib/mcp-tools.d.ts.map +0 -1
- package/dist/lib/mcp-tools.js +0 -129
- package/dist/lib/progress.d.ts +0 -32
- package/dist/lib/progress.d.ts.map +0 -1
- package/dist/lib/progress.js +0 -143
- package/dist/lib/sdk-interop.d.ts +0 -20
- package/dist/lib/sdk-interop.d.ts.map +0 -1
- package/dist/lib/sdk-interop.js +0 -85
- package/dist/transform/title-policy.d.ts +0 -9
- package/dist/transform/title-policy.d.ts.map +0 -1
- package/dist/transform/title-policy.js +0 -67
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tasks/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAEvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tasks/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAEvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,MAAM,MAAM,sBAAsB,GAAG,UAAU,GAAG,WAAW,CAAC;AAE9D,MAAM,WAAW,yBAAyB,CAAC,KAAK,GAAG,OAAO;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,KAAK,CAAC;IACzC,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1E,0BAA0B,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,MAAM,GAAG,SAAS,CAAC;IAC1E,WAAW,CAAC,EAAE,sBAAsB,CAAC;CACtC;AAID,wBAAgB,uBAAuB,CAAC,KAAK,EAC3C,UAAU,EAAE,yBAAyB,CAAC,KAAK,CAAC,GAC3C,IAAI,CAKN;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE5D;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,GACX,yBAAyB,GAAG,SAAS,CAEvC;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,GACX,sBAAsB,GAAG,SAAS,CAEpC;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,6BAA6B,IAAI,OAAO,CAEvD;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,sBAAsB,GAC9B,IAAI,CAIN"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import type { ContentBlock } from '@modelcontextprotocol/sdk/types.js';
|
|
3
3
|
import type { ServerResult } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
-
import { z } from 'zod';
|
|
4
|
+
import type { z } from 'zod';
|
|
5
5
|
import type { SharedFetchStage } from '../lib/fetch-pipeline.js';
|
|
6
|
-
import { type ToolHandlerExtra } from '../lib/
|
|
7
|
-
import type { ProgressReporter } from '../lib/progress.js';
|
|
6
|
+
import { type ProgressReporter, type ToolHandlerExtra } from '../lib/mcp-interop.js';
|
|
8
7
|
import { fetchUrlInputSchema } from '../schemas.js';
|
|
9
8
|
import { type TaskCapableToolSupport } from '../tasks/registry.js';
|
|
10
9
|
type FetchUrlInput = z.infer<typeof fetchUrlInputSchema>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-url.d.ts","sourceRoot":"","sources":["../../src/tools/fetch-url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EACV,YAAY,EAEb,MAAM,oCAAoC,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"fetch-url.d.ts","sourceRoot":"","sources":["../../src/tools/fetch-url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EACV,YAAY,EAEb,MAAM,oCAAoC,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAc7B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAC;AAU/B,OAAO,EACL,mBAAmB,EAIpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAIL,KAAK,sBAAsB,EAE5B,MAAM,sBAAsB,CAAC;AAE9B,KAAK,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEzD,UAAU,gBAAgB;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAwI/C,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,YAAY,GACnB,MAAM,GAAG,SAAS,CAUpB;AAED,qBAAa,oBAAoB;IAI7B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ1B,OAAO,CAAC,WAAW,CAA0B;gBAG1B,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,MAAM;IAGlC,WAAW,IAAI,IAAI;IAInB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAO1C,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIxC,aAAa,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAIvC,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,QAAQ;CAmCjB;AAuED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,aAAa,EACpB,KAAK,CAAC,EAAE,gBAAgB,GACvB,OAAO,CAAC,gBAAgB,CAAC,CAQ3B;AAqBD,MAAM,WAAW,wBAAwB;IACvC,cAAc,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,IAAI,CAAC;CAC3D;AAqBD,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,wBAAwB,CAsCzE"}
|
package/dist/tools/fetch-url.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
-
import { z } from 'zod';
|
|
3
2
|
import { config, logDebug, logError, logWarn } from '../lib/core.js';
|
|
4
3
|
import { finalizeInlineMarkdown, markdownTransform, parseCachedMarkdownResult, performSharedFetch, serializeMarkdownResult, withSignal, } from '../lib/fetch-pipeline.js';
|
|
5
|
-
import { handleToolError } from '../lib/mcp-
|
|
6
|
-
import { createProgressReporter, } from '../lib/
|
|
4
|
+
import { handleToolError } from '../lib/mcp-interop.js';
|
|
5
|
+
import { createProgressReporter, } from '../lib/mcp-interop.js';
|
|
7
6
|
import { composeAbortSignal, isAbortError, parseUrlOrNull, toError, } from '../lib/utils.js';
|
|
8
7
|
import { isObject } from '../lib/utils.js';
|
|
9
8
|
import { formatZodError } from '../lib/zod.js';
|
|
@@ -246,7 +245,7 @@ const TOOL_DEFINITION = {
|
|
|
246
245
|
title: 'Fetch URL',
|
|
247
246
|
description: FETCH_URL_TOOL_DESCRIPTION,
|
|
248
247
|
inputSchema: fetchUrlInputSchema,
|
|
249
|
-
outputSchema:
|
|
248
|
+
outputSchema: fetchUrlOutputSchema,
|
|
250
249
|
handler: fetchUrlToolHandler,
|
|
251
250
|
annotations: {
|
|
252
251
|
readOnlyHint: true,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ExtractedArticle } from '
|
|
1
|
+
import type { ExtractedArticle } from './types.js';
|
|
2
2
|
export declare const WP_PHOTON_HOST_PATTERN: RegExp;
|
|
3
3
|
export declare function extractNoscriptImages(document: Document): void;
|
|
4
4
|
export declare function resolveDocumentBody(document: Document): Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-prep.d.ts","sourceRoot":"","sources":["../../src/transform/dom-prep.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA0mBnD,eAAO,MAAM,sBAAsB,QAAmB,CAAC;AAyCvD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CA6B9D;AAuBD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAY/D;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,CASR;AA0CD,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAG5D;AA0RD,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CA2BjE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAE1D;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAY9D;AAWD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAQ3D;AAuDD,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,WAAW,GACnB,IAAI,CAON;AA4BD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,QAAQ,EACnB,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,WAAW,GACnB,MAAM,CAcR;AA0ED,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,MAAM,GAAG,QAAQ,GAChC,MAAM,CAaR;AAiMD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,QAAQ,GACjB,QAAQ,GAAG,IAAI,CA8BjB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { parseHTML } from 'linkedom';
|
|
2
|
-
import { config, logDebug } from '
|
|
3
|
-
import { CharCode, isWhitespaceChar } from '
|
|
2
|
+
import { config, logDebug } from '../lib/core.js';
|
|
3
|
+
import { CharCode, isWhitespaceChar } from '../lib/utils.js';
|
|
4
4
|
// ── Thresholds ──────────────────────────────────────────────────────
|
|
5
5
|
const NOISE_SCAN_LIMIT = 50_000;
|
|
6
6
|
const MIN_BODY_CONTENT_LENGTH = 100;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-translators.d.ts","sourceRoot":"","sources":["../../src/transform/html-translators.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"html-translators.d.ts","sourceRoot":"","sources":["../../src/transform/html-translators.ts"],"names":[],"mappings":"AAkVA,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,SAAS,CAkCpB;AAOD,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,SAAS,CAKpB;AACD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKvE;AA0cD,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpE"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { NodeHtmlMarkdown, } from 'node-html-markdown';
|
|
2
|
-
import { WP_PHOTON_HOST_PATTERN } from '../lib/dom-prep.js';
|
|
3
2
|
import { isLikeNode, isObject } from '../lib/utils.js';
|
|
3
|
+
import { WP_PHOTON_HOST_PATTERN } from './dom-prep.js';
|
|
4
4
|
// ---------------------------------------------------------------------------
|
|
5
5
|
// Shared constant
|
|
6
6
|
// ---------------------------------------------------------------------------
|
|
@@ -7,4 +7,12 @@ export declare function extractTitleFromRawMarkdown(content: string): string | u
|
|
|
7
7
|
export declare function addSourceToMarkdown(content: string, url: string): string;
|
|
8
8
|
export declare function isRawTextContent(content: string): boolean;
|
|
9
9
|
export declare function buildMetadataFooter(metadata?: MetadataBlock, fallbackUrl?: string): string;
|
|
10
|
+
export interface SyntheticTitleContext {
|
|
11
|
+
readonly title: string | undefined;
|
|
12
|
+
}
|
|
13
|
+
export declare function normalizeSyntheticTitleToken(value: string | undefined): string;
|
|
14
|
+
export declare function shouldPreferPrimaryHeadingTitle(primaryHeading: string | undefined, title: string | undefined): boolean;
|
|
15
|
+
export declare function isGithubRepositoryRootUrl(url: string): boolean;
|
|
16
|
+
export declare function maybeStripGithubPrimaryHeading(markdown: string, primaryHeading: string | undefined, url: string): string;
|
|
17
|
+
export declare function maybePrependSyntheticTitle(markdown: string, context: SyntheticTitleContext): string;
|
|
10
18
|
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/transform/metadata.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAgCnE,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAkBR;AAuJD,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,iBAAiB,CAYnB;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,GACf,iBAAiB,GAAG,IAAI,CAY1B;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,iBAAiB,GAAG,IAAI,EAC/B,IAAI,EAAE,iBAAiB,GACtB,iBAAiB,CAmBnB;AA0GD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,SAAS,CAOpB;AACD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAuCxE;AAmBD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAczD;AAaD,wBAAgB,mBAAmB,CACjC,QAAQ,CAAC,EAAE,aAAa,EACxB,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAmBR"}
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/transform/metadata.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAgCnE,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAkBR;AAuJD,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,iBAAiB,CAYnB;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,GACf,iBAAiB,GAAG,IAAI,CAY1B;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,iBAAiB,GAAG,IAAI,EAC/B,IAAI,EAAE,iBAAiB,GACtB,iBAAiB,CAmBnB;AA0GD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,SAAS,CAOpB;AACD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAuCxE;AAmBD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAczD;AAaD,wBAAgB,mBAAmB,CACjC,QAAQ,CAAC,EAAE,aAAa,EACxB,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAmBR;AAMD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAMD,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,MAAM,CAER;AAED,wBAAgB,+BAA+B,CAC7C,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,OAAO,CAWT;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAU9D;AAkCD,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,GAAG,EAAE,MAAM,GACV,MAAM,CAMR;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,qBAAqB,GAC7B,MAAM,CAMR"}
|
|
@@ -393,4 +393,70 @@ export function buildMetadataFooter(metadata, fallbackUrl) {
|
|
|
393
393
|
lines.push(` <sub>${metadata.description}</sub>`);
|
|
394
394
|
return lines.join('\n');
|
|
395
395
|
}
|
|
396
|
+
const TITLE_PART_SEPARATOR = /\s*(?:[-|:•·]|–|—)\s*/u;
|
|
397
|
+
const LEADING_HEADING_PATTERN = /^(#{1,6})\s+(.+?)\s*$/;
|
|
398
|
+
const HEADING_SCAN_LIMIT = 12;
|
|
399
|
+
export function normalizeSyntheticTitleToken(value) {
|
|
400
|
+
return (value ?? '').replace(/\s+/g, ' ').trim().toLowerCase();
|
|
401
|
+
}
|
|
402
|
+
export function shouldPreferPrimaryHeadingTitle(primaryHeading, title) {
|
|
403
|
+
const primary = normalizeSyntheticTitleToken(primaryHeading);
|
|
404
|
+
if (!primary)
|
|
405
|
+
return false;
|
|
406
|
+
const normalizedTitle = normalizeSyntheticTitleToken(title);
|
|
407
|
+
if (!normalizedTitle)
|
|
408
|
+
return true;
|
|
409
|
+
if (normalizedTitle === primary)
|
|
410
|
+
return true;
|
|
411
|
+
return normalizedTitle
|
|
412
|
+
.split(TITLE_PART_SEPARATOR)
|
|
413
|
+
.some((part) => part === primary);
|
|
414
|
+
}
|
|
415
|
+
export function isGithubRepositoryRootUrl(url) {
|
|
416
|
+
const parsed = parseUrlOrNull(url);
|
|
417
|
+
if (!parsed)
|
|
418
|
+
return false;
|
|
419
|
+
const hostname = parsed.hostname.toLowerCase();
|
|
420
|
+
if (hostname !== 'github.com' && hostname !== 'www.github.com') {
|
|
421
|
+
return false;
|
|
422
|
+
}
|
|
423
|
+
return parsed.pathname.split('/').filter(Boolean).length === 2;
|
|
424
|
+
}
|
|
425
|
+
function stripLeadingHeading(markdown, headingText) {
|
|
426
|
+
if (!markdown)
|
|
427
|
+
return markdown;
|
|
428
|
+
const lines = markdown.split('\n');
|
|
429
|
+
const target = normalizeSyntheticTitleToken(headingText);
|
|
430
|
+
let nonEmptySeen = 0;
|
|
431
|
+
for (let index = 0; index < lines.length && nonEmptySeen < HEADING_SCAN_LIMIT; index += 1) {
|
|
432
|
+
const trimmed = lines[index]?.trim() ?? '';
|
|
433
|
+
if (!trimmed)
|
|
434
|
+
continue;
|
|
435
|
+
nonEmptySeen += 1;
|
|
436
|
+
const match = LEADING_HEADING_PATTERN.exec(trimmed);
|
|
437
|
+
if (!match)
|
|
438
|
+
continue;
|
|
439
|
+
const current = normalizeSyntheticTitleToken(match[2] ?? '');
|
|
440
|
+
if (current !== target)
|
|
441
|
+
return markdown;
|
|
442
|
+
lines.splice(index, 1);
|
|
443
|
+
if ((lines[index] ?? '').trim() === '') {
|
|
444
|
+
lines.splice(index, 1);
|
|
445
|
+
}
|
|
446
|
+
return lines.join('\n');
|
|
447
|
+
}
|
|
448
|
+
return markdown;
|
|
449
|
+
}
|
|
450
|
+
export function maybeStripGithubPrimaryHeading(markdown, primaryHeading, url) {
|
|
451
|
+
if (primaryHeading === undefined || !isGithubRepositoryRootUrl(url)) {
|
|
452
|
+
return markdown;
|
|
453
|
+
}
|
|
454
|
+
return stripLeadingHeading(markdown, primaryHeading);
|
|
455
|
+
}
|
|
456
|
+
export function maybePrependSyntheticTitle(markdown, context) {
|
|
457
|
+
if (!context.title || /^#\s/.test(markdown.trimStart())) {
|
|
458
|
+
return markdown;
|
|
459
|
+
}
|
|
460
|
+
return `# ${context.title}\n\n${markdown}`;
|
|
461
|
+
}
|
|
396
462
|
// endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/transform/transform.ts"],"names":[],"mappings":"AA2CA,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/transform/transform.ts"],"names":[],"mappings":"AA2CA,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,uBAAuB,CAAC;AAkB/B,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,EACvB,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EAEtB,MAAM,YAAY,CAAC;AA+BpB,UAAU,WAAW;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AA4LD,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,WAAW,GACnB,qBAAqB,GAAG,IAAI,CAE9B;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,qBAAqB,GAAG,IAAI,EACrC,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAChC,MAAM,CAER;AA4aD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAExD,GACA,gBAAgB,CAGlB;AAuKD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,aAAa,EACxB,OAAO,CAAC,EAAE;IACR,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACxC,GACA,MAAM,CAyBR;AA2DD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAChC,sBAAsB,EAAE,MAAM,GAAG,QAAQ,GACxC,OAAO,CAQT;AAKD,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,gBAAgB,GAAG,IAAI,GAC/B,OAAO,IAAI,gBAAgB,CAE7B;AAED,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAChC,aAAa,EAAE,iBAAiB,EAChC,wBAAwB,EAAE,OAAO,EACjC,eAAe,EAAE,OAAO,GACvB,aAAa,GAAG,SAAS,CAuB3B;AA6bD,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,gBAAgB,GACxB,uBAAuB,CAMzB;AAaD,UAAU,kBAAkB;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,qBAAqB,IAAI,kBAAkB,GAAG,IAAI,CAEjE;AAED,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,IAAI,CAAC,CAEjE;AAED,KAAK,yBAAyB,GAAG,gBAAgB,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAuG1E,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,uBAAuB,CAAC,CAElC;AAED,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,UAAU,EACtB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,uBAAuB,CAAC,CAElC;AAED,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,oBAAoB,GACrB,CAAC"}
|
|
@@ -3,16 +3,15 @@ import { isProbablyReaderable, Readability } from '@mozilla/readability';
|
|
|
3
3
|
import { parseHTML } from 'linkedom';
|
|
4
4
|
import { config } from '../lib/core.js';
|
|
5
5
|
import { getOperationId, getRequestId, logDebug, logError, logInfo, logWarn, redactUrl, } from '../lib/core.js';
|
|
6
|
-
import { evaluateArticleContent, extractNoscriptImages, getVisibleTextLength, normalizeTabContent, prepareDocumentForMarkdown, removeNoiseFromHtml, serializeDocumentForMarkdown, stripDocsControls, stripScreenReaderText, surfaceCodeEditorContent, } from '../lib/dom-prep.js';
|
|
7
6
|
import { isRawTextContentUrl } from '../lib/http.js';
|
|
8
7
|
import { composeAbortSignal, FetchError, getErrorMessage, getUtf8ByteLength, isAsciiOnly, isObject, throwIfAborted, toError, trimDanglingTagFragment, truncateToUtf8Boundary, } from '../lib/utils.js';
|
|
8
|
+
import { evaluateArticleContent, extractNoscriptImages, getVisibleTextLength, normalizeTabContent, prepareDocumentForMarkdown, removeNoiseFromHtml, serializeDocumentForMarkdown, stripDocsControls, stripScreenReaderText, surfaceCodeEditorContent, } from './dom-prep.js';
|
|
9
9
|
import { extractLanguageFromClassName } from './html-translators.js';
|
|
10
10
|
import { translateHtmlFragmentToMarkdown } from './html-translators.js';
|
|
11
11
|
import { cleanupMarkdownArtifacts, finalizeMarkdownSections, processFencedContent, } from './markdown-cleanup.js';
|
|
12
12
|
import { addSourceToMarkdown, buildMetadataFooter, extractTitleFromRawMarkdown, isRawTextContent, } from './metadata.js';
|
|
13
|
-
import { extractMetadata, extractMetadataFromHead, mergeMetadata, normalizeDocumentTitle, } from './metadata.js';
|
|
13
|
+
import { extractMetadata, extractMetadataFromHead, isGithubRepositoryRootUrl, maybePrependSyntheticTitle, maybeStripGithubPrimaryHeading, mergeMetadata, normalizeDocumentTitle, shouldPreferPrimaryHeadingTitle, } from './metadata.js';
|
|
14
14
|
import { supplementMarkdownFromNextFlight } from './next-flight.js';
|
|
15
|
-
import { isGithubRepositoryRootUrl, maybePrependSyntheticTitle, maybeStripGithubPrimaryHeading, shouldPreferPrimaryHeadingTitle, } from './title-policy.js';
|
|
16
15
|
import { getOrCreateWorkerPool, getWorkerPoolStats, shutdownWorkerPool, } from './worker-pool.js';
|
|
17
16
|
function decodeInput(input, encoding) {
|
|
18
17
|
if (typeof input === 'string')
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dom-prep.d.ts","sourceRoot":"","sources":["../../src/lib/dom-prep.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AA4mB9D,eAAO,MAAM,sBAAsB,QAAmB,CAAC;AAyCvD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CA6B9D;AAuBD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAY/D;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,CASR;AA0CD,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAG5D;AA0RD,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CA2BjE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAE1D;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAY9D;AAWD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAQ3D;AAuDD,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,WAAW,GACnB,IAAI,CAON;AA4BD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,QAAQ,EACnB,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,WAAW,GACnB,MAAM,CAcR;AA0ED,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,MAAM,GAAG,QAAQ,GAChC,MAAM,CAaR;AAiMD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,QAAQ,GACjB,QAAQ,GAAG,IAAI,CA8BjB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-tools.d.ts","sourceRoot":"","sources":["../../src/lib/mcp-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAK/C,QAAA,MAAM,oBAAoB;;;;;;;kBAKxB,CAAC;AAeH,QAAA,MAAM,qBAAqB;;;;;;;;;;;;oBAGzB,CAAC;AACH,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;sBAGxB,CAAC;AACH,KAAK,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAC3D,KAAK,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACjE,KAAK,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAC/D,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAE5D;AACD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,cAAc,CAEtE;AACD,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,OAAO,GACZ,IAAI,IAAI,mBAAmB,CAE7B;AACD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,kBAAkB,CAE1E;AAUD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAG7E;AACD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,OAAO,CAUT;AAMD,KAAK,iBAAiB,GAAG,cAAc,GAAG;IACxC,OAAO,EAAE,IAAI,CAAC;CACf,CAAC;AA6BF,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE;IACN,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,GACA,iBAAiB,CAenB;AAQD,wBAAgB,eAAe,CAC7B,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,MAAM,EACX,eAAe,SAAqB,GACnC,iBAAiB,CA2BnB"}
|
package/dist/lib/mcp-tools.js
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
import {} from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { FetchError, isAbortError, isSystemError } from './utils.js';
|
|
4
|
-
const paramsSchema = z.looseObject({
|
|
5
|
-
_meta: z.record(z.string(), z.unknown()).optional(),
|
|
6
|
-
});
|
|
7
|
-
const jsonRpcRequestIdSchema = z.union([z.string(), z.number()]);
|
|
8
|
-
const jsonRpcRequestSchema = z.strictObject({
|
|
9
|
-
jsonrpc: z.literal('2.0'),
|
|
10
|
-
method: z.string().min(1),
|
|
11
|
-
id: jsonRpcRequestIdSchema.optional(),
|
|
12
|
-
params: paramsSchema.optional(),
|
|
13
|
-
});
|
|
14
|
-
const jsonRpcResultResponseSchema = z.strictObject({
|
|
15
|
-
jsonrpc: z.literal('2.0'),
|
|
16
|
-
id: jsonRpcRequestIdSchema,
|
|
17
|
-
result: z.record(z.string(), z.unknown()),
|
|
18
|
-
});
|
|
19
|
-
const jsonRpcErrorResponseSchema = z.strictObject({
|
|
20
|
-
jsonrpc: z.literal('2.0'),
|
|
21
|
-
id: jsonRpcRequestIdSchema.or(z.null()).optional(),
|
|
22
|
-
error: z.strictObject({
|
|
23
|
-
code: z.number().int(),
|
|
24
|
-
message: z.string(),
|
|
25
|
-
data: z.unknown().optional(),
|
|
26
|
-
}),
|
|
27
|
-
});
|
|
28
|
-
const jsonRpcResponseSchema = z.union([
|
|
29
|
-
jsonRpcResultResponseSchema,
|
|
30
|
-
jsonRpcErrorResponseSchema,
|
|
31
|
-
]);
|
|
32
|
-
const jsonRpcMessageSchema = z.union([
|
|
33
|
-
jsonRpcRequestSchema,
|
|
34
|
-
jsonRpcResponseSchema,
|
|
35
|
-
]);
|
|
36
|
-
export function isJsonRpcBatchRequest(body) {
|
|
37
|
-
return Array.isArray(body);
|
|
38
|
-
}
|
|
39
|
-
export function isMcpRequestBody(body) {
|
|
40
|
-
return jsonRpcRequestSchema.safeParse(body).success;
|
|
41
|
-
}
|
|
42
|
-
export function isJsonRpcResponseBody(body) {
|
|
43
|
-
return jsonRpcResponseSchema.safeParse(body).success;
|
|
44
|
-
}
|
|
45
|
-
export function isMcpMessageBody(body) {
|
|
46
|
-
return jsonRpcMessageSchema.safeParse(body).success;
|
|
47
|
-
}
|
|
48
|
-
function parseAcceptMediaTypes(header) {
|
|
49
|
-
if (!header)
|
|
50
|
-
return [];
|
|
51
|
-
return header
|
|
52
|
-
.split(',')
|
|
53
|
-
.map((v) => v.split(';', 1)[0]?.trim().toLowerCase() ?? '')
|
|
54
|
-
.filter((v) => v.length > 0);
|
|
55
|
-
}
|
|
56
|
-
export function acceptsEventStream(header) {
|
|
57
|
-
const mediaTypes = parseAcceptMediaTypes(header);
|
|
58
|
-
return mediaTypes.some((mediaType) => mediaType === 'text/event-stream');
|
|
59
|
-
}
|
|
60
|
-
export function acceptsJsonAndEventStream(header) {
|
|
61
|
-
const mediaTypes = parseAcceptMediaTypes(header);
|
|
62
|
-
const acceptsJson = mediaTypes.some((m) => m === '*/*' || m === 'application/json' || m === 'application/*');
|
|
63
|
-
if (!acceptsJson)
|
|
64
|
-
return false;
|
|
65
|
-
return mediaTypes.some((m) => m === '*/*' || m === 'text/event-stream' || m === 'text/*');
|
|
66
|
-
}
|
|
67
|
-
const PUBLIC_ERROR_REASONS = new Set(['aborted', 'queue_full', 'timeout']);
|
|
68
|
-
function sanitizeToolErrorDetails(details) {
|
|
69
|
-
const sanitized = {};
|
|
70
|
-
const { retryAfter, timeout, reason } = details;
|
|
71
|
-
if (typeof retryAfter === 'number' ||
|
|
72
|
-
typeof retryAfter === 'string' ||
|
|
73
|
-
retryAfter === null) {
|
|
74
|
-
sanitized['retryAfter'] = retryAfter;
|
|
75
|
-
}
|
|
76
|
-
if (typeof timeout === 'number' && Number.isFinite(timeout) && timeout >= 0) {
|
|
77
|
-
sanitized['timeout'] = timeout;
|
|
78
|
-
}
|
|
79
|
-
if (typeof reason === 'string' && PUBLIC_ERROR_REASONS.has(reason)) {
|
|
80
|
-
sanitized['reason'] = reason;
|
|
81
|
-
}
|
|
82
|
-
return Object.keys(sanitized).length > 0 ? sanitized : undefined;
|
|
83
|
-
}
|
|
84
|
-
export function createToolErrorResponse(message, url, extra) {
|
|
85
|
-
const errorContent = {
|
|
86
|
-
error: message,
|
|
87
|
-
...(extra?.code ? { code: extra.code } : {}),
|
|
88
|
-
url,
|
|
89
|
-
...(extra?.statusCode !== undefined
|
|
90
|
-
? { statusCode: extra.statusCode }
|
|
91
|
-
: {}),
|
|
92
|
-
...(extra?.details ? { details: extra.details } : {}),
|
|
93
|
-
};
|
|
94
|
-
return {
|
|
95
|
-
content: [{ type: 'text', text: JSON.stringify(errorContent) }],
|
|
96
|
-
isError: true,
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
function isValidationError(error) {
|
|
100
|
-
return (error instanceof Error &&
|
|
101
|
-
isSystemError(error) &&
|
|
102
|
-
error.code === 'VALIDATION_ERROR');
|
|
103
|
-
}
|
|
104
|
-
export function handleToolError(error, url, fallbackMessage = 'Operation failed') {
|
|
105
|
-
if (error instanceof FetchError) {
|
|
106
|
-
const { code: detailsCode, reason } = error.details;
|
|
107
|
-
const code = (typeof detailsCode === 'string'
|
|
108
|
-
? detailsCode
|
|
109
|
-
: reason === 'queue_full'
|
|
110
|
-
? 'queue_full'
|
|
111
|
-
: undefined) ?? error.code;
|
|
112
|
-
const details = sanitizeToolErrorDetails(error.details);
|
|
113
|
-
return createToolErrorResponse(error.message, url, {
|
|
114
|
-
code,
|
|
115
|
-
statusCode: error.statusCode,
|
|
116
|
-
...(details ? { details } : {}),
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
if (isValidationError(error)) {
|
|
120
|
-
return createToolErrorResponse(error.message, url, {
|
|
121
|
-
code: 'VALIDATION_ERROR',
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
const code = isAbortError(error) ? 'ABORTED' : 'FETCH_ERROR';
|
|
125
|
-
const message = error instanceof Error
|
|
126
|
-
? `${fallbackMessage}: ${error.message}`
|
|
127
|
-
: `${fallbackMessage}: Unknown error`;
|
|
128
|
-
return createToolErrorResponse(message, url, { code });
|
|
129
|
-
}
|
package/dist/lib/progress.d.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
type ProgressToken = string | number;
|
|
2
|
-
interface RequestMeta {
|
|
3
|
-
progressToken?: ProgressToken | undefined;
|
|
4
|
-
[key: string]: unknown;
|
|
5
|
-
}
|
|
6
|
-
export interface ProgressNotificationParams {
|
|
7
|
-
progressToken: ProgressToken;
|
|
8
|
-
progress: number;
|
|
9
|
-
total?: number;
|
|
10
|
-
message?: string;
|
|
11
|
-
_meta?: Record<string, unknown>;
|
|
12
|
-
}
|
|
13
|
-
export interface ProgressNotification {
|
|
14
|
-
method: 'notifications/progress';
|
|
15
|
-
params: ProgressNotificationParams;
|
|
16
|
-
}
|
|
17
|
-
export interface ToolHandlerExtra {
|
|
18
|
-
signal?: AbortSignal;
|
|
19
|
-
requestId?: string | number;
|
|
20
|
-
sessionId?: unknown;
|
|
21
|
-
requestInfo?: unknown;
|
|
22
|
-
_meta?: RequestMeta;
|
|
23
|
-
sendNotification?: (notification: ProgressNotification) => Promise<void>;
|
|
24
|
-
onProgress?: (progress: number, message: string) => void;
|
|
25
|
-
canReportProgress?: () => boolean;
|
|
26
|
-
}
|
|
27
|
-
export interface ProgressReporter {
|
|
28
|
-
report: (progress: number, message: string) => void;
|
|
29
|
-
}
|
|
30
|
-
export declare const createProgressReporter: (extra?: ToolHandlerExtra) => ProgressReporter;
|
|
31
|
-
export {};
|
|
32
|
-
//# sourceMappingURL=progress.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/lib/progress.ts"],"names":[],"mappings":"AASA,KAAK,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;AAErC,UAAU,WAAW;IACnB,aAAa,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC1C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,aAAa,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,wBAAwB,CAAC;IACjC,MAAM,EAAE,0BAA0B,CAAC;CACpC;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,gBAAgB,CAAC,EAAE,CAAC,YAAY,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD;AA+KD,eAAO,MAAM,sBAAsB,GACjC,QAAQ,gBAAgB,KACvB,gBAAsD,CAAC"}
|
package/dist/lib/progress.js
DELETED
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
import { setTimeout as setTimeoutPromise } from 'node:timers/promises';
|
|
2
|
-
import { logError, logWarn } from './core.js';
|
|
3
|
-
import { getErrorMessage, isObject } from './utils.js';
|
|
4
|
-
const DEFAULT_PROGRESS_TOTAL = 8;
|
|
5
|
-
const PROGRESS_NOTIFICATION_TIMEOUT_MS = 5000;
|
|
6
|
-
function resolveRelatedTaskMeta(meta) {
|
|
7
|
-
const related = meta?.['io.modelcontextprotocol/related-task'];
|
|
8
|
-
if (!isObject(related))
|
|
9
|
-
return undefined;
|
|
10
|
-
const { taskId } = related;
|
|
11
|
-
return typeof taskId === 'string' ? { taskId } : undefined;
|
|
12
|
-
}
|
|
13
|
-
class ToolProgressReporter {
|
|
14
|
-
token;
|
|
15
|
-
handlers;
|
|
16
|
-
taskMeta;
|
|
17
|
-
isTerminal = false;
|
|
18
|
-
lastProgress = -1;
|
|
19
|
-
lastMessage;
|
|
20
|
-
pendingNotification;
|
|
21
|
-
isDispatching = false;
|
|
22
|
-
constructor(token, handlers, taskMeta) {
|
|
23
|
-
this.token = token;
|
|
24
|
-
this.handlers = handlers;
|
|
25
|
-
this.taskMeta = taskMeta;
|
|
26
|
-
}
|
|
27
|
-
static create(extra = {}) {
|
|
28
|
-
const token = extra._meta?.progressToken ?? null;
|
|
29
|
-
const { onProgress } = extra;
|
|
30
|
-
if (token === null && !onProgress) {
|
|
31
|
-
return { report: () => { } };
|
|
32
|
-
}
|
|
33
|
-
return new ToolProgressReporter(token, {
|
|
34
|
-
send: extra.sendNotification,
|
|
35
|
-
onProgress,
|
|
36
|
-
canReport: extra.canReportProgress,
|
|
37
|
-
}, resolveRelatedTaskMeta(extra._meta));
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Report progress toward completion. Steps are monotonic (never decrease)
|
|
41
|
-
* and may be skipped under normal conditions (e.g., fast responses skip
|
|
42
|
-
* intermediate steps). Clients should treat progress as "at least this far"
|
|
43
|
-
* rather than expecting every step to fire sequentially.
|
|
44
|
-
*/
|
|
45
|
-
report(progress, message) {
|
|
46
|
-
if (this.isTerminal || this.handlers.canReport?.() === false)
|
|
47
|
-
return;
|
|
48
|
-
const effectiveProgress = Math.max(progress, this.lastProgress);
|
|
49
|
-
const isIncreasing = effectiveProgress > this.lastProgress;
|
|
50
|
-
const isMessageChanged = message !== this.lastMessage;
|
|
51
|
-
this.lastProgress = effectiveProgress;
|
|
52
|
-
this.lastMessage = message;
|
|
53
|
-
if (effectiveProgress >= DEFAULT_PROGRESS_TOTAL) {
|
|
54
|
-
this.isTerminal = true;
|
|
55
|
-
}
|
|
56
|
-
if (isIncreasing || isMessageChanged) {
|
|
57
|
-
try {
|
|
58
|
-
this.handlers.onProgress?.(effectiveProgress, message);
|
|
59
|
-
}
|
|
60
|
-
catch (error) {
|
|
61
|
-
logError('Progress callback failed', {
|
|
62
|
-
error: getErrorMessage(error),
|
|
63
|
-
progress: effectiveProgress,
|
|
64
|
-
message,
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
if (!isIncreasing || this.token === null || !this.handlers.send)
|
|
69
|
-
return;
|
|
70
|
-
this.pendingNotification = this.createProgressNotification(this.token, effectiveProgress, message);
|
|
71
|
-
this.flushNotifications();
|
|
72
|
-
}
|
|
73
|
-
flushNotifications() {
|
|
74
|
-
if (this.isDispatching || !this.handlers.send)
|
|
75
|
-
return;
|
|
76
|
-
this.isDispatching = true;
|
|
77
|
-
void (async () => {
|
|
78
|
-
try {
|
|
79
|
-
while (this.pendingNotification) {
|
|
80
|
-
if (this.handlers.canReport?.() === false) {
|
|
81
|
-
this.pendingNotification = undefined;
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
const notification = this.pendingNotification;
|
|
85
|
-
this.pendingNotification = undefined;
|
|
86
|
-
await this.sendWithTimeout(notification);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
finally {
|
|
90
|
-
this.isDispatching = false;
|
|
91
|
-
}
|
|
92
|
-
})();
|
|
93
|
-
}
|
|
94
|
-
async sendWithTimeout(notification) {
|
|
95
|
-
if (!this.handlers.send)
|
|
96
|
-
return;
|
|
97
|
-
const ac = new AbortController();
|
|
98
|
-
const timeoutPromise = setTimeoutPromise(PROGRESS_NOTIFICATION_TIMEOUT_MS, { timeout: true }, { signal: ac.signal, ref: false }).catch((err) => {
|
|
99
|
-
if (err.name === 'AbortError')
|
|
100
|
-
return { ok: true };
|
|
101
|
-
throw err;
|
|
102
|
-
});
|
|
103
|
-
try {
|
|
104
|
-
const outcome = await Promise.race([
|
|
105
|
-
this.handlers.send(notification).then(() => {
|
|
106
|
-
ac.abort();
|
|
107
|
-
return { ok: true };
|
|
108
|
-
}),
|
|
109
|
-
timeoutPromise,
|
|
110
|
-
]);
|
|
111
|
-
if ('timeout' in outcome) {
|
|
112
|
-
logWarn('Progress notification timed out', {
|
|
113
|
-
progress: notification.params.progress,
|
|
114
|
-
message: notification.params.message,
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
catch (error) {
|
|
119
|
-
logWarn('Failed to send progress notification', {
|
|
120
|
-
error: getErrorMessage(error),
|
|
121
|
-
progress: notification.params.progress,
|
|
122
|
-
message: notification.params.message,
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
createProgressNotification(token, progress, message) {
|
|
127
|
-
return {
|
|
128
|
-
method: 'notifications/progress',
|
|
129
|
-
params: {
|
|
130
|
-
progressToken: token,
|
|
131
|
-
progress,
|
|
132
|
-
total: DEFAULT_PROGRESS_TOTAL,
|
|
133
|
-
message,
|
|
134
|
-
...(this.taskMeta && {
|
|
135
|
-
_meta: {
|
|
136
|
-
'io.modelcontextprotocol/related-task': this.taskMeta,
|
|
137
|
-
},
|
|
138
|
-
}),
|
|
139
|
-
},
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
export const createProgressReporter = (extra) => ToolProgressReporter.create(extra);
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
type CleanupCallback = () => void;
|
|
3
|
-
type RequestHandlerFn = (request: unknown, extra?: unknown) => Promise<unknown>;
|
|
4
|
-
export declare function registerServerLifecycleCleanup(server: McpServer, callback: CleanupCallback): void;
|
|
5
|
-
/**
|
|
6
|
-
* Retrieves the SDK's internal request-handler map.
|
|
7
|
-
*
|
|
8
|
-
* Depends on SDK private API `_requestHandlers` (verified against ^1.27.1).
|
|
9
|
-
* If the SDK changes this internal, the sdk-compat-guard.test.ts tests will fail.
|
|
10
|
-
*/
|
|
11
|
-
export declare function getSdkCallToolHandler(server: McpServer): RequestHandlerFn | null;
|
|
12
|
-
/**
|
|
13
|
-
* Patches the SDK's internal capabilities to enable/disable task-mode tool calls.
|
|
14
|
-
*
|
|
15
|
-
* Depends on SDK private API `_capabilities.tasks.requests` (verified against ^1.27.1).
|
|
16
|
-
* If the SDK changes this internal, the sdk-compat-guard.test.ts tests will fail.
|
|
17
|
-
*/
|
|
18
|
-
export declare function setTaskToolCallCapability(server: McpServer, enabled: boolean): void;
|
|
19
|
-
export {};
|
|
20
|
-
//# sourceMappingURL=sdk-interop.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-interop.d.ts","sourceRoot":"","sources":["../../src/lib/sdk-interop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,KAAK,eAAe,GAAG,MAAM,IAAI,CAAC;AAClC,KAAK,gBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AA8ChF,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,eAAe,GACxB,IAAI,CAGN;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,GAChB,gBAAgB,GAAG,IAAI,CAMzB;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,OAAO,GACf,IAAI,CAoBN"}
|