@llmindset/hf-mcp-server 0.1.16
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/LICENSE +21 -0
- package/components.json +21 -0
- package/dist/server/application.d.ts +30 -0
- package/dist/server/application.d.ts.map +1 -0
- package/dist/server/application.js +131 -0
- package/dist/server/application.js.map +1 -0
- package/dist/server/gradio-endpoint-connector.d.ts +46 -0
- package/dist/server/gradio-endpoint-connector.d.ts.map +1 -0
- package/dist/server/gradio-endpoint-connector.js +348 -0
- package/dist/server/gradio-endpoint-connector.js.map +1 -0
- package/dist/server/gradio-endpoint-connector.test.d.ts +2 -0
- package/dist/server/gradio-endpoint-connector.test.d.ts.map +1 -0
- package/dist/server/gradio-endpoint-connector.test.js +313 -0
- package/dist/server/gradio-endpoint-connector.test.js.map +1 -0
- package/dist/server/lib/logger.d.ts +5 -0
- package/dist/server/lib/logger.d.ts.map +1 -0
- package/dist/server/lib/logger.js +45 -0
- package/dist/server/lib/logger.js.map +1 -0
- package/dist/server/lib/mcp-api-client.d.ts +42 -0
- package/dist/server/lib/mcp-api-client.d.ts.map +1 -0
- package/dist/server/lib/mcp-api-client.js +188 -0
- package/dist/server/lib/mcp-api-client.js.map +1 -0
- package/dist/server/lib/tool-selection-strategy.d.ts +29 -0
- package/dist/server/lib/tool-selection-strategy.d.ts.map +1 -0
- package/dist/server/lib/tool-selection-strategy.js +113 -0
- package/dist/server/lib/tool-selection-strategy.js.map +1 -0
- package/dist/server/lib/tool-selection-strategy.test.d.ts +2 -0
- package/dist/server/lib/tool-selection-strategy.test.d.ts.map +1 -0
- package/dist/server/lib/tool-selection-strategy.test.js +407 -0
- package/dist/server/lib/tool-selection-strategy.test.js.map +1 -0
- package/dist/server/mcp-proxy.d.ts +5 -0
- package/dist/server/mcp-proxy.d.ts.map +1 -0
- package/dist/server/mcp-proxy.js +66 -0
- package/dist/server/mcp-proxy.js.map +1 -0
- package/dist/server/mcp-server.d.ts +8 -0
- package/dist/server/mcp-server.d.ts.map +1 -0
- package/dist/server/mcp-server.js +219 -0
- package/dist/server/mcp-server.js.map +1 -0
- package/dist/server/sse.d.ts +3 -0
- package/dist/server/sse.d.ts.map +1 -0
- package/dist/server/sse.js +47 -0
- package/dist/server/sse.js.map +1 -0
- package/dist/server/stdio.d.ts +3 -0
- package/dist/server/stdio.d.ts.map +1 -0
- package/dist/server/stdio.js +49 -0
- package/dist/server/stdio.js.map +1 -0
- package/dist/server/streamableHttp.d.ts +3 -0
- package/dist/server/streamableHttp.d.ts.map +1 -0
- package/dist/server/streamableHttp.js +53 -0
- package/dist/server/streamableHttp.js.map +1 -0
- package/dist/server/transport/base-transport.d.ts +132 -0
- package/dist/server/transport/base-transport.d.ts.map +1 -0
- package/dist/server/transport/base-transport.js +390 -0
- package/dist/server/transport/base-transport.js.map +1 -0
- package/dist/server/transport/json-rpc-errors.d.ts +36 -0
- package/dist/server/transport/json-rpc-errors.d.ts.map +1 -0
- package/dist/server/transport/json-rpc-errors.js +53 -0
- package/dist/server/transport/json-rpc-errors.js.map +1 -0
- package/dist/server/transport/sse-transport.d.ts +17 -0
- package/dist/server/transport/sse-transport.d.ts.map +1 -0
- package/dist/server/transport/sse-transport.js +170 -0
- package/dist/server/transport/sse-transport.js.map +1 -0
- package/dist/server/transport/stateless-http-transport.d.ts +11 -0
- package/dist/server/transport/stateless-http-transport.d.ts.map +1 -0
- package/dist/server/transport/stateless-http-transport.js +172 -0
- package/dist/server/transport/stateless-http-transport.js.map +1 -0
- package/dist/server/transport/stateless-http-transport.test.d.ts +2 -0
- package/dist/server/transport/stateless-http-transport.test.d.ts.map +1 -0
- package/dist/server/transport/stateless-http-transport.test.js +58 -0
- package/dist/server/transport/stateless-http-transport.test.js.map +1 -0
- package/dist/server/transport/stdio-transport.d.ts +12 -0
- package/dist/server/transport/stdio-transport.d.ts.map +1 -0
- package/dist/server/transport/stdio-transport.js +78 -0
- package/dist/server/transport/stdio-transport.js.map +1 -0
- package/dist/server/transport/streamable-http-transport.d.ts +21 -0
- package/dist/server/transport/streamable-http-transport.d.ts.map +1 -0
- package/dist/server/transport/streamable-http-transport.js +220 -0
- package/dist/server/transport/streamable-http-transport.js.map +1 -0
- package/dist/server/transport/transport-factory.d.ts +5 -0
- package/dist/server/transport/transport-factory.d.ts.map +1 -0
- package/dist/server/transport/transport-factory.js +21 -0
- package/dist/server/transport/transport-factory.js.map +1 -0
- package/dist/server/utils/api-metrics.d.ts +15 -0
- package/dist/server/utils/api-metrics.d.ts.map +1 -0
- package/dist/server/utils/api-metrics.js +39 -0
- package/dist/server/utils/api-metrics.js.map +1 -0
- package/dist/server/utils/auth-utils.d.ts +6 -0
- package/dist/server/utils/auth-utils.d.ts.map +1 -0
- package/dist/server/utils/auth-utils.js +25 -0
- package/dist/server/utils/auth-utils.js.map +1 -0
- package/dist/server/utils/browser-detection.d.ts +2 -0
- package/dist/server/utils/browser-detection.d.ts.map +1 -0
- package/dist/server/utils/browser-detection.js +15 -0
- package/dist/server/utils/browser-detection.js.map +1 -0
- package/dist/server/utils/browser-detection.test.d.ts +2 -0
- package/dist/server/utils/browser-detection.test.d.ts.map +1 -0
- package/dist/server/utils/browser-detection.test.js +50 -0
- package/dist/server/utils/browser-detection.test.js.map +1 -0
- package/dist/server/utils/gradio-metrics.d.ts +22 -0
- package/dist/server/utils/gradio-metrics.d.ts.map +1 -0
- package/dist/server/utils/gradio-metrics.js +60 -0
- package/dist/server/utils/gradio-metrics.js.map +1 -0
- package/dist/server/utils/query-params.d.ts +3 -0
- package/dist/server/utils/query-params.d.ts.map +1 -0
- package/dist/server/utils/query-params.js +17 -0
- package/dist/server/utils/query-params.js.map +1 -0
- package/dist/server/utils/query-params.test.d.ts +2 -0
- package/dist/server/utils/query-params.test.d.ts.map +1 -0
- package/dist/server/utils/query-params.test.js +75 -0
- package/dist/server/utils/query-params.test.js.map +1 -0
- package/dist/server/web-server.d.ts +29 -0
- package/dist/server/web-server.d.ts.map +1 -0
- package/dist/server/web-server.js +273 -0
- package/dist/server/web-server.js.map +1 -0
- package/dist/shared/constants.d.ts +5 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +4 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/settings.d.ts +19 -0
- package/dist/shared/settings.d.ts.map +1 -0
- package/dist/shared/settings.js +47 -0
- package/dist/shared/settings.js.map +1 -0
- package/dist/shared/transport-info.d.ts +18 -0
- package/dist/shared/transport-info.d.ts.map +1 -0
- package/dist/shared/transport-info.js +22 -0
- package/dist/shared/transport-info.js.map +1 -0
- package/dist/shared/transport-info.test.d.ts +2 -0
- package/dist/shared/transport-info.test.d.ts.map +1 -0
- package/dist/shared/transport-info.test.js +90 -0
- package/dist/shared/transport-info.test.js.map +1 -0
- package/dist/shared/transport-metrics.d.ts +180 -0
- package/dist/shared/transport-metrics.d.ts.map +1 -0
- package/dist/shared/transport-metrics.js +247 -0
- package/dist/shared/transport-metrics.js.map +1 -0
- package/dist/shared/transport-metrics.test.d.ts +2 -0
- package/dist/shared/transport-metrics.test.d.ts.map +1 -0
- package/dist/shared/transport-metrics.test.js +10 -0
- package/dist/shared/transport-metrics.test.js.map +1 -0
- package/dist/web/assets/button-C4Q2P8Ns.css +1 -0
- package/dist/web/assets/button-DOWMQOme.js +79 -0
- package/dist/web/assets/hf-logo-DbjPOSLw.svg +21 -0
- package/dist/web/assets/main-CB77vUha.js +115 -0
- package/dist/web/assets/mcpWelcome-Cpw1-KJi.js +1 -0
- package/dist/web/hf-logo-DbjPOSLw.svg +21 -0
- package/dist/web/index.html +15 -0
- package/dist/web/mcp-welcome.html +92 -0
- package/package.json +100 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { Express } from 'express';
|
|
3
|
+
import type { TransportMetrics } from '../../shared/transport-metrics.js';
|
|
4
|
+
import { MetricsCounter } from '../../shared/transport-metrics.js';
|
|
5
|
+
import type { AppSettings } from '../../shared/settings.js';
|
|
6
|
+
export type ServerFactory = (headers: Record<string, string> | null, userSettings?: AppSettings, skipGradio?: boolean) => Promise<McpServer>;
|
|
7
|
+
export interface TransportOptions {
|
|
8
|
+
port?: number;
|
|
9
|
+
onClientInfoUpdate?: (clientInfo: {
|
|
10
|
+
name: string;
|
|
11
|
+
version: string;
|
|
12
|
+
}) => void;
|
|
13
|
+
}
|
|
14
|
+
export interface SessionMetadata {
|
|
15
|
+
id: string;
|
|
16
|
+
connectedAt: Date;
|
|
17
|
+
lastActivity: Date;
|
|
18
|
+
requestCount: number;
|
|
19
|
+
clientInfo?: {
|
|
20
|
+
name: string;
|
|
21
|
+
version: string;
|
|
22
|
+
};
|
|
23
|
+
capabilities: {
|
|
24
|
+
sampling?: boolean;
|
|
25
|
+
roots?: boolean;
|
|
26
|
+
};
|
|
27
|
+
pingFailures?: number;
|
|
28
|
+
lastPingAttempt?: Date;
|
|
29
|
+
}
|
|
30
|
+
export interface BaseSession<T = unknown> {
|
|
31
|
+
transport: T;
|
|
32
|
+
server: McpServer;
|
|
33
|
+
metadata: SessionMetadata;
|
|
34
|
+
heartbeatInterval?: NodeJS.Timeout;
|
|
35
|
+
}
|
|
36
|
+
export declare const STATELESS_MODE = -1;
|
|
37
|
+
export declare abstract class BaseTransport {
|
|
38
|
+
protected serverFactory: ServerFactory;
|
|
39
|
+
protected app: Express;
|
|
40
|
+
protected metrics: MetricsCounter;
|
|
41
|
+
constructor(serverFactory: ServerFactory, app: Express);
|
|
42
|
+
abstract initialize(options: TransportOptions): Promise<void>;
|
|
43
|
+
abstract cleanup(): Promise<void>;
|
|
44
|
+
shutdown?(): void;
|
|
45
|
+
abstract getActiveConnectionCount(): number;
|
|
46
|
+
getSessions(): SessionMetadata[];
|
|
47
|
+
getMetrics(): TransportMetrics;
|
|
48
|
+
getConfiguration(): {
|
|
49
|
+
heartbeatInterval?: number;
|
|
50
|
+
staleCheckInterval?: number;
|
|
51
|
+
staleTimeout?: number;
|
|
52
|
+
pingEnabled?: boolean;
|
|
53
|
+
pingInterval?: number;
|
|
54
|
+
pingFailureThreshold?: number;
|
|
55
|
+
};
|
|
56
|
+
protected trackRequest(): void;
|
|
57
|
+
protected trackError(statusCode?: number, error?: Error): void;
|
|
58
|
+
protected trackNewConnection(): void;
|
|
59
|
+
protected associateSessionWithClient(clientInfo: {
|
|
60
|
+
name: string;
|
|
61
|
+
version: string;
|
|
62
|
+
}): void;
|
|
63
|
+
protected updateClientActivity(clientInfo?: {
|
|
64
|
+
name: string;
|
|
65
|
+
version: string;
|
|
66
|
+
}): void;
|
|
67
|
+
protected disconnectClient(clientInfo?: {
|
|
68
|
+
name: string;
|
|
69
|
+
version: string;
|
|
70
|
+
}): void;
|
|
71
|
+
protected extractMethodForTracking(requestBody: unknown): string | null;
|
|
72
|
+
protected shouldSkipGradio(requestBody: unknown): boolean;
|
|
73
|
+
protected trackMethodCall(methodName: string | null, startTime: number, isError?: boolean): void;
|
|
74
|
+
protected validateAuthAndTrackMetrics(headers: Record<string, string>): Promise<{
|
|
75
|
+
shouldContinue: boolean;
|
|
76
|
+
statusCode?: number;
|
|
77
|
+
}>;
|
|
78
|
+
}
|
|
79
|
+
export declare abstract class StatefulTransport<TSession extends BaseSession = BaseSession> extends BaseTransport {
|
|
80
|
+
protected sessions: Map<string, TSession>;
|
|
81
|
+
protected isShuttingDown: boolean;
|
|
82
|
+
protected staleCheckInterval?: NodeJS.Timeout;
|
|
83
|
+
protected pingInterval?: NodeJS.Timeout;
|
|
84
|
+
protected pingsInFlight: Set<string>;
|
|
85
|
+
protected readonly STALE_CHECK_INTERVAL: number;
|
|
86
|
+
protected readonly STALE_TIMEOUT: number;
|
|
87
|
+
protected readonly HEARTBEAT_INTERVAL: number;
|
|
88
|
+
protected readonly PING_ENABLED: boolean;
|
|
89
|
+
protected readonly PING_INTERVAL: number;
|
|
90
|
+
protected readonly PING_FAILURE_THRESHOLD: number;
|
|
91
|
+
protected updateSessionActivity(sessionId: string): void;
|
|
92
|
+
protected isSessionDistressed(session: BaseSession): boolean;
|
|
93
|
+
protected createClientInfoCapture(sessionId: string): () => void;
|
|
94
|
+
protected pingSingleSession(sessionId: string): void;
|
|
95
|
+
protected startPingKeepAlive(): void;
|
|
96
|
+
protected stopPingKeepAlive(): void;
|
|
97
|
+
protected startStaleConnectionCheck(): void;
|
|
98
|
+
protected abstract removeStaleSession(sessionId: string): Promise<void>;
|
|
99
|
+
shutdown(): void;
|
|
100
|
+
getActiveConnectionCount(): number;
|
|
101
|
+
isAcceptingConnections(): boolean;
|
|
102
|
+
protected stopStaleConnectionCheck(): void;
|
|
103
|
+
protected trackSessionCreated(sessionId: string): void;
|
|
104
|
+
protected trackSessionCleaned(session?: TSession): void;
|
|
105
|
+
getSessions(): SessionMetadata[];
|
|
106
|
+
getConfiguration(): {
|
|
107
|
+
heartbeatInterval: number;
|
|
108
|
+
staleCheckInterval: number;
|
|
109
|
+
staleTimeout: number;
|
|
110
|
+
pingEnabled: boolean;
|
|
111
|
+
pingInterval: number;
|
|
112
|
+
pingFailureThreshold: number;
|
|
113
|
+
};
|
|
114
|
+
protected startHeartbeat(sessionId: string, response: {
|
|
115
|
+
destroyed: boolean;
|
|
116
|
+
writableEnded: boolean;
|
|
117
|
+
}): void;
|
|
118
|
+
protected stopHeartbeat(sessionId: string): void;
|
|
119
|
+
protected setupSseEventHandlers(sessionId: string, response: {
|
|
120
|
+
on: (event: string, handler: (...args: unknown[]) => void) => void;
|
|
121
|
+
}): void;
|
|
122
|
+
protected cleanupSession(sessionId: string): Promise<void>;
|
|
123
|
+
protected cleanupAllSessions(): Promise<void>;
|
|
124
|
+
protected setupServerForSession(server: McpServer, sessionId: string): void;
|
|
125
|
+
protected validateSessionRequest(sessionId: string | undefined, requestBody: unknown, allowMissingSession?: boolean): {
|
|
126
|
+
isValid: boolean;
|
|
127
|
+
errorResponse?: object;
|
|
128
|
+
statusCode?: number;
|
|
129
|
+
trackingName: string | null;
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=base-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-transport.d.ts","sourceRoot":"","sources":["../../../src/server/transport/base-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
import { logger } from '../lib/logger.js';
|
|
2
|
+
import { MetricsCounter } from '../../shared/transport-metrics.js';
|
|
3
|
+
import { JsonRpcErrors, extractJsonRpcId } from './json-rpc-errors.js';
|
|
4
|
+
import { whoAmI, HubApiError } from '@huggingface/hub';
|
|
5
|
+
import { extractAuthBouquetAndMix } from '../utils/auth-utils.js';
|
|
6
|
+
import { getMetricsSafeName } from '../utils/gradio-metrics.js';
|
|
7
|
+
export const STATELESS_MODE = -1;
|
|
8
|
+
export class BaseTransport {
|
|
9
|
+
serverFactory;
|
|
10
|
+
app;
|
|
11
|
+
metrics;
|
|
12
|
+
constructor(serverFactory, app) {
|
|
13
|
+
this.serverFactory = serverFactory;
|
|
14
|
+
this.app = app;
|
|
15
|
+
this.metrics = new MetricsCounter();
|
|
16
|
+
}
|
|
17
|
+
getSessions() {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
getMetrics() {
|
|
21
|
+
return this.metrics.getMetrics();
|
|
22
|
+
}
|
|
23
|
+
getConfiguration() {
|
|
24
|
+
return {};
|
|
25
|
+
}
|
|
26
|
+
trackRequest() {
|
|
27
|
+
this.metrics.trackRequest();
|
|
28
|
+
}
|
|
29
|
+
trackError(statusCode, error) {
|
|
30
|
+
this.metrics.trackError(statusCode, error);
|
|
31
|
+
}
|
|
32
|
+
trackNewConnection() {
|
|
33
|
+
this.metrics.trackNewConnection();
|
|
34
|
+
}
|
|
35
|
+
associateSessionWithClient(clientInfo) {
|
|
36
|
+
this.metrics.associateSessionWithClient(clientInfo);
|
|
37
|
+
}
|
|
38
|
+
updateClientActivity(clientInfo) {
|
|
39
|
+
this.metrics.updateClientActivity(clientInfo);
|
|
40
|
+
}
|
|
41
|
+
disconnectClient(clientInfo) {
|
|
42
|
+
this.metrics.disconnectClient(clientInfo);
|
|
43
|
+
}
|
|
44
|
+
extractMethodForTracking(requestBody) {
|
|
45
|
+
const body = requestBody;
|
|
46
|
+
if (body && 'id' in body && !('method' in body)) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
const methodName = body?.method || 'unknown';
|
|
50
|
+
if (methodName === 'tools/call' && body?.params && typeof body.params === 'object' && 'name' in body.params) {
|
|
51
|
+
const toolName = body.params.name;
|
|
52
|
+
if (typeof toolName === 'string') {
|
|
53
|
+
const safeToolName = getMetricsSafeName(toolName);
|
|
54
|
+
return `tools/call:${safeToolName}`;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (methodName === 'prompts/get' && body?.params && typeof body.params === 'object' && 'name' in body.params) {
|
|
58
|
+
const promptName = body.params.name;
|
|
59
|
+
if (typeof promptName === 'string') {
|
|
60
|
+
return `prompts/get:${promptName}`;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return methodName;
|
|
64
|
+
}
|
|
65
|
+
shouldSkipGradio(requestBody) {
|
|
66
|
+
const body = requestBody;
|
|
67
|
+
const methodName = body?.method || 'unknown';
|
|
68
|
+
if (methodName === 'initialize' || methodName.startsWith('prompts/')) {
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
if (methodName === 'tools/call' && body?.params && typeof body.params === 'object' && 'name' in body.params) {
|
|
72
|
+
const toolName = body.params.name;
|
|
73
|
+
if (typeof toolName === 'string') {
|
|
74
|
+
return !/^grp?\d+_/.test(toolName);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
trackMethodCall(methodName, startTime, isError = false) {
|
|
80
|
+
const duration = Date.now() - startTime;
|
|
81
|
+
this.metrics.trackMethod(methodName, duration, isError);
|
|
82
|
+
}
|
|
83
|
+
async validateAuthAndTrackMetrics(headers) {
|
|
84
|
+
const { hfToken } = extractAuthBouquetAndMix(headers);
|
|
85
|
+
if (hfToken) {
|
|
86
|
+
try {
|
|
87
|
+
await whoAmI({ credentials: { accessToken: hfToken } });
|
|
88
|
+
this.metrics.trackAuthenticatedConnection();
|
|
89
|
+
return { shouldContinue: true };
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
const errorObj = error;
|
|
93
|
+
const isUnauthorized = (error instanceof HubApiError && error.statusCode === 401) ||
|
|
94
|
+
errorObj.statusCode === 401 ||
|
|
95
|
+
errorObj.status === 401 ||
|
|
96
|
+
(error instanceof Error && error.message.includes('401')) ||
|
|
97
|
+
(error instanceof TypeError && error.message.includes('Your access token must start with'));
|
|
98
|
+
if (isUnauthorized) {
|
|
99
|
+
logger.debug('Invalid HF token - returning 401');
|
|
100
|
+
this.metrics.trackUnauthorizedConnection();
|
|
101
|
+
return { shouldContinue: false, statusCode: 401 };
|
|
102
|
+
}
|
|
103
|
+
logger.debug({ error }, 'Non-401 error from whoAmI, continuing without auth tracking');
|
|
104
|
+
return { shouldContinue: true };
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
this.metrics.trackAnonymousConnection();
|
|
109
|
+
const shouldContinue = !headers['x-mcp-force-auth'];
|
|
110
|
+
if (!shouldContinue)
|
|
111
|
+
logger.trace(`NO TOKEN, FORCE AUTH? ${headers['x-mcp-force-auth']}`);
|
|
112
|
+
return { shouldContinue };
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
export class StatefulTransport extends BaseTransport {
|
|
117
|
+
sessions = new Map();
|
|
118
|
+
isShuttingDown = false;
|
|
119
|
+
staleCheckInterval;
|
|
120
|
+
pingInterval;
|
|
121
|
+
pingsInFlight = new Set();
|
|
122
|
+
STALE_CHECK_INTERVAL = parseInt(process.env.MCP_CLIENT_CONNECTION_CHECK || '90000', 10);
|
|
123
|
+
STALE_TIMEOUT = parseInt(process.env.MCP_CLIENT_CONNECTION_TIMEOUT || '600000', 10);
|
|
124
|
+
HEARTBEAT_INTERVAL = parseInt(process.env.MCP_CLIENT_HEARTBEAT_INTERVAL || '30000', 10);
|
|
125
|
+
PING_ENABLED = process.env.MCP_PING_ENABLED !== 'false';
|
|
126
|
+
PING_INTERVAL = parseInt(process.env.MCP_PING_INTERVAL || '30000', 10);
|
|
127
|
+
PING_FAILURE_THRESHOLD = parseInt(process.env.MCP_PING_FAILURE_THRESHOLD || '1', 10);
|
|
128
|
+
updateSessionActivity(sessionId) {
|
|
129
|
+
const session = this.sessions.get(sessionId);
|
|
130
|
+
if (session) {
|
|
131
|
+
session.metadata.lastActivity = new Date();
|
|
132
|
+
this.metrics.updateClientActivity(session.metadata.clientInfo);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
isSessionDistressed(session) {
|
|
136
|
+
return (session.metadata.pingFailures || 0) >= this.PING_FAILURE_THRESHOLD;
|
|
137
|
+
}
|
|
138
|
+
createClientInfoCapture(sessionId) {
|
|
139
|
+
return () => {
|
|
140
|
+
const session = this.sessions.get(sessionId);
|
|
141
|
+
if (session) {
|
|
142
|
+
const clientInfo = session.server.server.getClientVersion();
|
|
143
|
+
const clientCapabilities = session.server.server.getClientCapabilities();
|
|
144
|
+
if (clientInfo) {
|
|
145
|
+
if (session.metadata.clientInfo) {
|
|
146
|
+
this.metrics.disconnectClient(session.metadata.clientInfo);
|
|
147
|
+
}
|
|
148
|
+
session.metadata.clientInfo = clientInfo;
|
|
149
|
+
this.metrics.associateSessionWithClient(clientInfo);
|
|
150
|
+
}
|
|
151
|
+
if (clientCapabilities) {
|
|
152
|
+
session.metadata.capabilities = {
|
|
153
|
+
sampling: !!clientCapabilities.sampling,
|
|
154
|
+
roots: !!clientCapabilities.roots,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
logger.debug({
|
|
158
|
+
sessionId,
|
|
159
|
+
clientInfo: session.metadata.clientInfo,
|
|
160
|
+
capabilities: session.metadata.capabilities,
|
|
161
|
+
}, 'Client Initialization Request');
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
pingSingleSession(sessionId) {
|
|
166
|
+
const session = this.sessions.get(sessionId);
|
|
167
|
+
if (!session)
|
|
168
|
+
return;
|
|
169
|
+
if (this.pingsInFlight.has(sessionId)) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
this.pingsInFlight.add(sessionId);
|
|
173
|
+
session.metadata.lastPingAttempt = new Date();
|
|
174
|
+
this.metrics.trackPingSent();
|
|
175
|
+
session.server.server
|
|
176
|
+
.ping()
|
|
177
|
+
.then(() => {
|
|
178
|
+
this.updateSessionActivity(sessionId);
|
|
179
|
+
session.metadata.pingFailures = 0;
|
|
180
|
+
this.metrics.trackPingSuccess();
|
|
181
|
+
logger.trace({ sessionId }, 'Ping succeeded');
|
|
182
|
+
})
|
|
183
|
+
.catch((error) => {
|
|
184
|
+
session.metadata.pingFailures = (session.metadata.pingFailures || 0) + 1;
|
|
185
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
186
|
+
this.metrics.trackPingFailed();
|
|
187
|
+
logger.trace({ sessionId, error: errorMessage, failures: session.metadata.pingFailures }, 'Ping failed');
|
|
188
|
+
})
|
|
189
|
+
.finally(() => {
|
|
190
|
+
this.pingsInFlight.delete(sessionId);
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
startPingKeepAlive() {
|
|
194
|
+
if (!this.PING_ENABLED) {
|
|
195
|
+
logger.debug('Ping keep-alive disabled');
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
this.pingInterval = setInterval(() => {
|
|
199
|
+
if (this.isShuttingDown)
|
|
200
|
+
return;
|
|
201
|
+
for (const sessionId of this.sessions.keys()) {
|
|
202
|
+
this.pingSingleSession(sessionId);
|
|
203
|
+
}
|
|
204
|
+
}, this.PING_INTERVAL);
|
|
205
|
+
logger.debug({ pingInterval: this.PING_INTERVAL }, 'Started ping keep-alive');
|
|
206
|
+
}
|
|
207
|
+
stopPingKeepAlive() {
|
|
208
|
+
if (this.pingInterval) {
|
|
209
|
+
clearInterval(this.pingInterval);
|
|
210
|
+
this.pingInterval = undefined;
|
|
211
|
+
this.pingsInFlight.clear();
|
|
212
|
+
logger.debug('Stopped ping keep-alive');
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
startStaleConnectionCheck() {
|
|
216
|
+
this.staleCheckInterval = setInterval(() => {
|
|
217
|
+
if (this.isShuttingDown)
|
|
218
|
+
return;
|
|
219
|
+
const now = Date.now();
|
|
220
|
+
const staleSessionIds = [];
|
|
221
|
+
for (const [sessionId, session] of this.sessions) {
|
|
222
|
+
const timeSinceActivity = now - session.metadata.lastActivity.getTime();
|
|
223
|
+
if (timeSinceActivity > this.STALE_TIMEOUT) {
|
|
224
|
+
staleSessionIds.push(sessionId);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
for (const sessionId of staleSessionIds) {
|
|
228
|
+
const session = this.sessions.get(sessionId);
|
|
229
|
+
if (session) {
|
|
230
|
+
logger.info({ sessionId, timeSinceActivity: now - session.metadata.lastActivity.getTime() }, 'Removing stale session');
|
|
231
|
+
void this.removeStaleSession(sessionId);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}, this.STALE_CHECK_INTERVAL);
|
|
235
|
+
}
|
|
236
|
+
shutdown() {
|
|
237
|
+
this.isShuttingDown = true;
|
|
238
|
+
}
|
|
239
|
+
getActiveConnectionCount() {
|
|
240
|
+
this.metrics.updateActiveConnections(this.sessions.size);
|
|
241
|
+
return this.sessions.size;
|
|
242
|
+
}
|
|
243
|
+
isAcceptingConnections() {
|
|
244
|
+
return !this.isShuttingDown;
|
|
245
|
+
}
|
|
246
|
+
stopStaleConnectionCheck() {
|
|
247
|
+
if (this.staleCheckInterval) {
|
|
248
|
+
clearInterval(this.staleCheckInterval);
|
|
249
|
+
this.staleCheckInterval = undefined;
|
|
250
|
+
}
|
|
251
|
+
this.stopPingKeepAlive();
|
|
252
|
+
}
|
|
253
|
+
trackSessionCreated(sessionId) {
|
|
254
|
+
this.trackNewConnection();
|
|
255
|
+
this.metrics.updateActiveConnections(this.sessions.size);
|
|
256
|
+
const session = this.sessions.get(sessionId);
|
|
257
|
+
if (session) {
|
|
258
|
+
session.metadata.clientInfo = { name: 'unknown', version: 'unknown' };
|
|
259
|
+
this.metrics.associateSessionWithClient(session.metadata.clientInfo);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
trackSessionCleaned(session) {
|
|
263
|
+
this.metrics.trackSessionCleaned();
|
|
264
|
+
this.metrics.updateActiveConnections(this.sessions.size);
|
|
265
|
+
if (session?.metadata.clientInfo) {
|
|
266
|
+
this.metrics.disconnectClient(session.metadata.clientInfo);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
getSessions() {
|
|
270
|
+
return Array.from(this.sessions.values()).map((session) => session.metadata);
|
|
271
|
+
}
|
|
272
|
+
getConfiguration() {
|
|
273
|
+
return {
|
|
274
|
+
heartbeatInterval: this.HEARTBEAT_INTERVAL,
|
|
275
|
+
staleCheckInterval: this.STALE_CHECK_INTERVAL,
|
|
276
|
+
staleTimeout: this.STALE_TIMEOUT,
|
|
277
|
+
pingEnabled: this.PING_ENABLED,
|
|
278
|
+
pingInterval: this.PING_INTERVAL,
|
|
279
|
+
pingFailureThreshold: this.PING_FAILURE_THRESHOLD,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
startHeartbeat(sessionId, response) {
|
|
283
|
+
const session = this.sessions.get(sessionId);
|
|
284
|
+
if (!session)
|
|
285
|
+
return;
|
|
286
|
+
this.stopHeartbeat(sessionId);
|
|
287
|
+
session.heartbeatInterval = setInterval(() => {
|
|
288
|
+
if (response.destroyed || response.writableEnded) {
|
|
289
|
+
logger.debug({ sessionId }, 'Detected stale connection via heartbeat');
|
|
290
|
+
void this.removeStaleSession(sessionId);
|
|
291
|
+
}
|
|
292
|
+
}, this.HEARTBEAT_INTERVAL);
|
|
293
|
+
}
|
|
294
|
+
stopHeartbeat(sessionId) {
|
|
295
|
+
const session = this.sessions.get(sessionId);
|
|
296
|
+
if (session?.heartbeatInterval) {
|
|
297
|
+
clearInterval(session.heartbeatInterval);
|
|
298
|
+
session.heartbeatInterval = undefined;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
setupSseEventHandlers(sessionId, response) {
|
|
302
|
+
response.on('close', () => {
|
|
303
|
+
logger.info({ sessionId }, 'SSE connection closed by client');
|
|
304
|
+
void this.removeStaleSession(sessionId);
|
|
305
|
+
});
|
|
306
|
+
response.on('error', (...args) => {
|
|
307
|
+
const error = args[0];
|
|
308
|
+
logger.error({ error, sessionId }, 'SSE connection error');
|
|
309
|
+
this.trackError(500, error);
|
|
310
|
+
void this.removeStaleSession(sessionId);
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
async cleanupSession(sessionId) {
|
|
314
|
+
try {
|
|
315
|
+
const session = this.sessions.get(sessionId);
|
|
316
|
+
if (!session)
|
|
317
|
+
return;
|
|
318
|
+
logger.debug({ sessionId }, 'Cleaning up session');
|
|
319
|
+
this.stopHeartbeat(sessionId);
|
|
320
|
+
try {
|
|
321
|
+
await session.transport.close();
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
logger.error({ error, sessionId }, 'Error closing transport');
|
|
325
|
+
}
|
|
326
|
+
try {
|
|
327
|
+
await session.server.close();
|
|
328
|
+
}
|
|
329
|
+
catch (error) {
|
|
330
|
+
logger.error({ error, sessionId }, 'Error closing server');
|
|
331
|
+
}
|
|
332
|
+
this.sessions.delete(sessionId);
|
|
333
|
+
this.trackSessionCleaned(session);
|
|
334
|
+
logger.debug({ sessionId }, 'Session cleaned up');
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
logger.error({ error, sessionId }, 'Error during session cleanup');
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
async cleanupAllSessions() {
|
|
341
|
+
const sessionIds = Array.from(this.sessions.keys());
|
|
342
|
+
const cleanupPromises = sessionIds.map((sessionId) => this.cleanupSession(sessionId).catch((error) => {
|
|
343
|
+
logger.error({ error, sessionId }, 'Error during session cleanup');
|
|
344
|
+
}));
|
|
345
|
+
await Promise.allSettled(cleanupPromises);
|
|
346
|
+
this.sessions.clear();
|
|
347
|
+
}
|
|
348
|
+
setupServerForSession(server, sessionId) {
|
|
349
|
+
server.server.oninitialized = this.createClientInfoCapture(sessionId);
|
|
350
|
+
server.server.onerror = (error) => {
|
|
351
|
+
this.trackError(undefined, error);
|
|
352
|
+
logger.error({ error, sessionId }, 'Server error');
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
validateSessionRequest(sessionId, requestBody, allowMissingSession = false) {
|
|
356
|
+
const trackingName = this.extractMethodForTracking(requestBody);
|
|
357
|
+
if (this.isShuttingDown) {
|
|
358
|
+
this.trackError(503);
|
|
359
|
+
this.metrics.trackMethod(trackingName, undefined, true);
|
|
360
|
+
return {
|
|
361
|
+
isValid: false,
|
|
362
|
+
errorResponse: JsonRpcErrors.serverShuttingDown(extractJsonRpcId(requestBody)),
|
|
363
|
+
statusCode: 503,
|
|
364
|
+
trackingName,
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
if (!sessionId && !allowMissingSession) {
|
|
368
|
+
this.trackError(400);
|
|
369
|
+
this.metrics.trackMethod(trackingName, undefined, true);
|
|
370
|
+
return {
|
|
371
|
+
isValid: false,
|
|
372
|
+
errorResponse: JsonRpcErrors.invalidParams('sessionId is required', extractJsonRpcId(requestBody)),
|
|
373
|
+
statusCode: 400,
|
|
374
|
+
trackingName,
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
if (sessionId && !this.sessions.has(sessionId)) {
|
|
378
|
+
this.trackError(404);
|
|
379
|
+
this.metrics.trackMethod(trackingName, undefined, true);
|
|
380
|
+
return {
|
|
381
|
+
isValid: false,
|
|
382
|
+
errorResponse: JsonRpcErrors.sessionNotFound(sessionId, extractJsonRpcId(requestBody)),
|
|
383
|
+
statusCode: 404,
|
|
384
|
+
trackingName,
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
return { isValid: true, trackingName };
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
//# sourceMappingURL=base-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-transport.js","sourceRoot":"","sources":["../../../src/server/transport/base-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export declare const JSON_RPC_ERROR_CODES: {
|
|
2
|
+
readonly PARSE_ERROR: -32700;
|
|
3
|
+
readonly INVALID_REQUEST: -32600;
|
|
4
|
+
readonly METHOD_NOT_FOUND: -32601;
|
|
5
|
+
readonly INVALID_PARAMS: -32602;
|
|
6
|
+
readonly INTERNAL_ERROR: -32603;
|
|
7
|
+
readonly SERVER_ERROR: -32000;
|
|
8
|
+
readonly SESSION_NOT_FOUND: -32001;
|
|
9
|
+
readonly SERVER_SHUTTING_DOWN: -32002;
|
|
10
|
+
readonly SESSION_ALREADY_EXISTS: -32003;
|
|
11
|
+
readonly STALE_CONNECTION: -32004;
|
|
12
|
+
readonly AUTHENTICATION_FAILED: -32005;
|
|
13
|
+
};
|
|
14
|
+
export type JsonRpcErrorCode = (typeof JSON_RPC_ERROR_CODES)[keyof typeof JSON_RPC_ERROR_CODES];
|
|
15
|
+
export interface JsonRpcError {
|
|
16
|
+
jsonrpc: '2.0';
|
|
17
|
+
error: {
|
|
18
|
+
code: JsonRpcErrorCode;
|
|
19
|
+
message: string;
|
|
20
|
+
data?: unknown;
|
|
21
|
+
};
|
|
22
|
+
id: string | number | null;
|
|
23
|
+
}
|
|
24
|
+
export declare function createJsonRpcError(code: JsonRpcErrorCode, message: string, id?: string | number | null, data?: unknown): JsonRpcError;
|
|
25
|
+
export declare function extractJsonRpcId(body: unknown): string | number | null;
|
|
26
|
+
export declare const JsonRpcErrors: {
|
|
27
|
+
readonly internalError: (id?: string | number | null, details?: string) => JsonRpcError;
|
|
28
|
+
readonly invalidParams: (message: string, id?: string | number | null) => JsonRpcError;
|
|
29
|
+
readonly sessionNotFound: (sessionId: string, id?: string | number | null) => JsonRpcError;
|
|
30
|
+
readonly serverShuttingDown: (id?: string | number | null) => JsonRpcError;
|
|
31
|
+
readonly sessionAlreadyExists: (sessionId: string, id?: string | number | null) => JsonRpcError;
|
|
32
|
+
readonly methodNotAllowed: (id?: string | number | null, message?: string) => JsonRpcError;
|
|
33
|
+
readonly invalidRequest: (id?: string | number | null, message?: string) => JsonRpcError;
|
|
34
|
+
readonly authenticationFailed: (id?: string | number | null, message?: string) => JsonRpcError;
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=json-rpc-errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-rpc-errors.d.ts","sourceRoot":"","sources":["../../../src/server/transport/json-rpc-errors.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,oBAAoB;;;;;;;;;;;;CAevB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,OAAO,oBAAoB,CAAC,CAAC;AAEhG,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE;QACN,IAAI,EAAE,gBAAgB,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,OAAO,CAAC;KACf,CAAC;IACF,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAC3B;AAKD,wBAAgB,kBAAkB,CACjC,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,MAAM,EACf,EAAE,GAAE,MAAM,GAAG,MAAM,GAAG,IAAW,EACjC,IAAI,CAAC,EAAE,OAAO,GACZ,YAAY,CAed;AAKD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CActE;AAKD,eAAO,MAAM,aAAa;kCACL,MAAM,GAAG,MAAM,GAAG,IAAI,YAAmB,MAAM;sCAG1C,MAAM,OAAM,MAAM,GAAG,MAAM,GAAG,IAAI;0CAG9B,MAAM,OAAM,MAAM,GAAG,MAAM,GAAG,IAAI;uCAGtC,MAAM,GAAG,MAAM,GAAG,IAAI;+CAGb,MAAM,OAAM,MAAM,GAAG,MAAM,GAAG,IAAI;qCAG7C,MAAM,GAAG,MAAM,GAAG,IAAI,YAAkB,MAAM;mCAGhD,MAAM,GAAG,MAAM,GAAG,IAAI,YAAkB,MAAM;yCAGxC,MAAM,GAAG,MAAM,GAAG,IAAI,YAAkB,MAAM;CAEhE,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export const JSON_RPC_ERROR_CODES = {
|
|
2
|
+
PARSE_ERROR: -32700,
|
|
3
|
+
INVALID_REQUEST: -32600,
|
|
4
|
+
METHOD_NOT_FOUND: -32601,
|
|
5
|
+
INVALID_PARAMS: -32602,
|
|
6
|
+
INTERNAL_ERROR: -32603,
|
|
7
|
+
SERVER_ERROR: -32000,
|
|
8
|
+
SESSION_NOT_FOUND: -32001,
|
|
9
|
+
SERVER_SHUTTING_DOWN: -32002,
|
|
10
|
+
SESSION_ALREADY_EXISTS: -32003,
|
|
11
|
+
STALE_CONNECTION: -32004,
|
|
12
|
+
AUTHENTICATION_FAILED: -32005,
|
|
13
|
+
};
|
|
14
|
+
export function createJsonRpcError(code, message, id = null, data) {
|
|
15
|
+
const error = {
|
|
16
|
+
jsonrpc: '2.0',
|
|
17
|
+
error: {
|
|
18
|
+
code,
|
|
19
|
+
message,
|
|
20
|
+
},
|
|
21
|
+
id,
|
|
22
|
+
};
|
|
23
|
+
if (data !== undefined) {
|
|
24
|
+
error.error.data = data;
|
|
25
|
+
}
|
|
26
|
+
return error;
|
|
27
|
+
}
|
|
28
|
+
export function extractJsonRpcId(body) {
|
|
29
|
+
if (body && typeof body === 'object' && 'id' in body) {
|
|
30
|
+
const id = body.id;
|
|
31
|
+
if (typeof id === 'string') {
|
|
32
|
+
return id;
|
|
33
|
+
}
|
|
34
|
+
if (typeof id === 'number') {
|
|
35
|
+
return id;
|
|
36
|
+
}
|
|
37
|
+
if (id === null) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
export const JsonRpcErrors = {
|
|
44
|
+
internalError: (id = null, details) => createJsonRpcError(JSON_RPC_ERROR_CODES.INTERNAL_ERROR, details || 'Internal server error', id),
|
|
45
|
+
invalidParams: (message, id = null) => createJsonRpcError(JSON_RPC_ERROR_CODES.INVALID_PARAMS, `Invalid params: ${message}`, id),
|
|
46
|
+
sessionNotFound: (sessionId, id = null) => createJsonRpcError(JSON_RPC_ERROR_CODES.SESSION_NOT_FOUND, 'Session not found', id, { sessionId }),
|
|
47
|
+
serverShuttingDown: (id = null) => createJsonRpcError(JSON_RPC_ERROR_CODES.SERVER_SHUTTING_DOWN, 'Server is shutting down', id),
|
|
48
|
+
sessionAlreadyExists: (sessionId, id = null) => createJsonRpcError(JSON_RPC_ERROR_CODES.SESSION_ALREADY_EXISTS, 'Session already exists', id, { sessionId }),
|
|
49
|
+
methodNotAllowed: (id = null, message = 'Method not allowed') => createJsonRpcError(JSON_RPC_ERROR_CODES.SERVER_ERROR, message, id),
|
|
50
|
+
invalidRequest: (id = null, message = 'Invalid request') => createJsonRpcError(JSON_RPC_ERROR_CODES.INVALID_REQUEST, message, id),
|
|
51
|
+
authenticationFailed: (id = null, message = 'Authentication failed') => createJsonRpcError(JSON_RPC_ERROR_CODES.AUTHENTICATION_FAILED, message, id),
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=json-rpc-errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-rpc-errors.js","sourceRoot":"","sources":["../../../src/server/transport/json-rpc-errors.ts"],"names":[],"mappings":"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"}
|