@1mcp/agent 0.11.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -50
- package/build/auth/clientSessionManager.d.ts +94 -0
- package/build/auth/clientSessionManager.d.ts.map +1 -0
- package/build/auth/clientSessionManager.js +220 -0
- package/build/auth/clientSessionManager.js.map +1 -0
- package/build/auth/sdkOAuthClientProvider.d.ts +93 -0
- package/build/auth/sdkOAuthClientProvider.d.ts.map +1 -0
- package/build/auth/sdkOAuthClientProvider.js +199 -0
- package/build/auth/sdkOAuthClientProvider.js.map +1 -0
- package/build/auth/sdkOAuthServerProvider.d.ts +63 -0
- package/build/auth/sdkOAuthServerProvider.d.ts.map +1 -0
- package/build/auth/sdkOAuthServerProvider.js +428 -0
- package/build/auth/sdkOAuthServerProvider.js.map +1 -0
- package/build/{server/auth/sessionManager.d.ts → auth/serverSessionManager.d.ts} +26 -37
- package/build/auth/serverSessionManager.d.ts.map +1 -0
- package/build/{server/auth/sessionManager.js → auth/serverSessionManager.js} +104 -19
- package/build/auth/serverSessionManager.js.map +1 -0
- package/build/auth/sessionTypes.d.ts +24 -0
- package/build/auth/sessionTypes.d.ts.map +1 -0
- package/build/auth/sessionTypes.js +3 -0
- package/build/auth/sessionTypes.js.map +1 -0
- package/build/capabilities/capabilityManager.d.ts +2 -2
- package/build/capabilities/capabilityManager.d.ts.map +1 -1
- package/build/capabilities/capabilityManager.js +40 -7
- package/build/capabilities/capabilityManager.js.map +1 -1
- package/build/config/{configManager.d.ts → mcpConfigManager.d.ts} +18 -7
- package/build/config/mcpConfigManager.d.ts.map +1 -0
- package/build/config/{configManager.js → mcpConfigManager.js} +50 -10
- package/build/config/mcpConfigManager.js.map +1 -0
- package/build/constants.d.ts +36 -14
- package/build/constants.d.ts.map +1 -1
- package/build/constants.js +40 -17
- package/build/constants.js.map +1 -1
- package/build/{client.d.ts → core/client/clientFactory.d.ts} +1 -1
- package/build/core/client/clientFactory.d.ts.map +1 -0
- package/build/{client.js → core/client/clientFactory.js} +2 -2
- package/build/core/client/clientFactory.js.map +1 -0
- package/build/{clients → core/client}/clientManager.d.ts +14 -6
- package/build/core/client/clientManager.d.ts.map +1 -0
- package/build/core/client/clientManager.js +209 -0
- package/build/core/client/clientManager.js.map +1 -0
- package/build/{server/config/serverConfig.d.ts → core/server/agentConfig.d.ts} +50 -15
- package/build/core/server/agentConfig.d.ts.map +1 -0
- package/build/core/server/agentConfig.js +166 -0
- package/build/core/server/agentConfig.js.map +1 -0
- package/build/core/server/serverManager.d.ts +39 -0
- package/build/core/server/serverManager.d.ts.map +1 -0
- package/build/core/server/serverManager.js +169 -0
- package/build/core/server/serverManager.js.map +1 -0
- package/build/core/types/client.d.ts +51 -0
- package/build/core/types/client.d.ts.map +1 -0
- package/build/core/types/client.js +15 -0
- package/build/core/types/client.js.map +1 -0
- package/build/core/types/index.d.ts +4 -0
- package/build/core/types/index.d.ts.map +1 -0
- package/build/core/types/index.js +5 -0
- package/build/core/types/index.js.map +1 -0
- package/build/core/types/server.d.ts +14 -0
- package/build/core/types/server.d.ts.map +1 -0
- package/build/core/types/server.js +2 -0
- package/build/core/types/server.js.map +1 -0
- package/build/{types.d.ts → core/types/transport.d.ts} +59 -49
- package/build/core/types/transport.d.ts.map +1 -0
- package/build/{types.js → core/types/transport.js} +11 -13
- package/build/core/types/transport.js.map +1 -0
- package/build/handlers/notificationHandlers.d.ts +3 -3
- package/build/handlers/notificationHandlers.d.ts.map +1 -1
- package/build/handlers/notificationHandlers.js +13 -9
- package/build/handlers/notificationHandlers.js.map +1 -1
- package/build/handlers/requestHandlers.d.ts +2 -2
- package/build/handlers/requestHandlers.d.ts.map +1 -1
- package/build/handlers/requestHandlers.js +25 -3
- package/build/handlers/requestHandlers.js.map +1 -1
- package/build/index.js +48 -8
- package/build/index.js.map +1 -1
- package/build/logger/logger.js +1 -1
- package/build/logger/logger.js.map +1 -1
- package/build/{middleware/loggingMiddleware.d.ts → logger/mcpLoggingEnhancer.d.ts} +1 -1
- package/build/logger/mcpLoggingEnhancer.d.ts.map +1 -0
- package/build/{middleware/loggingMiddleware.js → logger/mcpLoggingEnhancer.js} +2 -2
- package/build/logger/mcpLoggingEnhancer.js.map +1 -0
- package/build/server.d.ts +1 -1
- package/build/server.d.ts.map +1 -1
- package/build/server.js +9 -6
- package/build/server.js.map +1 -1
- package/build/services/configReloadService.d.ts +15 -5
- package/build/services/configReloadService.d.ts.map +1 -1
- package/build/services/configReloadService.js +31 -14
- package/build/services/configReloadService.js.map +1 -1
- package/build/transport/http/middlewares/errorHandler.d.ts.map +1 -0
- package/build/{server → transport/http/middlewares}/errorHandler.js +1 -1
- package/build/transport/http/middlewares/errorHandler.js.map +1 -0
- package/build/transport/http/middlewares/scopeAuthMiddleware.d.ts +42 -0
- package/build/transport/http/middlewares/scopeAuthMiddleware.d.ts.map +1 -0
- package/build/transport/http/middlewares/scopeAuthMiddleware.js +136 -0
- package/build/transport/http/middlewares/scopeAuthMiddleware.js.map +1 -0
- package/build/transport/http/middlewares/securityMiddleware.d.ts +30 -0
- package/build/transport/http/middlewares/securityMiddleware.d.ts.map +1 -0
- package/build/transport/http/middlewares/securityMiddleware.js +201 -0
- package/build/transport/http/middlewares/securityMiddleware.js.map +1 -0
- package/build/transport/http/middlewares/tagsExtractor.d.ts.map +1 -0
- package/build/transport/http/middlewares/tagsExtractor.js.map +1 -0
- package/build/transport/http/routes/oauthRoutes.d.ts +4 -0
- package/build/transport/http/routes/oauthRoutes.d.ts.map +1 -0
- package/build/transport/http/routes/oauthRoutes.js +474 -0
- package/build/transport/http/routes/oauthRoutes.js.map +1 -0
- package/build/transport/http/routes/sseRoutes.d.ts +4 -0
- package/build/transport/http/routes/sseRoutes.d.ts.map +1 -0
- package/build/{server → transport/http}/routes/sseRoutes.js +12 -10
- package/build/transport/http/routes/sseRoutes.js.map +1 -0
- package/build/transport/http/routes/streamableHttpRoutes.d.ts +4 -0
- package/build/transport/http/routes/streamableHttpRoutes.d.ts.map +1 -0
- package/build/{server → transport/http}/routes/streamableHttpRoutes.js +46 -13
- package/build/transport/http/routes/streamableHttpRoutes.js.map +1 -0
- package/build/{server/expressServer.d.ts → transport/http/server.d.ts} +5 -4
- package/build/transport/http/server.d.ts.map +1 -0
- package/build/{server/expressServer.js → transport/http/server.js} +60 -23
- package/build/transport/http/server.js.map +1 -0
- package/build/transport/transportFactory.d.ts +9 -0
- package/build/transport/transportFactory.d.ts.map +1 -0
- package/build/transport/transportFactory.js +148 -0
- package/build/transport/transportFactory.js.map +1 -0
- package/build/utils/clientFiltering.d.ts +4 -4
- package/build/utils/clientFiltering.d.ts.map +1 -1
- package/build/utils/clientFiltering.js +14 -14
- package/build/utils/clientFiltering.js.map +1 -1
- package/build/utils/errorHandling.d.ts +0 -11
- package/build/utils/errorHandling.d.ts.map +1 -1
- package/build/utils/errorHandling.js +1 -18
- package/build/utils/errorHandling.js.map +1 -1
- package/build/utils/errorTypes.js +4 -4
- package/build/utils/errorTypes.js.map +1 -1
- package/build/utils/pagination.d.ts +2 -2
- package/build/utils/pagination.d.ts.map +1 -1
- package/build/utils/pagination.js +87 -8
- package/build/utils/pagination.js.map +1 -1
- package/build/utils/parsing.d.ts +13 -0
- package/build/utils/parsing.d.ts.map +1 -0
- package/build/utils/parsing.js +32 -0
- package/build/utils/parsing.js.map +1 -0
- package/build/utils/sanitization.d.ts +60 -0
- package/build/utils/sanitization.d.ts.map +1 -0
- package/build/utils/sanitization.js +149 -0
- package/build/utils/sanitization.js.map +1 -0
- package/build/utils/scopeValidation.d.ts +102 -0
- package/build/utils/scopeValidation.d.ts.map +1 -0
- package/build/utils/scopeValidation.js +244 -0
- package/build/utils/scopeValidation.js.map +1 -0
- package/package.json +23 -9
- package/build/client.d.ts.map +0 -1
- package/build/client.js.map +0 -1
- package/build/clients/clientManager.d.ts.map +0 -1
- package/build/clients/clientManager.js +0 -147
- package/build/clients/clientManager.js.map +0 -1
- package/build/config/configManager.d.ts.map +0 -1
- package/build/config/configManager.js.map +0 -1
- package/build/config/transportConfig.d.ts +0 -7
- package/build/config/transportConfig.d.ts.map +0 -1
- package/build/config/transportConfig.js +0 -90
- package/build/config/transportConfig.js.map +0 -1
- package/build/middleware/loggingMiddleware.d.ts.map +0 -1
- package/build/middleware/loggingMiddleware.js.map +0 -1
- package/build/server/auth/authManager.d.ts +0 -109
- package/build/server/auth/authManager.d.ts.map +0 -1
- package/build/server/auth/authManager.js +0 -173
- package/build/server/auth/authManager.js.map +0 -1
- package/build/server/auth/authMiddleware.d.ts +0 -16
- package/build/server/auth/authMiddleware.d.ts.map +0 -1
- package/build/server/auth/authMiddleware.js +0 -45
- package/build/server/auth/authMiddleware.js.map +0 -1
- package/build/server/auth/sessionManager.d.ts.map +0 -1
- package/build/server/auth/sessionManager.js.map +0 -1
- package/build/server/config/serverConfig.d.ts.map +0 -1
- package/build/server/config/serverConfig.js +0 -117
- package/build/server/config/serverConfig.js.map +0 -1
- package/build/server/errorHandler.d.ts.map +0 -1
- package/build/server/errorHandler.js.map +0 -1
- package/build/server/expressServer.d.ts.map +0 -1
- package/build/server/expressServer.js.map +0 -1
- package/build/server/routes/oauthRoutes.d.ts +0 -14
- package/build/server/routes/oauthRoutes.d.ts.map +0 -1
- package/build/server/routes/oauthRoutes.js +0 -132
- package/build/server/routes/oauthRoutes.js.map +0 -1
- package/build/server/routes/sseRoutes.d.ts +0 -4
- package/build/server/routes/sseRoutes.d.ts.map +0 -1
- package/build/server/routes/sseRoutes.js.map +0 -1
- package/build/server/routes/streamableHttpRoutes.d.ts +0 -4
- package/build/server/routes/streamableHttpRoutes.d.ts.map +0 -1
- package/build/server/routes/streamableHttpRoutes.js.map +0 -1
- package/build/server/tagsExtractor.d.ts.map +0 -1
- package/build/server/tagsExtractor.js.map +0 -1
- package/build/serverManager.d.ts +0 -27
- package/build/serverManager.d.ts.map +0 -1
- package/build/serverManager.js +0 -87
- package/build/serverManager.js.map +0 -1
- package/build/types.d.ts.map +0 -1
- package/build/types.js.map +0 -1
- /package/build/{server → transport/http/middlewares}/errorHandler.d.ts +0 -0
- /package/build/{server → transport/http/middlewares}/tagsExtractor.d.ts +0 -0
- /package/build/{server → transport/http/middlewares}/tagsExtractor.js +0 -0
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
2
|
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
3
3
|
import { ErrorCode } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
-
import logger from '
|
|
5
|
-
import { STREAMABLE_HTTP_ENDPOINT } from '
|
|
6
|
-
import tagsExtractor from '../tagsExtractor.js';
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
import logger from '../../../logger/logger.js';
|
|
5
|
+
import { STREAMABLE_HTTP_ENDPOINT } from '../../../constants.js';
|
|
6
|
+
import tagsExtractor from '../middlewares/tagsExtractor.js';
|
|
7
|
+
import scopeAuthMiddleware, { getValidatedTags } from '../middlewares/scopeAuthMiddleware.js';
|
|
8
|
+
import { sanitizeHeaders } from '../../../utils/sanitization.js';
|
|
9
|
+
export function setupStreamableHttpRoutes(router, serverManager) {
|
|
10
|
+
router.post(STREAMABLE_HTTP_ENDPOINT, tagsExtractor, scopeAuthMiddleware, async (req, res) => {
|
|
9
11
|
try {
|
|
10
|
-
logger.info('[POST] streamable-http', {
|
|
12
|
+
logger.info('[POST] streamable-http', {
|
|
13
|
+
query: req.query,
|
|
14
|
+
body: req.body,
|
|
15
|
+
headers: sanitizeHeaders(req.headers),
|
|
16
|
+
});
|
|
11
17
|
let transport;
|
|
12
18
|
const sessionId = req.headers['mcp-session-id'];
|
|
13
19
|
if (!sessionId) {
|
|
@@ -15,19 +21,28 @@ export function setupStreamableHttpRoutes(app, serverManager, authMiddleware) {
|
|
|
15
21
|
transport = new StreamableHTTPServerTransport({
|
|
16
22
|
sessionIdGenerator: () => id,
|
|
17
23
|
});
|
|
18
|
-
// Use tags from middleware
|
|
19
|
-
const tags = res
|
|
24
|
+
// Use validated tags from scope auth middleware
|
|
25
|
+
const tags = getValidatedTags(res);
|
|
20
26
|
await serverManager.connectTransport(transport, id, {
|
|
21
27
|
tags,
|
|
22
28
|
enablePagination: req.query.pagination === 'true',
|
|
23
29
|
});
|
|
24
30
|
transport.onclose = () => {
|
|
25
31
|
serverManager.disconnectTransport(id);
|
|
26
|
-
|
|
32
|
+
// Note: ServerManager already logs the disconnection
|
|
27
33
|
};
|
|
28
34
|
}
|
|
29
35
|
else {
|
|
30
36
|
const existingTransport = serverManager.getTransport(sessionId);
|
|
37
|
+
if (!existingTransport) {
|
|
38
|
+
res.status(404).json({
|
|
39
|
+
error: {
|
|
40
|
+
code: ErrorCode.InvalidParams,
|
|
41
|
+
message: 'No active streamable HTTP session found for the provided sessionId',
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
31
46
|
if (existingTransport instanceof StreamableHTTPServerTransport) {
|
|
32
47
|
transport = existingTransport;
|
|
33
48
|
}
|
|
@@ -48,9 +63,9 @@ export function setupStreamableHttpRoutes(app, serverManager, authMiddleware) {
|
|
|
48
63
|
res.status(500).end();
|
|
49
64
|
}
|
|
50
65
|
});
|
|
51
|
-
|
|
66
|
+
router.get(STREAMABLE_HTTP_ENDPOINT, async (req, res) => {
|
|
52
67
|
try {
|
|
53
|
-
logger.info('[GET] streamable-http', { query: req.query, headers: req.headers });
|
|
68
|
+
logger.info('[GET] streamable-http', { query: req.query, headers: sanitizeHeaders(req.headers) });
|
|
54
69
|
const sessionId = req.headers['mcp-session-id'];
|
|
55
70
|
if (!sessionId) {
|
|
56
71
|
res.status(400).json({
|
|
@@ -62,6 +77,15 @@ export function setupStreamableHttpRoutes(app, serverManager, authMiddleware) {
|
|
|
62
77
|
return;
|
|
63
78
|
}
|
|
64
79
|
const transport = serverManager.getTransport(sessionId);
|
|
80
|
+
if (!transport) {
|
|
81
|
+
res.status(404).json({
|
|
82
|
+
error: {
|
|
83
|
+
code: ErrorCode.InvalidParams,
|
|
84
|
+
message: 'No active streamable HTTP session found for the provided sessionId',
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
65
89
|
await transport.handleRequest(req, res, req.body);
|
|
66
90
|
}
|
|
67
91
|
catch (error) {
|
|
@@ -69,9 +93,9 @@ export function setupStreamableHttpRoutes(app, serverManager, authMiddleware) {
|
|
|
69
93
|
res.status(500).end();
|
|
70
94
|
}
|
|
71
95
|
});
|
|
72
|
-
|
|
96
|
+
router.delete(STREAMABLE_HTTP_ENDPOINT, async (req, res) => {
|
|
73
97
|
try {
|
|
74
|
-
logger.info('[DELETE] streamable-http', { query: req.query, headers: req.headers });
|
|
98
|
+
logger.info('[DELETE] streamable-http', { query: req.query, headers: sanitizeHeaders(req.headers) });
|
|
75
99
|
const sessionId = req.headers['mcp-session-id'];
|
|
76
100
|
if (!sessionId) {
|
|
77
101
|
res.status(400).json({
|
|
@@ -83,6 +107,15 @@ export function setupStreamableHttpRoutes(app, serverManager, authMiddleware) {
|
|
|
83
107
|
return;
|
|
84
108
|
}
|
|
85
109
|
const transport = serverManager.getTransport(sessionId);
|
|
110
|
+
if (!transport) {
|
|
111
|
+
res.status(404).json({
|
|
112
|
+
error: {
|
|
113
|
+
code: ErrorCode.InvalidParams,
|
|
114
|
+
message: 'No active streamable HTTP session found for the provided sessionId',
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
86
119
|
await transport.handleRequest(req, res);
|
|
87
120
|
}
|
|
88
121
|
catch (error) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamableHttpRoutes.js","sourceRoot":"","sources":["../../../../src/transport/http/routes/streamableHttpRoutes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ServerManager } from '
|
|
1
|
+
import { ServerManager } from '../../core/server/serverManager.js';
|
|
2
2
|
/**
|
|
3
3
|
* ExpressServer orchestrates the HTTP/SSE transport layer for the MCP server.
|
|
4
4
|
*
|
|
@@ -15,7 +15,7 @@ import { ServerManager } from '../serverManager.js';
|
|
|
15
15
|
export declare class ExpressServer {
|
|
16
16
|
private app;
|
|
17
17
|
private serverManager;
|
|
18
|
-
private
|
|
18
|
+
private oauthProvider;
|
|
19
19
|
private configManager;
|
|
20
20
|
/**
|
|
21
21
|
* Creates a new ExpressServer instance.
|
|
@@ -30,6 +30,7 @@ export declare class ExpressServer {
|
|
|
30
30
|
* Sets up Express middleware including CORS, body parsing, and error handling.
|
|
31
31
|
*
|
|
32
32
|
* Configures the basic middleware stack required for the MCP server:
|
|
33
|
+
* - Enhanced security middleware (conditional based on feature flag)
|
|
33
34
|
* - CORS for cross-origin requests
|
|
34
35
|
* - JSON body parsing
|
|
35
36
|
* - Global error handling
|
|
@@ -55,7 +56,7 @@ export declare class ExpressServer {
|
|
|
55
56
|
* @param port - The port number to listen on
|
|
56
57
|
* @param host - The host address to bind to
|
|
57
58
|
*/
|
|
58
|
-
start(
|
|
59
|
+
start(): void;
|
|
59
60
|
/**
|
|
60
61
|
* Performs graceful shutdown of the Express server.
|
|
61
62
|
*
|
|
@@ -66,4 +67,4 @@ export declare class ExpressServer {
|
|
|
66
67
|
*/
|
|
67
68
|
shutdown(): void;
|
|
68
69
|
}
|
|
69
|
-
//# sourceMappingURL=
|
|
70
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/transport/http/server.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAQnE;;;;;;;;;;;;GAYG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,aAAa,CAAqB;IAE1C;;;;;;;OAOG;gBACS,aAAa,EAAE,aAAa;IAaxC;;;;;;;;OAQG;IACH,OAAO,CAAC,eAAe;IAcvB;;;;;;;;;OASG;IACH,OAAO,CAAC,WAAW;IAgDnB;;;;;;;;OAQG;IACI,KAAK,IAAI,IAAI;IASpB;;;;;;;OAOG;IACI,QAAQ,IAAI,IAAI;CAGxB"}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
2
|
import bodyParser from 'body-parser';
|
|
3
3
|
import cors from 'cors';
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
4
|
+
import { mcpAuthRouter } from '@modelcontextprotocol/sdk/server/auth/router.js';
|
|
5
|
+
import logger from '../../logger/logger.js';
|
|
6
|
+
import errorHandler from './middlewares/errorHandler.js';
|
|
7
|
+
import { setupSecurityMiddleware } from './middlewares/securityMiddleware.js';
|
|
8
|
+
import { SDKOAuthServerProvider } from '../../auth/sdkOAuthServerProvider.js';
|
|
9
9
|
import { setupStreamableHttpRoutes } from './routes/streamableHttpRoutes.js';
|
|
10
10
|
import { setupSseRoutes } from './routes/sseRoutes.js';
|
|
11
|
-
import
|
|
11
|
+
import oauthRoutes from './routes/oauthRoutes.js';
|
|
12
|
+
import { AgentConfigManager } from '../../core/server/agentConfig.js';
|
|
13
|
+
import { RATE_LIMIT_CONFIG } from '../../constants.js';
|
|
12
14
|
/**
|
|
13
15
|
* ExpressServer orchestrates the HTTP/SSE transport layer for the MCP server.
|
|
14
16
|
*
|
|
@@ -25,7 +27,7 @@ import { ServerConfigManager } from './config/serverConfig.js';
|
|
|
25
27
|
export class ExpressServer {
|
|
26
28
|
app;
|
|
27
29
|
serverManager;
|
|
28
|
-
|
|
30
|
+
oauthProvider;
|
|
29
31
|
configManager;
|
|
30
32
|
/**
|
|
31
33
|
* Creates a new ExpressServer instance.
|
|
@@ -38,10 +40,10 @@ export class ExpressServer {
|
|
|
38
40
|
constructor(serverManager) {
|
|
39
41
|
this.app = express();
|
|
40
42
|
this.serverManager = serverManager;
|
|
41
|
-
this.configManager =
|
|
42
|
-
// Initialize
|
|
43
|
+
this.configManager = AgentConfigManager.getInstance();
|
|
44
|
+
// Initialize OAuth provider with custom session storage path if configured
|
|
43
45
|
const sessionStoragePath = this.configManager.getSessionStoragePath();
|
|
44
|
-
this.
|
|
46
|
+
this.oauthProvider = new SDKOAuthServerProvider(sessionStoragePath);
|
|
45
47
|
this.setupMiddleware();
|
|
46
48
|
this.setupRoutes();
|
|
47
49
|
}
|
|
@@ -49,13 +51,19 @@ export class ExpressServer {
|
|
|
49
51
|
* Sets up Express middleware including CORS, body parsing, and error handling.
|
|
50
52
|
*
|
|
51
53
|
* Configures the basic middleware stack required for the MCP server:
|
|
54
|
+
* - Enhanced security middleware (conditional based on feature flag)
|
|
52
55
|
* - CORS for cross-origin requests
|
|
53
56
|
* - JSON body parsing
|
|
54
57
|
* - Global error handling
|
|
55
58
|
*/
|
|
56
59
|
setupMiddleware() {
|
|
60
|
+
// Conditionally apply enhanced security middleware (must be first if enabled)
|
|
61
|
+
if (this.configManager.isEnhancedSecurityEnabled()) {
|
|
62
|
+
this.app.use(...setupSecurityMiddleware());
|
|
63
|
+
}
|
|
57
64
|
this.app.use(cors()); // Allow all origins for local dev
|
|
58
65
|
this.app.use(bodyParser.json());
|
|
66
|
+
this.app.use(bodyParser.urlencoded({ extended: true }));
|
|
59
67
|
// Add error handling middleware
|
|
60
68
|
this.app.use(errorHandler);
|
|
61
69
|
}
|
|
@@ -70,16 +78,43 @@ export class ExpressServer {
|
|
|
70
78
|
* Logs the authentication status for debugging purposes.
|
|
71
79
|
*/
|
|
72
80
|
setupRoutes() {
|
|
73
|
-
//
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
81
|
+
// Setup OAuth routes using SDK's mcpAuthRouter
|
|
82
|
+
const { host, port } = this.configManager.getConfig();
|
|
83
|
+
const issuerUrl = new URL(`http://${host}:${port}`);
|
|
84
|
+
const rateLimitConfig = {
|
|
85
|
+
windowMs: this.configManager.getRateLimitWindowMs(),
|
|
86
|
+
max: this.configManager.getRateLimitMax(),
|
|
87
|
+
message: RATE_LIMIT_CONFIG.OAUTH.MESSAGE,
|
|
88
|
+
standardHeaders: true,
|
|
89
|
+
legacyHeaders: false,
|
|
90
|
+
};
|
|
91
|
+
const authRouter = mcpAuthRouter({
|
|
92
|
+
provider: this.oauthProvider,
|
|
93
|
+
issuerUrl,
|
|
94
|
+
authorizationOptions: {
|
|
95
|
+
rateLimit: rateLimitConfig,
|
|
96
|
+
},
|
|
97
|
+
tokenOptions: {
|
|
98
|
+
rateLimit: rateLimitConfig,
|
|
99
|
+
},
|
|
100
|
+
revocationOptions: {
|
|
101
|
+
rateLimit: rateLimitConfig,
|
|
102
|
+
},
|
|
103
|
+
clientRegistrationOptions: {
|
|
104
|
+
rateLimit: rateLimitConfig,
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
this.app.use(authRouter);
|
|
108
|
+
// Setup OAuth management routes (no auth required)
|
|
109
|
+
this.app.use('/oauth', oauthRoutes);
|
|
110
|
+
// Setup MCP transport routes (auth is handled per-route via scopeAuthMiddleware)
|
|
111
|
+
const router = express.Router();
|
|
112
|
+
setupStreamableHttpRoutes(router, this.serverManager);
|
|
113
|
+
setupSseRoutes(router, this.serverManager);
|
|
114
|
+
this.app.use(router);
|
|
80
115
|
// Log authentication status
|
|
81
|
-
if (this.
|
|
82
|
-
logger.info('Authentication enabled - OAuth 2.1 endpoints available');
|
|
116
|
+
if (this.configManager.isAuthEnabled()) {
|
|
117
|
+
logger.info('Authentication enabled - OAuth 2.1 endpoints available via SDK');
|
|
83
118
|
}
|
|
84
119
|
else {
|
|
85
120
|
logger.info('Authentication disabled - all endpoints accessible without auth');
|
|
@@ -94,10 +129,12 @@ export class ExpressServer {
|
|
|
94
129
|
* @param port - The port number to listen on
|
|
95
130
|
* @param host - The host address to bind to
|
|
96
131
|
*/
|
|
97
|
-
start(
|
|
132
|
+
start() {
|
|
133
|
+
const { port, host } = this.configManager.getConfig();
|
|
98
134
|
this.app.listen(port, host, () => {
|
|
99
|
-
const authStatus = this.
|
|
135
|
+
const authStatus = this.configManager.isAuthEnabled() ? 'with authentication' : 'without authentication';
|
|
100
136
|
logger.info(`Server is running on port ${port} with HTTP/SSE and Streamable HTTP transport ${authStatus}`);
|
|
137
|
+
logger.info(`📋 OAuth Management Dashboard: http://${host}:${port}/oauth`);
|
|
101
138
|
});
|
|
102
139
|
}
|
|
103
140
|
/**
|
|
@@ -109,7 +146,7 @@ export class ExpressServer {
|
|
|
109
146
|
* - Timer cleanup
|
|
110
147
|
*/
|
|
111
148
|
shutdown() {
|
|
112
|
-
this.
|
|
149
|
+
this.oauthProvider.shutdown();
|
|
113
150
|
}
|
|
114
151
|
}
|
|
115
|
-
//# sourceMappingURL=
|
|
152
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/transport/http/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AuthProviderTransport } from '../core/types/index.js';
|
|
2
|
+
import { MCPServerParams } from '../core/types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates transport instances from configuration
|
|
5
|
+
* @param config - Configuration object with server parameters
|
|
6
|
+
* @returns Record of transport instances
|
|
7
|
+
*/
|
|
8
|
+
export declare function createTransports(config: Record<string, MCPServerParams>): Record<string, AuthProviderTransport>;
|
|
9
|
+
//# sourceMappingURL=transportFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transportFactory.d.ts","sourceRoot":"","sources":["../../src/transport/transportFactory.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,qBAAqB,EAAyB,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AA2JzD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CA2B/G"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
2
|
+
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
|
|
3
|
+
import { StreamableHTTPClientTransport, } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
4
|
+
import { ZodError } from 'zod';
|
|
5
|
+
import logger from '../logger/logger.js';
|
|
6
|
+
import { transportConfigSchema } from '../core/types/index.js';
|
|
7
|
+
import { SDKOAuthClientProvider } from '../auth/sdkOAuthClientProvider.js';
|
|
8
|
+
import { AUTH_CONFIG } from '../constants.js';
|
|
9
|
+
import { AgentConfigManager } from '../core/server/agentConfig.js';
|
|
10
|
+
/**
|
|
11
|
+
* Infers transport type from configuration parameters
|
|
12
|
+
*/
|
|
13
|
+
function inferTransportType(params, name) {
|
|
14
|
+
const inferredParams = { ...params };
|
|
15
|
+
if (inferredParams.type) {
|
|
16
|
+
return inferredParams;
|
|
17
|
+
}
|
|
18
|
+
logger.warn(`Transport type is missing for ${name}, inferring type...`);
|
|
19
|
+
if (inferredParams.command) {
|
|
20
|
+
inferredParams.type = 'stdio';
|
|
21
|
+
logger.info(`Inferred transport type for ${name} as stdio`);
|
|
22
|
+
}
|
|
23
|
+
else if (inferredParams.url) {
|
|
24
|
+
if (inferredParams.url.endsWith('mcp')) {
|
|
25
|
+
inferredParams.type = 'http';
|
|
26
|
+
logger.info(`Inferred transport type for ${name} as http/streamableHttp`);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
inferredParams.type = 'sse';
|
|
30
|
+
logger.info(`Inferred transport type for ${name} as sse`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return inferredParams;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Creates OAuth provider for HTTP-based transports
|
|
37
|
+
*/
|
|
38
|
+
function createOAuthProvider(name, validatedTransport) {
|
|
39
|
+
const { host, port } = AgentConfigManager.getInstance().getConfig();
|
|
40
|
+
const oauthConfig = {
|
|
41
|
+
autoRegister: true,
|
|
42
|
+
redirectUrl: `http://${host}:${port}${AUTH_CONFIG.CLIENT.OAUTH.DEFAULT_CALLBACK_PATH}/${name}`,
|
|
43
|
+
...validatedTransport.oauth,
|
|
44
|
+
};
|
|
45
|
+
logger.info(`Creating OAuth client provider for transport: ${name}`);
|
|
46
|
+
return new SDKOAuthClientProvider(name, oauthConfig);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Creates SSE transport with OAuth provider
|
|
50
|
+
*/
|
|
51
|
+
function createSSETransport(name, validatedTransport) {
|
|
52
|
+
if (!validatedTransport.url) {
|
|
53
|
+
throw new Error(`URL is required for SSE transport: ${name}`);
|
|
54
|
+
}
|
|
55
|
+
const sseOptions = {
|
|
56
|
+
requestInit: {
|
|
57
|
+
headers: validatedTransport.headers,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
const oauthProvider = createOAuthProvider(name, validatedTransport);
|
|
61
|
+
sseOptions.authProvider = oauthProvider;
|
|
62
|
+
const transport = new SSEClientTransport(new URL(validatedTransport.url), sseOptions);
|
|
63
|
+
transport.oauthProvider = oauthProvider;
|
|
64
|
+
return transport;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Creates HTTP transport with OAuth provider
|
|
68
|
+
*/
|
|
69
|
+
function createHTTPTransport(name, validatedTransport) {
|
|
70
|
+
if (!validatedTransport.url) {
|
|
71
|
+
throw new Error(`URL is required for HTTP transport: ${name}`);
|
|
72
|
+
}
|
|
73
|
+
const httpOptions = {
|
|
74
|
+
requestInit: {
|
|
75
|
+
headers: validatedTransport.headers,
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
const oauthProvider = createOAuthProvider(name, validatedTransport);
|
|
79
|
+
httpOptions.authProvider = oauthProvider;
|
|
80
|
+
const transport = new StreamableHTTPClientTransport(new URL(validatedTransport.url), httpOptions);
|
|
81
|
+
transport.oauthProvider = oauthProvider;
|
|
82
|
+
return transport;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Creates stdio transport
|
|
86
|
+
*/
|
|
87
|
+
function createStdioTransport(name, validatedTransport) {
|
|
88
|
+
if (!validatedTransport.command) {
|
|
89
|
+
throw new Error(`Command is required for stdio transport: ${name}`);
|
|
90
|
+
}
|
|
91
|
+
return new StdioClientTransport(validatedTransport);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Creates a single transport instance
|
|
95
|
+
*/
|
|
96
|
+
function createSingleTransport(name, validatedTransport) {
|
|
97
|
+
switch (validatedTransport.type) {
|
|
98
|
+
case 'sse':
|
|
99
|
+
return createSSETransport(name, validatedTransport);
|
|
100
|
+
case 'http':
|
|
101
|
+
case 'streamableHttp':
|
|
102
|
+
return createHTTPTransport(name, validatedTransport);
|
|
103
|
+
case 'stdio':
|
|
104
|
+
return createStdioTransport(name, validatedTransport);
|
|
105
|
+
default:
|
|
106
|
+
throw new Error(`Invalid transport type: ${validatedTransport.type}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Assigns transport properties and adds to collection
|
|
111
|
+
*/
|
|
112
|
+
function assignTransport(transports, name, transport, validatedTransport) {
|
|
113
|
+
transport.timeout = validatedTransport.timeout;
|
|
114
|
+
transport.tags = validatedTransport.tags;
|
|
115
|
+
transports[name] = transport;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Creates transport instances from configuration
|
|
119
|
+
* @param config - Configuration object with server parameters
|
|
120
|
+
* @returns Record of transport instances
|
|
121
|
+
*/
|
|
122
|
+
export function createTransports(config) {
|
|
123
|
+
const transports = {};
|
|
124
|
+
for (const [name, params] of Object.entries(config)) {
|
|
125
|
+
if (params.disabled) {
|
|
126
|
+
logger.debug(`Skipping disabled transport: ${name}`);
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
const inferredParams = inferTransportType(params, name);
|
|
131
|
+
const validatedTransport = transportConfigSchema.parse(inferredParams);
|
|
132
|
+
const transport = createSingleTransport(name, validatedTransport);
|
|
133
|
+
assignTransport(transports, name, transport, validatedTransport);
|
|
134
|
+
logger.debug(`Created transport: ${name}`);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
if (error instanceof ZodError) {
|
|
138
|
+
logger.error(`Invalid transport configuration for ${name}:`, error.errors);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
logger.error(`Error creating transport ${name}:`, error);
|
|
142
|
+
}
|
|
143
|
+
throw error;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return transports;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=transportFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transportFactory.js","sourceRoot":"","sources":["../../src/transport/transportFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import { ServerCapabilities } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
-
import {
|
|
2
|
+
import { OutboundConnections } from '../core/types/index.js';
|
|
3
3
|
/**
|
|
4
4
|
* Filters clients by tags
|
|
5
5
|
* @param clients Record of client instances
|
|
6
6
|
* @param tags Array of tags to filter by
|
|
7
7
|
* @returns Filtered record of client instances
|
|
8
8
|
*/
|
|
9
|
-
export declare function filterClientsByTags(clients:
|
|
9
|
+
export declare function filterClientsByTags(clients: OutboundConnections, tags?: string[]): OutboundConnections;
|
|
10
10
|
/**
|
|
11
11
|
* Filters clients by capabilities
|
|
12
12
|
* @param clients Record of client instances
|
|
13
13
|
* @param capabilities Object containing capabilities to filter by
|
|
14
14
|
* @returns Filtered record of client instances
|
|
15
15
|
*/
|
|
16
|
-
export declare function filterClientsByCapabilities(clients:
|
|
17
|
-
type ClientFilter = (clients:
|
|
16
|
+
export declare function filterClientsByCapabilities(clients: OutboundConnections, capabilities: ServerCapabilities): OutboundConnections;
|
|
17
|
+
type ClientFilter = (clients: OutboundConnections) => OutboundConnections;
|
|
18
18
|
/**
|
|
19
19
|
* Filters clients by multiple criteria
|
|
20
20
|
* @param filters Array of client filters
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clientFiltering.d.ts","sourceRoot":"","sources":["../../src/utils/clientFiltering.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"clientFiltering.d.ts","sourceRoot":"","sources":["../../src/utils/clientFiltering.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAsB,MAAM,wBAAwB,CAAC;AAGjF;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAyBtG;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,mBAAmB,EAC5B,YAAY,EAAE,kBAAkB,GAC/B,mBAAmB,CAwBrB;AAED,KAAK,YAAY,GAAG,CAAC,OAAO,EAAE,mBAAmB,KAAK,mBAAmB,CAAC;AAE1E;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,OAAO,EAAE,YAAY,EAAE,GAAG,YAAY,CAItE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,oBAAoB,EAAE,kBAAkB,GAAG,YAAY,CAYrF;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,YAAY,CAYpD"}
|
|
@@ -9,13 +9,13 @@ export function filterClientsByTags(clients, tags) {
|
|
|
9
9
|
if (!tags || tags.length === 0) {
|
|
10
10
|
return clients;
|
|
11
11
|
}
|
|
12
|
-
const filteredClients =
|
|
12
|
+
const filteredClients = new Map();
|
|
13
13
|
let matchedClients = 0;
|
|
14
|
-
for (const [name, clientInfo] of
|
|
14
|
+
for (const [name, clientInfo] of clients.entries()) {
|
|
15
15
|
const clientTags = clientInfo.transport.tags || [];
|
|
16
16
|
const hasMatchingTags = tags.every((tag) => clientTags.includes(tag));
|
|
17
17
|
if (hasMatchingTags) {
|
|
18
|
-
filteredClients
|
|
18
|
+
filteredClients.set(name, clientInfo);
|
|
19
19
|
matchedClients++;
|
|
20
20
|
}
|
|
21
21
|
}
|
|
@@ -25,7 +25,7 @@ export function filterClientsByTags(clients, tags) {
|
|
|
25
25
|
else {
|
|
26
26
|
logger.debug(`Found ${matchedClients} clients matching tags: ${tags.join(', ')}`);
|
|
27
27
|
}
|
|
28
|
-
return
|
|
28
|
+
return filteredClients;
|
|
29
29
|
}
|
|
30
30
|
/**
|
|
31
31
|
* Filters clients by capabilities
|
|
@@ -34,16 +34,16 @@ export function filterClientsByTags(clients, tags) {
|
|
|
34
34
|
* @returns Filtered record of client instances
|
|
35
35
|
*/
|
|
36
36
|
export function filterClientsByCapabilities(clients, capabilities) {
|
|
37
|
-
const filteredClients =
|
|
37
|
+
const filteredClients = new Map();
|
|
38
38
|
let matchedClients = 0;
|
|
39
|
-
for (const [name, clientInfo] of
|
|
39
|
+
for (const [name, clientInfo] of clients.entries()) {
|
|
40
40
|
const clientCapabilities = clientInfo.capabilities || {};
|
|
41
41
|
const hasMatchingCapabilities = Object.keys(capabilities).every((capability) => {
|
|
42
42
|
const clientCapability = clientCapabilities[capability];
|
|
43
43
|
return clientCapability !== undefined;
|
|
44
44
|
});
|
|
45
45
|
if (hasMatchingCapabilities) {
|
|
46
|
-
filteredClients
|
|
46
|
+
filteredClients.set(name, clientInfo);
|
|
47
47
|
matchedClients++;
|
|
48
48
|
}
|
|
49
49
|
}
|
|
@@ -53,7 +53,7 @@ export function filterClientsByCapabilities(clients, capabilities) {
|
|
|
53
53
|
else {
|
|
54
54
|
logger.debug(`Found ${matchedClients} clients matching capabilities: ${JSON.stringify(capabilities)}`);
|
|
55
55
|
}
|
|
56
|
-
return
|
|
56
|
+
return filteredClients;
|
|
57
57
|
}
|
|
58
58
|
/**
|
|
59
59
|
* Filters clients by multiple criteria
|
|
@@ -72,13 +72,13 @@ export function filterClients(...filters) {
|
|
|
72
72
|
*/
|
|
73
73
|
export function byCapabilities(requiredCapabilities) {
|
|
74
74
|
return (clients) => {
|
|
75
|
-
return
|
|
75
|
+
return Array.from(clients.entries()).reduce((filtered, [name, clientInfo]) => {
|
|
76
76
|
const hasCapabilities = Object.keys(requiredCapabilities).every((cap) => clientInfo.capabilities && cap in clientInfo.capabilities);
|
|
77
77
|
if (hasCapabilities) {
|
|
78
|
-
filtered
|
|
78
|
+
filtered.set(name, clientInfo);
|
|
79
79
|
}
|
|
80
80
|
return filtered;
|
|
81
|
-
},
|
|
81
|
+
}, new Map());
|
|
82
82
|
};
|
|
83
83
|
}
|
|
84
84
|
/**
|
|
@@ -90,13 +90,13 @@ export function byTags(tags) {
|
|
|
90
90
|
return (clients) => {
|
|
91
91
|
if (!tags || tags.length === 0)
|
|
92
92
|
return clients;
|
|
93
|
-
return
|
|
93
|
+
return Array.from(clients.entries()).reduce((filtered, [name, clientInfo]) => {
|
|
94
94
|
const hasMatchingTags = tags.every((tag) => clientInfo.transport.tags?.includes(tag));
|
|
95
95
|
if (hasMatchingTags) {
|
|
96
|
-
filtered
|
|
96
|
+
filtered.set(name, clientInfo);
|
|
97
97
|
}
|
|
98
98
|
return filtered;
|
|
99
|
-
},
|
|
99
|
+
}, new Map());
|
|
100
100
|
};
|
|
101
101
|
}
|
|
102
102
|
//# sourceMappingURL=clientFiltering.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clientFiltering.js","sourceRoot":"","sources":["../../src/utils/clientFiltering.ts"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,qBAAqB,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,
|
|
1
|
+
{"version":3,"file":"clientFiltering.js","sourceRoot":"","sources":["../../src/utils/clientFiltering.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,15 +48,4 @@ export declare function formatErrorResponse(error: any): {
|
|
|
48
48
|
message: string;
|
|
49
49
|
data?: any;
|
|
50
50
|
};
|
|
51
|
-
/**
|
|
52
|
-
* Extracts client name and resource name from a URI
|
|
53
|
-
* @param uri The URI to parse
|
|
54
|
-
* @param separator The separator used in the URI
|
|
55
|
-
* @returns An object with clientName and resourceName
|
|
56
|
-
* @throws InvalidRequestError if the URI is invalid
|
|
57
|
-
*/
|
|
58
|
-
export declare function parseUri(uri: string, separator: string): {
|
|
59
|
-
clientName: string;
|
|
60
|
-
resourceName: string;
|
|
61
|
-
};
|
|
62
51
|
//# sourceMappingURL=errorHandling.d.ts.map
|