@j0hanz/superfetch 1.1.2 → 1.1.3
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 +52 -30
- package/dist/config/formatting.d.ts +9 -0
- package/dist/config/formatting.d.ts.map +1 -0
- package/dist/config/formatting.js +11 -0
- package/dist/config/formatting.js.map +1 -0
- package/dist/config/index.d.ts +11 -2
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +35 -13
- package/dist/config/index.js.map +1 -1
- package/dist/config/types/content.d.ts +107 -0
- package/dist/config/types/content.d.ts.map +1 -0
- package/dist/config/types/content.js +2 -0
- package/dist/config/types/content.js.map +1 -0
- package/dist/config/types/runtime.d.ts +78 -0
- package/dist/config/types/runtime.d.ts.map +1 -0
- package/dist/config/types/runtime.js +2 -0
- package/dist/config/types/runtime.js.map +1 -0
- package/dist/config/types/tools.d.ts +99 -0
- package/dist/config/types/tools.d.ts.map +1 -0
- package/dist/config/types/tools.js +2 -0
- package/dist/config/types/tools.js.map +1 -0
- package/dist/config/types.d.ts +3 -297
- package/dist/config/types.d.ts.map +1 -1
- package/dist/http/auth.d.ts +3 -0
- package/dist/http/auth.d.ts.map +1 -0
- package/dist/http/auth.js +34 -0
- package/dist/http/auth.js.map +1 -0
- package/dist/http/cors.d.ts +8 -0
- package/dist/http/cors.d.ts.map +1 -0
- package/dist/http/cors.js +47 -0
- package/dist/http/cors.js.map +1 -0
- package/dist/http/mcp-routes.d.ts +5 -0
- package/dist/http/mcp-routes.d.ts.map +1 -0
- package/dist/http/mcp-routes.js +110 -0
- package/dist/http/mcp-routes.js.map +1 -0
- package/dist/http/mcp-session.d.ts +12 -0
- package/dist/http/mcp-session.d.ts.map +1 -0
- package/dist/http/mcp-session.js +209 -0
- package/dist/http/mcp-session.js.map +1 -0
- package/dist/http/mcp-validation.d.ts +3 -0
- package/dist/http/mcp-validation.d.ts.map +1 -0
- package/dist/http/mcp-validation.js +34 -0
- package/dist/http/mcp-validation.js.map +1 -0
- package/dist/http/rate-limit.d.ts +13 -0
- package/dist/http/rate-limit.d.ts.map +1 -0
- package/dist/http/rate-limit.js +91 -0
- package/dist/http/rate-limit.js.map +1 -0
- package/dist/http/server.d.ts +4 -0
- package/dist/http/server.d.ts.map +1 -0
- package/dist/http/server.js +183 -0
- package/dist/http/server.js.map +1 -0
- package/dist/http/sessions.d.ts +15 -0
- package/dist/http/sessions.d.ts.map +1 -0
- package/dist/http/sessions.js +64 -0
- package/dist/http/sessions.js.map +1 -0
- package/dist/index.js +26 -341
- package/dist/index.js.map +1 -1
- package/dist/middleware/error-handler.d.ts +2 -2
- package/dist/middleware/error-handler.d.ts.map +1 -1
- package/dist/middleware/error-handler.js +46 -15
- package/dist/middleware/error-handler.js.map +1 -1
- package/dist/resources/cached-content.d.ts.map +1 -1
- package/dist/resources/cached-content.js +104 -44
- package/dist/resources/cached-content.js.map +1 -1
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +77 -69
- package/dist/resources/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +9 -3
- package/dist/server.js.map +1 -1
- package/dist/services/cache.d.ts +13 -1
- package/dist/services/cache.d.ts.map +1 -1
- package/dist/services/cache.js +89 -16
- package/dist/services/cache.js.map +1 -1
- package/dist/services/context.d.ts +1 -1
- package/dist/services/context.d.ts.map +1 -1
- package/dist/services/context.js +1 -1
- package/dist/services/context.js.map +1 -1
- package/dist/services/extractor.d.ts.map +1 -1
- package/dist/services/extractor.js +122 -87
- package/dist/services/extractor.js.map +1 -1
- package/dist/services/fetcher/agents.d.ts +4 -0
- package/dist/services/fetcher/agents.d.ts.map +1 -0
- package/dist/services/fetcher/agents.js +111 -0
- package/dist/services/fetcher/agents.js.map +1 -0
- package/dist/services/fetcher/errors.d.ts +5 -0
- package/dist/services/fetcher/errors.d.ts.map +1 -0
- package/dist/services/fetcher/errors.js +71 -0
- package/dist/services/fetcher/errors.js.map +1 -0
- package/dist/services/fetcher/headers.d.ts +2 -0
- package/dist/services/fetcher/headers.d.ts.map +1 -0
- package/dist/services/fetcher/headers.js +28 -0
- package/dist/services/fetcher/headers.js.map +1 -0
- package/dist/services/fetcher/interceptors.d.ts +10 -0
- package/dist/services/fetcher/interceptors.d.ts.map +1 -0
- package/dist/services/fetcher/interceptors.js +82 -0
- package/dist/services/fetcher/interceptors.js.map +1 -0
- package/dist/services/fetcher/redirects.d.ts +6 -0
- package/dist/services/fetcher/redirects.d.ts.map +1 -0
- package/dist/services/fetcher/redirects.js +67 -0
- package/dist/services/fetcher/redirects.js.map +1 -0
- package/dist/services/fetcher/response.d.ts +5 -0
- package/dist/services/fetcher/response.d.ts.map +1 -0
- package/dist/services/fetcher/response.js +39 -0
- package/dist/services/fetcher/response.js.map +1 -0
- package/dist/services/fetcher/retry-policy.d.ts +28 -0
- package/dist/services/fetcher/retry-policy.d.ts.map +1 -0
- package/dist/services/fetcher/retry-policy.js +138 -0
- package/dist/services/fetcher/retry-policy.js.map +1 -0
- package/dist/services/fetcher.d.ts +2 -1
- package/dist/services/fetcher.d.ts.map +1 -1
- package/dist/services/fetcher.js +62 -315
- package/dist/services/fetcher.js.map +1 -1
- package/dist/services/logger.js +4 -4
- package/dist/services/logger.js.map +1 -1
- package/dist/services/parser.d.ts +1 -0
- package/dist/services/parser.d.ts.map +1 -1
- package/dist/services/parser.js +55 -35
- package/dist/services/parser.js.map +1 -1
- package/dist/tools/handlers/fetch-links/link-extractor.d.ts +4 -0
- package/dist/tools/handlers/fetch-links/link-extractor.d.ts.map +1 -0
- package/dist/tools/handlers/fetch-links/link-extractor.js +163 -0
- package/dist/tools/handlers/fetch-links/link-extractor.js.map +1 -0
- package/dist/tools/handlers/fetch-links.tool.d.ts.map +1 -1
- package/dist/tools/handlers/fetch-links.tool.js +78 -116
- package/dist/tools/handlers/fetch-links.tool.js.map +1 -1
- package/dist/tools/handlers/fetch-markdown.tool.d.ts +3 -13
- package/dist/tools/handlers/fetch-markdown.tool.d.ts.map +1 -1
- package/dist/tools/handlers/fetch-markdown.tool.js +74 -83
- package/dist/tools/handlers/fetch-markdown.tool.js.map +1 -1
- package/dist/tools/handlers/fetch-single.shared.d.ts +26 -0
- package/dist/tools/handlers/fetch-single.shared.d.ts.map +1 -0
- package/dist/tools/handlers/fetch-single.shared.js +49 -0
- package/dist/tools/handlers/fetch-single.shared.js.map +1 -0
- package/dist/tools/handlers/fetch-url.tool.d.ts.map +1 -1
- package/dist/tools/handlers/fetch-url.tool.js +82 -54
- package/dist/tools/handlers/fetch-url.tool.js.map +1 -1
- package/dist/tools/handlers/fetch-urls/processor.d.ts +13 -0
- package/dist/tools/handlers/fetch-urls/processor.d.ts.map +1 -0
- package/dist/tools/handlers/fetch-urls/processor.js +153 -0
- package/dist/tools/handlers/fetch-urls/processor.js.map +1 -0
- package/dist/tools/handlers/fetch-urls/response.d.ts +3 -0
- package/dist/tools/handlers/fetch-urls/response.d.ts.map +1 -0
- package/dist/tools/handlers/fetch-urls/response.js +58 -0
- package/dist/tools/handlers/fetch-urls/response.js.map +1 -0
- package/dist/tools/handlers/fetch-urls/validation.d.ts +6 -0
- package/dist/tools/handlers/fetch-urls/validation.d.ts.map +1 -0
- package/dist/tools/handlers/fetch-urls/validation.js +18 -0
- package/dist/tools/handlers/fetch-urls/validation.js.map +1 -0
- package/dist/tools/handlers/fetch-urls.tool.d.ts.map +1 -1
- package/dist/tools/handlers/fetch-urls.tool.js +104 -202
- package/dist/tools/handlers/fetch-urls.tool.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +36 -237
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/schemas.d.ts +357 -0
- package/dist/tools/schemas.d.ts.map +1 -0
- package/dist/tools/schemas.js +272 -0
- package/dist/tools/schemas.js.map +1 -0
- package/dist/tools/utils/cache-vary.d.ts +3 -0
- package/dist/tools/utils/cache-vary.d.ts.map +1 -0
- package/dist/tools/utils/cache-vary.js +44 -0
- package/dist/tools/utils/cache-vary.js.map +1 -0
- package/dist/tools/utils/common.d.ts +2 -2
- package/dist/tools/utils/common.d.ts.map +1 -1
- package/dist/tools/utils/common.js +5 -1
- package/dist/tools/utils/common.js.map +1 -1
- package/dist/tools/utils/content-transform.d.ts +16 -0
- package/dist/tools/utils/content-transform.d.ts.map +1 -0
- package/dist/tools/utils/content-transform.js +49 -0
- package/dist/tools/utils/content-transform.js.map +1 -0
- package/dist/tools/utils/fetch-pipeline.d.ts.map +1 -1
- package/dist/tools/utils/fetch-pipeline.js +32 -18
- package/dist/tools/utils/fetch-pipeline.js.map +1 -1
- package/dist/tools/utils/inline-content.d.ts +11 -0
- package/dist/tools/utils/inline-content.d.ts.map +1 -0
- package/dist/tools/utils/inline-content.js +39 -0
- package/dist/tools/utils/inline-content.js.map +1 -0
- package/dist/tools/utils/markdown-toc.d.ts +3 -0
- package/dist/tools/utils/markdown-toc.d.ts.map +1 -0
- package/dist/tools/utils/markdown-toc.js +35 -0
- package/dist/tools/utils/markdown-toc.js.map +1 -0
- package/dist/tools/utils/tool-response.d.ts +9 -0
- package/dist/tools/utils/tool-response.d.ts.map +1 -0
- package/dist/tools/utils/tool-response.js +19 -0
- package/dist/tools/utils/tool-response.js.map +1 -0
- package/dist/transformers/jsonl.transformer.d.ts.map +1 -1
- package/dist/transformers/jsonl.transformer.js +51 -28
- package/dist/transformers/jsonl.transformer.js.map +1 -1
- package/dist/transformers/markdown.transformer.d.ts.map +1 -1
- package/dist/transformers/markdown.transformer.js +82 -111
- package/dist/transformers/markdown.transformer.js.map +1 -1
- package/dist/utils/header-normalizer.d.ts +5 -0
- package/dist/utils/header-normalizer.d.ts.map +1 -0
- package/dist/utils/header-normalizer.js +25 -0
- package/dist/utils/header-normalizer.js.map +1 -0
- package/dist/utils/tool-error-handler.d.ts +1 -0
- package/dist/utils/tool-error-handler.d.ts.map +1 -1
- package/dist/utils/tool-error-handler.js +29 -1
- package/dist/utils/tool-error-handler.js.map +1 -1
- package/dist/utils/url-validator.d.ts +0 -3
- package/dist/utils/url-validator.d.ts.map +1 -1
- package/dist/utils/url-validator.js +98 -18
- package/dist/utils/url-validator.js.map +1 -1
- package/package.json +11 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/config/types/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/config/types/tools.ts"],"names":[],"mappings":""}
|
package/dist/config/types.d.ts
CHANGED
|
@@ -1,298 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
type
|
|
3
|
-
|
|
4
|
-
type: ContentBlockType;
|
|
5
|
-
}
|
|
6
|
-
export interface MetadataBlock extends ContentBlock {
|
|
7
|
-
type: 'metadata';
|
|
8
|
-
title?: string;
|
|
9
|
-
description?: string;
|
|
10
|
-
author?: string;
|
|
11
|
-
url: string;
|
|
12
|
-
fetchedAt: string;
|
|
13
|
-
}
|
|
14
|
-
export interface HeadingBlock extends ContentBlock {
|
|
15
|
-
type: 'heading';
|
|
16
|
-
level: number;
|
|
17
|
-
text: string;
|
|
18
|
-
}
|
|
19
|
-
export interface ParagraphBlock extends ContentBlock {
|
|
20
|
-
type: 'paragraph';
|
|
21
|
-
text: string;
|
|
22
|
-
}
|
|
23
|
-
export interface ListBlock extends ContentBlock {
|
|
24
|
-
type: 'list';
|
|
25
|
-
ordered: boolean;
|
|
26
|
-
items: string[];
|
|
27
|
-
}
|
|
28
|
-
export interface CodeBlock extends ContentBlock {
|
|
29
|
-
type: 'code';
|
|
30
|
-
language?: string;
|
|
31
|
-
text: string;
|
|
32
|
-
}
|
|
33
|
-
export interface TableBlock extends ContentBlock {
|
|
34
|
-
type: 'table';
|
|
35
|
-
headers?: string[];
|
|
36
|
-
rows: string[][];
|
|
37
|
-
}
|
|
38
|
-
export interface ImageBlock extends ContentBlock {
|
|
39
|
-
type: 'image';
|
|
40
|
-
src: string;
|
|
41
|
-
alt?: string;
|
|
42
|
-
}
|
|
43
|
-
export interface BlockquoteBlock extends ContentBlock {
|
|
44
|
-
type: 'blockquote';
|
|
45
|
-
text: string;
|
|
46
|
-
}
|
|
47
|
-
export type ContentBlockUnion = MetadataBlock | HeadingBlock | ParagraphBlock | ListBlock | CodeBlock | TableBlock | ImageBlock | BlockquoteBlock;
|
|
48
|
-
export interface ExtractedArticle {
|
|
49
|
-
title?: string;
|
|
50
|
-
byline?: string;
|
|
51
|
-
content: string;
|
|
52
|
-
textContent: string;
|
|
53
|
-
excerpt?: string;
|
|
54
|
-
siteName?: string;
|
|
55
|
-
}
|
|
56
|
-
export interface CacheEntry {
|
|
57
|
-
url: string;
|
|
58
|
-
content: string;
|
|
59
|
-
fetchedAt: string;
|
|
60
|
-
expiresAt: string;
|
|
61
|
-
}
|
|
62
|
-
export interface ExtractedLink {
|
|
63
|
-
href: string;
|
|
64
|
-
text: string;
|
|
65
|
-
type: 'internal' | 'external' | 'image';
|
|
66
|
-
}
|
|
67
|
-
interface RequestOptions {
|
|
68
|
-
/** Custom HTTP headers for the request */
|
|
69
|
-
customHeaders?: Record<string, string>;
|
|
70
|
-
/** Request timeout in milliseconds (1000-60000) */
|
|
71
|
-
timeout?: number;
|
|
72
|
-
/** Number of retry attempts (1-10) */
|
|
73
|
-
retries?: number;
|
|
74
|
-
}
|
|
75
|
-
export interface FetchUrlInput extends RequestOptions {
|
|
76
|
-
url: string;
|
|
77
|
-
extractMainContent?: boolean;
|
|
78
|
-
includeMetadata?: boolean;
|
|
79
|
-
maxContentLength?: number;
|
|
80
|
-
format?: 'jsonl' | 'markdown';
|
|
81
|
-
}
|
|
82
|
-
export interface FetchLinksInput extends RequestOptions {
|
|
83
|
-
url: string;
|
|
84
|
-
includeExternal?: boolean;
|
|
85
|
-
includeInternal?: boolean;
|
|
86
|
-
maxLinks?: number;
|
|
87
|
-
filterPattern?: string;
|
|
88
|
-
includeImages?: boolean;
|
|
89
|
-
}
|
|
90
|
-
export interface FetchMarkdownInput extends RequestOptions {
|
|
91
|
-
url: string;
|
|
92
|
-
extractMainContent?: boolean;
|
|
93
|
-
includeMetadata?: boolean;
|
|
94
|
-
maxContentLength?: number;
|
|
95
|
-
generateToc?: boolean;
|
|
96
|
-
}
|
|
97
|
-
export interface FetchUrlsInput extends RequestOptions {
|
|
98
|
-
urls: string[];
|
|
99
|
-
extractMainContent?: boolean;
|
|
100
|
-
includeMetadata?: boolean;
|
|
101
|
-
maxContentLength?: number;
|
|
102
|
-
format?: 'jsonl' | 'markdown';
|
|
103
|
-
concurrency?: number;
|
|
104
|
-
continueOnError?: boolean;
|
|
105
|
-
}
|
|
106
|
-
export interface ErrorResponse {
|
|
107
|
-
error: {
|
|
108
|
-
message: string;
|
|
109
|
-
code: string;
|
|
110
|
-
statusCode: number;
|
|
111
|
-
details?: Record<string, unknown>;
|
|
112
|
-
stack?: string;
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
export interface RateLimitEntry {
|
|
116
|
-
count: number;
|
|
117
|
-
resetTime: number;
|
|
118
|
-
lastAccessed: number;
|
|
119
|
-
}
|
|
120
|
-
export interface RateLimiterOptions {
|
|
121
|
-
maxRequests: number;
|
|
122
|
-
windowMs: number;
|
|
123
|
-
cleanupIntervalMs: number;
|
|
124
|
-
}
|
|
125
|
-
export interface ExtractedMetadata {
|
|
126
|
-
title?: string;
|
|
127
|
-
description?: string;
|
|
128
|
-
author?: string;
|
|
129
|
-
}
|
|
130
|
-
export interface ExtractionResult {
|
|
131
|
-
article: ExtractedArticle | null;
|
|
132
|
-
metadata: ExtractedMetadata;
|
|
133
|
-
}
|
|
134
|
-
export type ParseableTagName = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'ul' | 'ol' | 'pre' | 'code' | 'table' | 'img' | 'blockquote';
|
|
135
|
-
export interface LinksTransformResult {
|
|
136
|
-
links: ExtractedLink[];
|
|
137
|
-
linkCount: number;
|
|
138
|
-
filtered: number;
|
|
139
|
-
truncated: boolean;
|
|
140
|
-
}
|
|
141
|
-
export interface ExtractLinksOptions {
|
|
142
|
-
includeInternal: boolean;
|
|
143
|
-
includeExternal: boolean;
|
|
144
|
-
includeImages: boolean;
|
|
145
|
-
maxLinks?: number;
|
|
146
|
-
filterPattern?: RegExp;
|
|
147
|
-
}
|
|
148
|
-
export interface TocEntry {
|
|
149
|
-
level: number;
|
|
150
|
-
text: string;
|
|
151
|
-
slug: string;
|
|
152
|
-
}
|
|
153
|
-
export interface MarkdownTransformResult {
|
|
154
|
-
markdown: string;
|
|
155
|
-
title: string | undefined;
|
|
156
|
-
toc: TocEntry[] | undefined;
|
|
157
|
-
truncated: boolean;
|
|
158
|
-
}
|
|
159
|
-
export interface TransformOptions {
|
|
160
|
-
extractMainContent: boolean;
|
|
161
|
-
includeMetadata: boolean;
|
|
162
|
-
generateToc: boolean;
|
|
163
|
-
maxContentLength?: number;
|
|
164
|
-
}
|
|
165
|
-
export interface JsonlTransformResult {
|
|
166
|
-
content: string;
|
|
167
|
-
contentBlocks: number;
|
|
168
|
-
title: string | undefined;
|
|
169
|
-
}
|
|
170
|
-
export interface SingleUrlResult {
|
|
171
|
-
url: string;
|
|
172
|
-
success: boolean;
|
|
173
|
-
title?: string;
|
|
174
|
-
content?: string;
|
|
175
|
-
contentBlocks?: number;
|
|
176
|
-
cached: boolean;
|
|
177
|
-
error?: string;
|
|
178
|
-
errorCode?: string;
|
|
179
|
-
}
|
|
180
|
-
export interface FetchPipelineOptions<T> {
|
|
181
|
-
/** URL to fetch */
|
|
182
|
-
url: string;
|
|
183
|
-
/** Cache namespace (e.g., 'url', 'links', 'markdown') */
|
|
184
|
-
cacheNamespace: string;
|
|
185
|
-
/** Optional custom HTTP headers */
|
|
186
|
-
customHeaders?: Record<string, string>;
|
|
187
|
-
/** Optional: number of retry attempts (1-10, defaults to 3) */
|
|
188
|
-
retries?: number;
|
|
189
|
-
/** Optional: AbortSignal for request cancellation */
|
|
190
|
-
signal?: AbortSignal;
|
|
191
|
-
/** Optional: per-request timeout override in milliseconds */
|
|
192
|
-
timeout?: number;
|
|
193
|
-
/** Transform function to process HTML into desired format */
|
|
194
|
-
transform: (html: string, url: string) => T;
|
|
195
|
-
/** Optional: serialize result for caching (defaults to JSON.stringify) */
|
|
196
|
-
serialize?: (result: T) => string;
|
|
197
|
-
/** Optional: deserialize cached content */
|
|
198
|
-
deserialize?: (cached: string) => T;
|
|
199
|
-
}
|
|
200
|
-
/** Result from the fetch pipeline */
|
|
201
|
-
export interface PipelineResult<T> {
|
|
202
|
-
/** The transformed data */
|
|
203
|
-
data: T;
|
|
204
|
-
/** Whether result came from cache */
|
|
205
|
-
fromCache: boolean;
|
|
206
|
-
/** The normalized URL that was fetched */
|
|
207
|
-
url: string;
|
|
208
|
-
/** Timestamp of when content was fetched/cached */
|
|
209
|
-
fetchedAt: string;
|
|
210
|
-
}
|
|
211
|
-
export interface ToolResponse<T = Record<string, unknown>> {
|
|
212
|
-
[x: string]: unknown;
|
|
213
|
-
content: {
|
|
214
|
-
type: 'text';
|
|
215
|
-
text: string;
|
|
216
|
-
}[];
|
|
217
|
-
structuredContent: T & Record<string, unknown>;
|
|
218
|
-
}
|
|
219
|
-
export interface BatchUrlResult {
|
|
220
|
-
url: string;
|
|
221
|
-
success: boolean;
|
|
222
|
-
title?: string;
|
|
223
|
-
content?: string;
|
|
224
|
-
contentBlocks?: number;
|
|
225
|
-
cached?: boolean;
|
|
226
|
-
error?: string;
|
|
227
|
-
errorCode?: string;
|
|
228
|
-
}
|
|
229
|
-
export interface BatchSummary {
|
|
230
|
-
total: number;
|
|
231
|
-
successful: number;
|
|
232
|
-
failed: number;
|
|
233
|
-
cached: number;
|
|
234
|
-
totalContentBlocks: number;
|
|
235
|
-
}
|
|
236
|
-
export interface BatchResponseContent {
|
|
237
|
-
[x: string]: unknown;
|
|
238
|
-
results: BatchUrlResult[];
|
|
239
|
-
summary: BatchSummary;
|
|
240
|
-
fetchedAt: string;
|
|
241
|
-
}
|
|
242
|
-
export interface ToolErrorResponse {
|
|
243
|
-
[x: string]: unknown;
|
|
244
|
-
content: {
|
|
245
|
-
type: 'text';
|
|
246
|
-
text: string;
|
|
247
|
-
}[];
|
|
248
|
-
structuredContent: {
|
|
249
|
-
[x: string]: unknown;
|
|
250
|
-
error: string;
|
|
251
|
-
url: string;
|
|
252
|
-
errorCode: string;
|
|
253
|
-
};
|
|
254
|
-
isError: true;
|
|
255
|
-
}
|
|
256
|
-
export interface FetchOptions {
|
|
257
|
-
customHeaders?: Record<string, string>;
|
|
258
|
-
signal?: AbortSignal;
|
|
259
|
-
timeout?: number;
|
|
260
|
-
}
|
|
261
|
-
export interface ContentTransformOptions {
|
|
262
|
-
readonly extractMainContent: boolean;
|
|
263
|
-
readonly includeMetadata: boolean;
|
|
264
|
-
}
|
|
265
|
-
export interface TruncationResult {
|
|
266
|
-
readonly content: string;
|
|
267
|
-
readonly truncated: boolean;
|
|
268
|
-
}
|
|
269
|
-
export type ConcurrencyLimitedExecutor = <T>(task: () => Promise<T>) => Promise<T>;
|
|
270
|
-
export type ProgressCallback = (completed: number, total: number) => void;
|
|
271
|
-
export interface ConcurrencyExecutionOptions {
|
|
272
|
-
readonly onProgress?: ProgressCallback;
|
|
273
|
-
}
|
|
274
|
-
export interface SessionEntry {
|
|
275
|
-
readonly transport: StreamableHTTPServerTransport;
|
|
276
|
-
createdAt: number;
|
|
277
|
-
lastSeen: number;
|
|
278
|
-
}
|
|
279
|
-
export interface ToolResponseBase {
|
|
280
|
-
[x: string]: unknown;
|
|
281
|
-
content: {
|
|
282
|
-
type: 'text';
|
|
283
|
-
text: string;
|
|
284
|
-
}[];
|
|
285
|
-
structuredContent?: Record<string, unknown>;
|
|
286
|
-
isError?: boolean;
|
|
287
|
-
}
|
|
288
|
-
export type LinkType = 'internal' | 'external' | 'image';
|
|
289
|
-
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
290
|
-
export type LogMetadata = Record<string, unknown>;
|
|
291
|
-
export interface McpRequestBody {
|
|
292
|
-
method?: string;
|
|
293
|
-
id?: string | number;
|
|
294
|
-
jsonrpc?: '2.0';
|
|
295
|
-
params?: unknown;
|
|
296
|
-
}
|
|
297
|
-
export {};
|
|
1
|
+
export type * from './types/content.js';
|
|
2
|
+
export type * from './types/runtime.js';
|
|
3
|
+
export type * from './types/tools.js';
|
|
298
4
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,mBAAmB,oBAAoB,CAAC;AACxC,mBAAmB,oBAAoB,CAAC;AACxC,mBAAmB,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/http/auth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AA8B/D,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,GAChB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,CAa3D"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { timingSafeEqual } from 'node:crypto';
|
|
2
|
+
function normalizeHeaderValue(header) {
|
|
3
|
+
return Array.isArray(header) ? header[0] : header;
|
|
4
|
+
}
|
|
5
|
+
function timingSafeEquals(a, b) {
|
|
6
|
+
if (a.length !== b.length)
|
|
7
|
+
return false;
|
|
8
|
+
return timingSafeEqual(Buffer.from(a), Buffer.from(b));
|
|
9
|
+
}
|
|
10
|
+
function isAuthorizedRequest(req, authToken) {
|
|
11
|
+
if (!authToken)
|
|
12
|
+
return false;
|
|
13
|
+
const authHeader = normalizeHeaderValue(req.headers.authorization);
|
|
14
|
+
if (authHeader?.startsWith('Bearer ')) {
|
|
15
|
+
const token = authHeader.slice('Bearer '.length).trim();
|
|
16
|
+
return token.length > 0 && timingSafeEquals(token, authToken);
|
|
17
|
+
}
|
|
18
|
+
const apiKeyHeader = normalizeHeaderValue(req.headers['x-api-key']);
|
|
19
|
+
if (apiKeyHeader) {
|
|
20
|
+
return timingSafeEquals(apiKeyHeader.trim(), authToken);
|
|
21
|
+
}
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
export function createAuthMiddleware(authToken) {
|
|
25
|
+
return (req, res, next) => {
|
|
26
|
+
if (isAuthorizedRequest(req, authToken)) {
|
|
27
|
+
next();
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
res.set('WWW-Authenticate', 'Bearer realm="mcp", error="invalid_token", error_description="Missing or invalid credentials"');
|
|
31
|
+
res.status(401).json({ error: 'Unauthorized' });
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/http/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAI9C,SAAS,oBAAoB,CAC3B,MAAqC;IAErC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACpD,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAS,EAAE,CAAS;IAC5C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAY,EAAE,SAAiB;IAC1D,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAE7B,MAAM,UAAU,GAAG,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACnE,IAAI,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACxD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,YAAY,GAAG,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IACpE,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,gBAAgB,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,SAAiB;IAEjB,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAQ,EAAE;QAC/D,IAAI,mBAAmB,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC;YACxC,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,GAAG,CAAC,GAAG,CACL,kBAAkB,EAClB,+FAA+F,CAChG,CAAC;QACF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { NextFunction, Request, Response } from 'express';
|
|
2
|
+
interface CorsOptions {
|
|
3
|
+
readonly allowedOrigins: string[];
|
|
4
|
+
readonly allowAllOrigins: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function createCorsMiddleware(options: CorsOptions): (req: Request, res: Response, next: NextFunction) => void;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=cors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../../src/http/cors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE/D,UAAU,WAAW;IACnB,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC;AAgBD,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,WAAW,GACnB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,CAoB3D"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
function isOriginAllowed(origin, options) {
|
|
2
|
+
if (!origin)
|
|
3
|
+
return true;
|
|
4
|
+
if (options.allowAllOrigins)
|
|
5
|
+
return true;
|
|
6
|
+
if (options.allowedOrigins.length === 0)
|
|
7
|
+
return false;
|
|
8
|
+
return options.allowedOrigins.includes(origin);
|
|
9
|
+
}
|
|
10
|
+
function isValidOrigin(origin) {
|
|
11
|
+
return URL.canParse(origin);
|
|
12
|
+
}
|
|
13
|
+
export function createCorsMiddleware(options) {
|
|
14
|
+
return (req, res, next) => {
|
|
15
|
+
const origin = resolveOrigin(req);
|
|
16
|
+
if (shouldSkipInvalidOrigin(origin)) {
|
|
17
|
+
next();
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (!applyCorsHeaders(res, origin, options)) {
|
|
21
|
+
next();
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (req.method === 'OPTIONS') {
|
|
25
|
+
res.sendStatus(200);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
next();
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function resolveOrigin(req) {
|
|
32
|
+
return req.headers.origin;
|
|
33
|
+
}
|
|
34
|
+
function shouldSkipInvalidOrigin(origin) {
|
|
35
|
+
return Boolean(origin && !isValidOrigin(origin));
|
|
36
|
+
}
|
|
37
|
+
function applyCorsHeaders(res, origin, options) {
|
|
38
|
+
if (isOriginAllowed(origin, options)) {
|
|
39
|
+
res.header('Access-Control-Allow-Origin', origin ?? '*');
|
|
40
|
+
res.header('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
|
|
41
|
+
res.header('Access-Control-Allow-Headers', 'Content-Type, mcp-session-id, Authorization, X-API-Key');
|
|
42
|
+
res.header('Access-Control-Max-Age', '86400');
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
return options.allowedOrigins.length === 0;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=cors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.js","sourceRoot":"","sources":["../../src/http/cors.ts"],"names":[],"mappings":"AAOA,SAAS,eAAe,CACtB,MAA0B,EAC1B,OAAoB;IAEpB,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,OAAO,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,OAAO,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtD,OAAO,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,aAAa,CAAC,MAAc;IACnC,OAAO,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,OAAoB;IAEpB,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAQ,EAAE;QAC/D,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;YAC5C,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,GAAY;IACjC,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;AAC5B,CAAC;AAED,SAAS,uBAAuB,CAAC,MAA0B;IACzD,OAAO,OAAO,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,gBAAgB,CACvB,GAAa,EACb,MAA0B,EAC1B,OAAoB;IAEpB,IAAI,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;QACrC,GAAG,CAAC,MAAM,CAAC,6BAA6B,EAAE,MAAM,IAAI,GAAG,CAAC,CAAC;QACzD,GAAG,CAAC,MAAM,CAAC,8BAA8B,EAAE,4BAA4B,CAAC,CAAC;QACzE,GAAG,CAAC,MAAM,CACR,8BAA8B,EAC9B,wDAAwD,CACzD,CAAC;QACF,GAAG,CAAC,MAAM,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,OAAO,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Express } from 'express';
|
|
2
|
+
import { type McpSessionOptions } from './mcp-session.js';
|
|
3
|
+
export declare function registerMcpRoutes(app: Express, options: McpSessionOptions): void;
|
|
4
|
+
export { evictExpiredSessions, evictOldestSession } from './mcp-session.js';
|
|
5
|
+
//# sourceMappingURL=mcp-routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-routes.d.ts","sourceRoot":"","sources":["../../src/http/mcp-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAmC,MAAM,SAAS,CAAC;AAQxE,OAAO,EACL,KAAK,iBAAiB,EAEvB,MAAM,kBAAkB,CAAC;AAoK1B,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,iBAAiB,GACzB,IAAI,CAmBN;AAED,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { logError, logInfo } from '../services/logger.js';
|
|
2
|
+
import { resolveTransportForPost, } from './mcp-session.js';
|
|
3
|
+
import { isMcpRequestBody } from './mcp-validation.js';
|
|
4
|
+
import { getSessionId } from './sessions.js';
|
|
5
|
+
function sendJsonRpcError(res, code, message, status = 400) {
|
|
6
|
+
res.status(status).json({
|
|
7
|
+
jsonrpc: '2.0',
|
|
8
|
+
error: {
|
|
9
|
+
code,
|
|
10
|
+
message,
|
|
11
|
+
},
|
|
12
|
+
id: null,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
function respondInvalidRequestBody(res) {
|
|
16
|
+
sendJsonRpcError(res, -32600, 'Invalid Request: Malformed request body', 400);
|
|
17
|
+
}
|
|
18
|
+
function respondMissingSession(res) {
|
|
19
|
+
res.status(400).json({ error: 'Missing mcp-session-id header' });
|
|
20
|
+
}
|
|
21
|
+
function respondSessionNotFound(res) {
|
|
22
|
+
res.status(404).json({ error: 'Session not found' });
|
|
23
|
+
}
|
|
24
|
+
function logPostRequest(body, sessionId, options) {
|
|
25
|
+
logInfo('[MCP POST]', {
|
|
26
|
+
method: body.method,
|
|
27
|
+
id: body.id,
|
|
28
|
+
sessionId: sessionId ?? 'none',
|
|
29
|
+
isInitialize: body.method === 'initialize',
|
|
30
|
+
sessionCount: options.sessionStore.size(),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
async function handleTransportRequest(transport, req, res, body) {
|
|
34
|
+
try {
|
|
35
|
+
await dispatchTransportRequest(transport, req, res, body);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
logError('MCP request handling failed', error instanceof Error ? error : undefined);
|
|
39
|
+
handleTransportError(res);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function handleTransportError(res) {
|
|
43
|
+
if (res.headersSent)
|
|
44
|
+
return;
|
|
45
|
+
res.status(500).json({ error: 'Internal Server Error' });
|
|
46
|
+
}
|
|
47
|
+
function dispatchTransportRequest(transport, req, res, body) {
|
|
48
|
+
return body
|
|
49
|
+
? transport.handleRequest(req, res, body)
|
|
50
|
+
: transport.handleRequest(req, res);
|
|
51
|
+
}
|
|
52
|
+
function resolveSessionTransport(sessionId, options, res) {
|
|
53
|
+
if (!sessionId) {
|
|
54
|
+
respondMissingSession(res);
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
const session = options.sessionStore.get(sessionId);
|
|
58
|
+
if (!session) {
|
|
59
|
+
respondSessionNotFound(res);
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
options.sessionStore.touch(sessionId);
|
|
63
|
+
return session.transport;
|
|
64
|
+
}
|
|
65
|
+
function resolveSessionTransportForDelete(sessionId, options) {
|
|
66
|
+
if (!sessionId)
|
|
67
|
+
return null;
|
|
68
|
+
const session = options.sessionStore.get(sessionId);
|
|
69
|
+
if (!session)
|
|
70
|
+
return null;
|
|
71
|
+
options.sessionStore.touch(sessionId);
|
|
72
|
+
return session.transport;
|
|
73
|
+
}
|
|
74
|
+
async function handlePost(req, res, options) {
|
|
75
|
+
const sessionId = getSessionId(req);
|
|
76
|
+
const { body } = req;
|
|
77
|
+
if (!isMcpRequestBody(body)) {
|
|
78
|
+
respondInvalidRequestBody(res);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
logPostRequest(body, sessionId, options);
|
|
82
|
+
const transport = await resolveTransportForPost(req, res, body, sessionId, options);
|
|
83
|
+
if (!transport)
|
|
84
|
+
return;
|
|
85
|
+
await handleTransportRequest(transport, req, res, body);
|
|
86
|
+
}
|
|
87
|
+
async function handleGet(req, res, options) {
|
|
88
|
+
const transport = resolveSessionTransport(getSessionId(req), options, res);
|
|
89
|
+
if (!transport)
|
|
90
|
+
return;
|
|
91
|
+
await handleTransportRequest(transport, req, res);
|
|
92
|
+
}
|
|
93
|
+
async function handleDelete(req, res, options) {
|
|
94
|
+
const transport = resolveSessionTransportForDelete(getSessionId(req), options);
|
|
95
|
+
if (!transport) {
|
|
96
|
+
res.status(204).end();
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
await handleTransportRequest(transport, req, res);
|
|
100
|
+
}
|
|
101
|
+
export function registerMcpRoutes(app, options) {
|
|
102
|
+
const asyncHandler = (fn) => (req, res, next) => {
|
|
103
|
+
Promise.resolve(fn(req, res)).catch(next);
|
|
104
|
+
};
|
|
105
|
+
app.post('/mcp', asyncHandler((req, res) => handlePost(req, res, options)));
|
|
106
|
+
app.get('/mcp', asyncHandler((req, res) => handleGet(req, res, options)));
|
|
107
|
+
app.delete('/mcp', asyncHandler((req, res) => handleDelete(req, res, options)));
|
|
108
|
+
}
|
|
109
|
+
export { evictExpiredSessions, evictOldestSession } from './mcp-session.js';
|
|
110
|
+
//# sourceMappingURL=mcp-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-routes.js","sourceRoot":"","sources":["../../src/http/mcp-routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Request, Response } from 'express';
|
|
2
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
3
|
+
import type { McpRequestBody } from '../config/types.js';
|
|
4
|
+
import { type SessionStore } from './sessions.js';
|
|
5
|
+
export interface McpSessionOptions {
|
|
6
|
+
readonly sessionStore: SessionStore;
|
|
7
|
+
readonly maxSessions: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function resolveTransportForPost(_req: Request, res: Response, body: McpRequestBody, sessionId: string | undefined, options: McpSessionOptions): Promise<StreamableHTTPServerTransport | null>;
|
|
10
|
+
export declare function evictExpiredSessions(store: SessionStore): number;
|
|
11
|
+
export declare function evictOldestSession(store: SessionStore): boolean;
|
|
12
|
+
//# sourceMappingURL=mcp-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-session.d.ts","sourceRoot":"","sources":["../../src/http/mcp-session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEjD,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAInG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAKzD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAoQD,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,cAAc,EACpB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,6BAA6B,GAAG,IAAI,CAAC,CAa/C;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAUhE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAS/D"}
|