libmodulor 0.29.0 → 0.31.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/CHANGELOG.md +66 -0
- package/README.md +2 -2
- package/dist/esm/apps/Helper/src/lib/layers/product.js +1 -1
- package/dist/esm/apps/Helper/src/lib/layers/project.js +7 -7
- package/dist/esm/apps/Helper/src/lib/layers/target.js +27 -11
- package/dist/esm/convention.d.ts +2 -0
- package/dist/esm/convention.js +1 -0
- package/dist/esm/dt/base/TObject.js +13 -5
- package/dist/esm/dt/index.d.ts +1 -1
- package/dist/esm/dt/targets/json-schema.d.ts +23 -11
- package/dist/esm/error/funcs.d.ts +1 -0
- package/dist/esm/error/funcs.js +4 -0
- package/dist/esm/error/index.d.ts +1 -1
- package/dist/esm/error/index.js +1 -1
- package/dist/esm/i18n/WordingManager.js +12 -4
- package/dist/esm/i18n/locales/de.js +2 -0
- package/dist/esm/i18n/locales/en.js +2 -0
- package/dist/esm/i18n/locales/es.js +2 -0
- package/dist/esm/i18n/locales/fr.js +2 -0
- package/dist/esm/i18n/types.d.ts +1 -1
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.instrumentation-otl.d.ts +1 -0
- package/dist/esm/index.instrumentation-otl.js +1 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.node-express.d.ts +2 -0
- package/dist/esm/index.node-express.js +1 -0
- package/dist/esm/index.node-hono.d.ts +2 -0
- package/dist/esm/index.node-hono.js +1 -0
- package/dist/esm/index.node-mcp-express.d.ts +3 -0
- package/dist/esm/index.node-mcp-express.js +2 -0
- package/dist/esm/index.node-mcp-hono.d.ts +3 -0
- package/dist/esm/index.node-mcp-hono.js +2 -0
- package/dist/esm/index.node-mcp.d.ts +3 -1
- package/dist/esm/index.node-mcp.js +3 -1
- package/dist/esm/instrumentation/instrumentation-otl.d.ts +12 -0
- package/dist/esm/instrumentation/instrumentation-otl.js +119 -0
- package/dist/esm/products/Helper/i18n.d.ts +2 -0
- package/dist/esm/std/CryptoManager.d.ts +1 -1
- package/dist/esm/std/HTTPAPICaller.d.ts +2 -1
- package/dist/esm/std/impl/JoseJWTManager.js +9 -4
- package/dist/esm/std/impl/SimpleHTTPAPICaller.js +13 -7
- package/dist/esm/std/lib/settings.js +4 -5
- package/dist/esm/target/edge-worker-hono-server/SyncEdgeWorkerHonoServerManager.d.ts +2 -0
- package/dist/esm/target/edge-worker-hono-server/SyncEdgeWorkerHonoServerManager.js +3 -0
- package/dist/esm/target/index.d.ts +1 -1
- package/dist/esm/target/index.js +1 -1
- package/dist/esm/target/lib/client/AuthDataStore.d.ts +5 -0
- package/dist/esm/target/lib/client/impl/InMemoryAuthDataStore.d.ts +7 -0
- package/dist/esm/target/lib/client/impl/InMemoryAuthDataStore.js +20 -0
- package/dist/esm/target/lib/client/impl/MixedServerClientManager.d.ts +15 -0
- package/dist/esm/target/lib/client/impl/MixedServerClientManager.js +44 -0
- package/dist/esm/target/lib/json-schema/error.d.ts +3 -0
- package/dist/esm/target/lib/json-schema/error.js +14 -0
- package/dist/esm/target/lib/json-schema/input.d.ts +16 -0
- package/dist/esm/target/lib/json-schema/input.js +67 -0
- package/dist/esm/target/lib/json-schema/output.d.ts +19 -0
- package/dist/esm/target/lib/json-schema/output.js +128 -0
- package/dist/esm/target/lib/manifest.d.ts +32 -1
- package/dist/esm/target/lib/manifest.js +22 -1
- package/dist/esm/target/lib/mcp-server/MCPServerRequestChecker.d.ts +22 -0
- package/dist/esm/target/lib/mcp-server/MCPServerRequestChecker.js +71 -0
- package/dist/esm/target/lib/mcp-server/MCPServerRequestHandler.d.ts +16 -0
- package/dist/esm/target/lib/mcp-server/MCPServerRequestHandler.js +54 -0
- package/dist/esm/target/lib/mcp-server/consts.d.ts +1 -0
- package/dist/esm/target/lib/mcp-server/consts.js +1 -0
- package/dist/esm/target/lib/mcp-server/funcs.d.ts +13 -0
- package/dist/esm/target/lib/mcp-server/funcs.js +84 -0
- package/dist/esm/target/lib/mcp-server/http/MCPHTTPRequestHandlerBuilder.d.ts +14 -0
- package/dist/esm/target/lib/mcp-server/http/MCPHTTPRequestHandlerBuilder.js +1 -0
- package/dist/esm/target/lib/mcp-server/http/express/MCPHTTPExpressFakeRequestHandlerBuilder.d.ts +5 -0
- package/dist/esm/target/lib/mcp-server/http/express/MCPHTTPExpressFakeRequestHandlerBuilder.js +18 -0
- package/dist/esm/target/lib/mcp-server/http/express/MCPHTTPExpressProtocolRequestHandlerBuilder.d.ts +17 -0
- package/dist/esm/target/lib/mcp-server/http/express/MCPHTTPExpressProtocolRequestHandlerBuilder.js +100 -0
- package/dist/esm/target/lib/mcp-server/http/express/types.d.ts +3 -0
- package/dist/esm/target/lib/mcp-server/http/express/types.js +1 -0
- package/dist/esm/target/lib/mcp-server/http/funcs.d.ts +6 -0
- package/dist/esm/target/lib/mcp-server/http/funcs.js +50 -0
- package/dist/esm/target/lib/mcp-server/http/hono/MCPHTTPHonoFakeRequestHandlerBuilder.d.ts +5 -0
- package/dist/esm/target/lib/mcp-server/http/hono/MCPHTTPHonoFakeRequestHandlerBuilder.js +18 -0
- package/dist/esm/target/lib/mcp-server/http/hono/MCPHTTPHonoProtocolRequestHandlerBuilder.d.ts +17 -0
- package/dist/esm/target/lib/mcp-server/http/hono/MCPHTTPHonoProtocolRequestHandlerBuilder.js +100 -0
- package/dist/esm/target/lib/mcp-server/http/hono/types.d.ts +3 -0
- package/dist/esm/target/lib/mcp-server/http/hono/types.js +1 -0
- package/dist/esm/target/lib/mcp-server/stdio/MCPStdioRequestHandler.d.ts +31 -0
- package/dist/esm/target/lib/mcp-server/stdio/MCPStdioRequestHandler.js +108 -0
- package/dist/esm/target/lib/mcp-server/stdio/MCPStdioUCClientConfirmManager.d.ts +7 -0
- package/dist/esm/target/lib/mcp-server/stdio/MCPStdioUCClientConfirmManager.js +36 -0
- package/dist/esm/target/lib/mcp-server/stdio/consts.d.ts +2 -0
- package/dist/esm/target/lib/mcp-server/stdio/consts.js +3 -0
- package/dist/esm/target/lib/mcp-server/stdio/funcs.d.ts +2 -0
- package/dist/esm/target/lib/mcp-server/stdio/funcs.js +10 -0
- package/dist/esm/target/lib/mcp-server/stdio/input.d.ts +10 -0
- package/dist/esm/target/lib/mcp-server/stdio/input.js +15 -0
- package/dist/esm/target/lib/mcp-server/types.d.ts +2 -0
- package/dist/esm/target/lib/mcp-server/types.js +1 -0
- package/dist/esm/target/lib/openapi/OpenAPISpecBuilder.js +8 -4
- package/dist/esm/target/lib/openapi/funcs.d.ts +4 -9
- package/dist/esm/target/lib/openapi/funcs.js +18 -119
- package/dist/esm/target/lib/openapi/types.d.ts +5 -16
- package/dist/esm/target/lib/react/useAction.js +0 -1
- package/dist/esm/target/lib/react/useUC.js +0 -3
- package/dist/esm/target/lib/server/AuthenticationChecker.js +15 -10
- package/dist/esm/target/lib/server/JWTAuthenticationChecker.d.ts +1 -0
- package/dist/esm/target/lib/server/JWTAuthenticationChecker.js +11 -2
- package/dist/esm/target/lib/server/ServerBooter.d.ts +1 -1
- package/dist/esm/target/lib/server/ServerBooter.js +10 -0
- package/dist/esm/target/lib/server/ServerManager.d.ts +10 -0
- package/dist/esm/target/lib/server/ServerRequestHandler.d.ts +10 -5
- package/dist/esm/target/lib/server/ServerRequestHandler.js +35 -25
- package/dist/esm/target/lib/server/consts.js +4 -0
- package/dist/esm/target/lib/server-express/funcs.js +2 -6
- package/dist/esm/target/lib/server-hono/funcs.js +4 -2
- package/dist/esm/target/lib/shared.d.ts +1 -0
- package/dist/esm/target/lib/shared.js +1 -0
- package/dist/esm/target/nextjs-server/NextJSServerManager.d.ts +2 -0
- package/dist/esm/target/nextjs-server/NextJSServerManager.js +3 -0
- package/dist/esm/target/node-express-server/NodeExpressServerManager.d.ts +6 -2
- package/dist/esm/target/node-express-server/NodeExpressServerManager.js +15 -6
- package/dist/esm/target/node-hono-server/NodeHonoServerManager.d.ts +6 -2
- package/dist/esm/target/node-hono-server/NodeHonoServerManager.js +15 -6
- package/dist/esm/target/{node-mcp-server/NodeLocalStdioMCPServerManager.d.ts → node-mcp-server-stdio/NodeMCPStdioServerManager.d.ts} +9 -20
- package/dist/esm/target/node-mcp-server-stdio/NodeMCPStdioServerManager.js +108 -0
- package/dist/esm/target/react-native-pure/UCFormFieldControl.js +0 -1
- package/dist/esm/testing/impl/NodeAppTesterConfigurator.js +7 -0
- package/dist/esm/testing/impl/newNodeAppTester.js +12 -0
- package/dist/esm/uc/cardinality.d.ts +7 -0
- package/dist/esm/uc/cardinality.js +14 -0
- package/dist/esm/uc/examples.d.ts +2 -0
- package/dist/esm/uc/examples.js +12 -0
- package/dist/esm/uc/helpers/UCOutputReader.d.ts +2 -2
- package/dist/esm/uc/helpers/UCOutputReader.js +2 -2
- package/dist/esm/uc/index.d.ts +2 -0
- package/dist/esm/uc/index.js +2 -0
- package/dist/esm/uc/input-field.d.ts +3 -6
- package/dist/esm/uc/input-field.js +5 -21
- package/dist/esm/uc/opi.d.ts +3 -1
- package/dist/esm/uc/opi.js +4 -1
- package/dist/esm/uc/output-field.d.ts +13 -1
- package/dist/esm/uc/output-field.js +9 -11
- package/dist/esm/utils/bundling/funcs.js +1 -1
- package/dist/esm/utils/bundling/vite/plugin.d.ts +1 -1
- package/dist/esm/utils/index.d.ts +1 -0
- package/dist/esm/utils/index.js +1 -0
- package/dist/esm/utils/streams/funcs.d.ts +2 -0
- package/dist/esm/utils/streams/funcs.js +10 -0
- package/dist/esm/utils/strings/humanize.js +4 -1
- package/package.json +47 -20
- package/dist/esm/target/lib/openapi/consts.d.ts +0 -2
- package/dist/esm/target/lib/openapi/consts.js +0 -1
- package/dist/esm/target/lib/openapi/input.d.ts +0 -16
- package/dist/esm/target/lib/openapi/input.js +0 -33
- package/dist/esm/target/node-mcp-server/NodeLocalStdioMCPServerManager.js +0 -188
- package/dist/esm/target/node-mcp-server/funcs.d.ts +0 -7
- package/dist/esm/target/node-mcp-server/funcs.js +0 -45
- package/dist/esm/target/node-mcp-server/types.d.ts +0 -15
- /package/dist/esm/target/{node-mcp-server/types.js → lib/client/AuthDataStore.js} +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { UCDefLifecycle } from '../../uc/index.js';
|
|
1
2
|
import type { EnumOf } from '../../utils/index.js';
|
|
2
3
|
export declare const TARGETS: {
|
|
3
4
|
readonly 'edge-worker-hono-server': "edge-worker-hono-server";
|
|
@@ -5,9 +6,39 @@ export declare const TARGETS: {
|
|
|
5
6
|
readonly 'node-core-cli': "node-core-cli";
|
|
6
7
|
readonly 'node-express-server': "node-express-server";
|
|
7
8
|
readonly 'node-hono-server': "node-hono-server";
|
|
8
|
-
readonly 'node-mcp-server': "node-mcp-server";
|
|
9
|
+
readonly 'node-mcp-server-stdio': "node-mcp-server-stdio";
|
|
9
10
|
readonly 'node-stricli-cli': "node-stricli-cli";
|
|
10
11
|
readonly 'react-native-pure': "react-native-pure";
|
|
11
12
|
readonly 'react-web-pure': "react-web-pure";
|
|
12
13
|
};
|
|
13
14
|
export type TargetName = EnumOf<typeof TARGETS>;
|
|
15
|
+
export declare const TargetCapability: {
|
|
16
|
+
readonly FULL: "FULL";
|
|
17
|
+
readonly NOT_APPLICABLE: "NOT_APPLICABLE";
|
|
18
|
+
readonly PARTIAL: "PARTIAL";
|
|
19
|
+
readonly TODO: "TODO";
|
|
20
|
+
};
|
|
21
|
+
export type TargetCapability = EnumOf<typeof TargetCapability>;
|
|
22
|
+
export interface TargetCapabilities {
|
|
23
|
+
authBasic: TargetCapability;
|
|
24
|
+
authJWT: TargetCapability;
|
|
25
|
+
authPrivKey: TargetCapability;
|
|
26
|
+
authPubKey: TargetCapability;
|
|
27
|
+
i18n: TargetCapability;
|
|
28
|
+
mcp: TargetCapability;
|
|
29
|
+
mcpOAuth: TargetCapability;
|
|
30
|
+
openapiSpec: TargetCapability;
|
|
31
|
+
streaming: TargetCapability;
|
|
32
|
+
ucAutoMounting: TargetCapability;
|
|
33
|
+
ucClientConfirm: TargetCapability;
|
|
34
|
+
ucInputFile: TargetCapability;
|
|
35
|
+
ucValidation: TargetCapability;
|
|
36
|
+
}
|
|
37
|
+
export declare const TARGET_CAPABILITIES_SAMPLE: TargetCapabilities;
|
|
38
|
+
export interface TargetDef {
|
|
39
|
+
lifecycle: UCDefLifecycle;
|
|
40
|
+
capabilities: TargetCapabilities;
|
|
41
|
+
}
|
|
42
|
+
export interface TargetDefSrc {
|
|
43
|
+
DEF: TargetDef;
|
|
44
|
+
}
|
|
@@ -4,8 +4,29 @@ export const TARGETS = {
|
|
|
4
4
|
'node-core-cli': 'node-core-cli',
|
|
5
5
|
'node-express-server': 'node-express-server',
|
|
6
6
|
'node-hono-server': 'node-hono-server',
|
|
7
|
-
'node-mcp-server': 'node-mcp-server',
|
|
7
|
+
'node-mcp-server-stdio': 'node-mcp-server-stdio',
|
|
8
8
|
'node-stricli-cli': 'node-stricli-cli',
|
|
9
9
|
'react-native-pure': 'react-native-pure',
|
|
10
10
|
'react-web-pure': 'react-web-pure',
|
|
11
11
|
};
|
|
12
|
+
export const TargetCapability = {
|
|
13
|
+
FULL: 'FULL',
|
|
14
|
+
NOT_APPLICABLE: 'NOT_APPLICABLE',
|
|
15
|
+
PARTIAL: 'PARTIAL',
|
|
16
|
+
TODO: 'TODO',
|
|
17
|
+
};
|
|
18
|
+
export const TARGET_CAPABILITIES_SAMPLE = {
|
|
19
|
+
authBasic: TargetCapability.FULL,
|
|
20
|
+
authJWT: TargetCapability.FULL,
|
|
21
|
+
authPrivKey: TargetCapability.FULL,
|
|
22
|
+
authPubKey: TargetCapability.FULL,
|
|
23
|
+
i18n: TargetCapability.FULL,
|
|
24
|
+
mcp: TargetCapability.FULL,
|
|
25
|
+
mcpOAuth: TargetCapability.FULL,
|
|
26
|
+
openapiSpec: TargetCapability.FULL,
|
|
27
|
+
streaming: TargetCapability.FULL,
|
|
28
|
+
ucAutoMounting: TargetCapability.FULL,
|
|
29
|
+
ucClientConfirm: TargetCapability.FULL,
|
|
30
|
+
ucInputFile: TargetCapability.FULL,
|
|
31
|
+
ucValidation: TargetCapability.FULL,
|
|
32
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { HTTPStatusNumber } from '../../../dt/index.js';
|
|
2
|
+
import type { Configurable, SettingsManager, Worker } from '../../../std/index.js';
|
|
3
|
+
import { JWTAuthenticationChecker } from '../server/JWTAuthenticationChecker.js';
|
|
4
|
+
import { PublicApiKeyChecker } from '../server/PublicApiKeyChecker.js';
|
|
5
|
+
import type { ServerManagerSettings } from '../server/ServerManager.js';
|
|
6
|
+
import type { ServerRequestHandlerReq } from '../server/ServerRequestHandler.js';
|
|
7
|
+
interface Input {
|
|
8
|
+
req: ServerRequestHandlerReq;
|
|
9
|
+
}
|
|
10
|
+
interface Output {
|
|
11
|
+
status: Extract<HTTPStatusNumber, 401> | null;
|
|
12
|
+
}
|
|
13
|
+
type S = Pick<ServerManagerSettings, 'server_mcp_dangerously_skip_auth_check' | 'server_mcp_dangerously_skip_pub_api_key_check' | 'server_public_api_key_header_name'>;
|
|
14
|
+
export declare class MCPServerRequestChecker implements Configurable<S>, Worker<Input, Promise<Output>> {
|
|
15
|
+
private jwtAuthenticationChecker;
|
|
16
|
+
private publicApiKeyChecker;
|
|
17
|
+
private settingsManager;
|
|
18
|
+
constructor(jwtAuthenticationChecker: JWTAuthenticationChecker, publicApiKeyChecker: PublicApiKeyChecker, settingsManager: SettingsManager<S>);
|
|
19
|
+
s(): S;
|
|
20
|
+
exec({ req }: Input): Promise<Output>;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { inject, injectable } from 'inversify';
|
|
14
|
+
import { logDevWarning } from '../../../error/index.js';
|
|
15
|
+
import { JWTAuthenticationChecker } from '../server/JWTAuthenticationChecker.js';
|
|
16
|
+
import { PublicApiKeyChecker } from '../server/PublicApiKeyChecker.js';
|
|
17
|
+
let MCPServerRequestChecker = class MCPServerRequestChecker {
|
|
18
|
+
jwtAuthenticationChecker;
|
|
19
|
+
publicApiKeyChecker;
|
|
20
|
+
settingsManager;
|
|
21
|
+
constructor(jwtAuthenticationChecker, publicApiKeyChecker, settingsManager) {
|
|
22
|
+
this.jwtAuthenticationChecker = jwtAuthenticationChecker;
|
|
23
|
+
this.publicApiKeyChecker = publicApiKeyChecker;
|
|
24
|
+
this.settingsManager = settingsManager;
|
|
25
|
+
}
|
|
26
|
+
s() {
|
|
27
|
+
return {
|
|
28
|
+
server_mcp_dangerously_skip_auth_check: this.settingsManager.get()('server_mcp_dangerously_skip_auth_check'),
|
|
29
|
+
server_mcp_dangerously_skip_pub_api_key_check: this.settingsManager.get()('server_mcp_dangerously_skip_pub_api_key_check'),
|
|
30
|
+
server_public_api_key_header_name: this.settingsManager.get()('server_public_api_key_header_name'),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
async exec({ req }) {
|
|
34
|
+
const { header } = req;
|
|
35
|
+
if (this.s().server_mcp_dangerously_skip_pub_api_key_check) {
|
|
36
|
+
logDevWarning('Skipping pub api key check');
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
await this.publicApiKeyChecker.exec({
|
|
40
|
+
checkType: 'on',
|
|
41
|
+
value: await header(this.s().server_public_api_key_header_name),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
if (this.s().server_mcp_dangerously_skip_auth_check) {
|
|
45
|
+
logDevWarning('Skipping auth check');
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
const authorizationHeader = await header('Authorization');
|
|
49
|
+
const auth = await this.jwtAuthenticationChecker.exec({
|
|
50
|
+
rawValue: authorizationHeader,
|
|
51
|
+
});
|
|
52
|
+
if (!auth) {
|
|
53
|
+
return {
|
|
54
|
+
status: 401,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
status: null,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
MCPServerRequestChecker = __decorate([
|
|
64
|
+
injectable(),
|
|
65
|
+
__param(0, inject(JWTAuthenticationChecker)),
|
|
66
|
+
__param(1, inject(PublicApiKeyChecker)),
|
|
67
|
+
__param(2, inject('SettingsManager')),
|
|
68
|
+
__metadata("design:paramtypes", [JWTAuthenticationChecker,
|
|
69
|
+
PublicApiKeyChecker, Object])
|
|
70
|
+
], MCPServerRequestChecker);
|
|
71
|
+
export { MCPServerRequestChecker };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import type { Configurable, SettingsManager, Worker } from '../../../std/index.js';
|
|
3
|
+
import type { UCInput, UCOPIBase } from '../../../uc/index.js';
|
|
4
|
+
import type { ServerManagerSettings } from '../server/ServerManager.js';
|
|
5
|
+
import { ServerRequestHandler, type ServerRequestHandlerInput } from '../server/ServerRequestHandler.js';
|
|
6
|
+
type Input<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined> = Omit<ServerRequestHandlerInput<I, OPI0, OPI1>, 'dangerouslySkipAuthCheck' | 'dangerouslySkipPubApiKeyCheck' | 'skipSideEffects'>;
|
|
7
|
+
type Output = CallToolResult;
|
|
8
|
+
type S = Pick<ServerManagerSettings, 'server_mcp_dangerously_skip_auth_check' | 'server_mcp_dangerously_skip_pub_api_key_check'>;
|
|
9
|
+
export declare class MCPServerRequestHandler implements Configurable<S>, Worker<Input, Promise<Output>> {
|
|
10
|
+
private serverRequestHandler;
|
|
11
|
+
private settingsManager;
|
|
12
|
+
constructor(serverRequestHandler: ServerRequestHandler, settingsManager: SettingsManager<S>);
|
|
13
|
+
s(): S;
|
|
14
|
+
exec<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>({ appManifest, envelope, execOpts, req, res, ucd, ucManager, }: Input<I, OPI0, OPI1>): Promise<Output>;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { inject, injectable } from 'inversify';
|
|
14
|
+
import { ServerRequestHandler, } from '../server/ServerRequestHandler.js';
|
|
15
|
+
import { resError, resObj } from './funcs.js';
|
|
16
|
+
let MCPServerRequestHandler = class MCPServerRequestHandler {
|
|
17
|
+
serverRequestHandler;
|
|
18
|
+
settingsManager;
|
|
19
|
+
constructor(serverRequestHandler, settingsManager) {
|
|
20
|
+
this.serverRequestHandler = serverRequestHandler;
|
|
21
|
+
this.settingsManager = settingsManager;
|
|
22
|
+
}
|
|
23
|
+
s() {
|
|
24
|
+
return {
|
|
25
|
+
server_mcp_dangerously_skip_auth_check: this.settingsManager.get()('server_mcp_dangerously_skip_auth_check'),
|
|
26
|
+
server_mcp_dangerously_skip_pub_api_key_check: this.settingsManager.get()('server_mcp_dangerously_skip_pub_api_key_check'),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
async exec({ appManifest, envelope, execOpts, req, res, ucd, ucManager, }) {
|
|
30
|
+
const { body, rawErr } = await this.serverRequestHandler.exec({
|
|
31
|
+
appManifest,
|
|
32
|
+
dangerouslySkipAuthCheck: this.s().server_mcp_dangerously_skip_auth_check,
|
|
33
|
+
dangerouslySkipPubApiKeyCheck: this.s().server_mcp_dangerously_skip_pub_api_key_check,
|
|
34
|
+
envelope,
|
|
35
|
+
execOpts,
|
|
36
|
+
req,
|
|
37
|
+
res,
|
|
38
|
+
skipSideEffects: true,
|
|
39
|
+
ucd,
|
|
40
|
+
ucManager,
|
|
41
|
+
});
|
|
42
|
+
if (rawErr) {
|
|
43
|
+
return resError(rawErr);
|
|
44
|
+
}
|
|
45
|
+
return resObj(body);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
MCPServerRequestHandler = __decorate([
|
|
49
|
+
injectable(),
|
|
50
|
+
__param(0, inject(ServerRequestHandler)),
|
|
51
|
+
__param(1, inject('SettingsManager')),
|
|
52
|
+
__metadata("design:paramtypes", [ServerRequestHandler, Object])
|
|
53
|
+
], MCPServerRequestHandler);
|
|
54
|
+
export { MCPServerRequestHandler };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const ABORTED_RES = "Aborted";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const ABORTED_RES = 'Aborted';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { AnySchema } from '@modelcontextprotocol/sdk/server/zod-compat.js';
|
|
3
|
+
import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import type { ProductManifest } from '../../../product/index.js';
|
|
5
|
+
import type { UC, UCDefLifecycle, UCInput, UCOPIBase, UCWording } from '../../../uc/index.js';
|
|
6
|
+
import type { RegisterToolConfig } from './types.js';
|
|
7
|
+
export declare function init(productManifest: ProductManifest): McpServer;
|
|
8
|
+
export declare function resAborted(): CallToolResult;
|
|
9
|
+
export declare function resError(err: Error): CallToolResult;
|
|
10
|
+
export declare function resObj<T>(obj: T): CallToolResult;
|
|
11
|
+
export declare function toolConfig<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(uc: UC<I, OPI0, OPI1>, lifecycle: UCDefLifecycle, wording: UCWording): RegisterToolConfig;
|
|
12
|
+
export declare function ucInputMCPSchema<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(uc: UC<I, OPI0, OPI1>, lifecycle: UCDefLifecycle): AnySchema;
|
|
13
|
+
export declare function ucOutputMCPSchema<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(uc: UC<I, OPI0, OPI1>): AnySchema | undefined;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { fromJSONSchema } from 'zod';
|
|
3
|
+
import { ucInputJsonSchema } from '../json-schema/input.js';
|
|
4
|
+
import { ucOutputJsonSchema } from '../json-schema/output.js';
|
|
5
|
+
import { DEFAULT_VERSION } from '../shared.js';
|
|
6
|
+
import { ABORTED_RES } from './consts.js';
|
|
7
|
+
import { stdioToolInputSchema } from './stdio/input.js';
|
|
8
|
+
export function init(productManifest) {
|
|
9
|
+
const { name, version } = productManifest;
|
|
10
|
+
return new McpServer({
|
|
11
|
+
name: name,
|
|
12
|
+
version: version ?? DEFAULT_VERSION,
|
|
13
|
+
}, { capabilities: { logging: {} } });
|
|
14
|
+
}
|
|
15
|
+
export function resAborted() {
|
|
16
|
+
return {
|
|
17
|
+
content: [
|
|
18
|
+
{
|
|
19
|
+
text: ABORTED_RES,
|
|
20
|
+
type: 'text',
|
|
21
|
+
},
|
|
22
|
+
],
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export function resError(err) {
|
|
26
|
+
return {
|
|
27
|
+
content: [
|
|
28
|
+
{
|
|
29
|
+
text: err.message,
|
|
30
|
+
type: 'text',
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
isError: true,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export function resObj(obj) {
|
|
37
|
+
return {
|
|
38
|
+
content: [],
|
|
39
|
+
structuredContent: obj,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export function toolConfig(uc, lifecycle, wording) {
|
|
43
|
+
const inputSchema = ucInputMCPSchema(uc, lifecycle);
|
|
44
|
+
const outputSchema = ucOutputMCPSchema(uc);
|
|
45
|
+
const { desc, label } = wording;
|
|
46
|
+
const config = {
|
|
47
|
+
annotations: {
|
|
48
|
+
destructiveHint: uc.def.metadata.sensitive,
|
|
49
|
+
},
|
|
50
|
+
inputSchema,
|
|
51
|
+
title: label,
|
|
52
|
+
};
|
|
53
|
+
if (outputSchema) {
|
|
54
|
+
config.outputSchema = outputSchema;
|
|
55
|
+
}
|
|
56
|
+
if (desc) {
|
|
57
|
+
config.description = desc;
|
|
58
|
+
}
|
|
59
|
+
return config;
|
|
60
|
+
}
|
|
61
|
+
export function ucInputMCPSchema(uc, lifecycle) {
|
|
62
|
+
const jsonSchema = ucInputJsonSchema(uc);
|
|
63
|
+
switch (lifecycle) {
|
|
64
|
+
case 'client':
|
|
65
|
+
jsonSchema.properties = {
|
|
66
|
+
...jsonSchema.properties,
|
|
67
|
+
...stdioToolInputSchema(),
|
|
68
|
+
};
|
|
69
|
+
break;
|
|
70
|
+
case 'server':
|
|
71
|
+
// Nothing to do
|
|
72
|
+
break;
|
|
73
|
+
default:
|
|
74
|
+
lifecycle;
|
|
75
|
+
}
|
|
76
|
+
return fromJSONSchema(jsonSchema);
|
|
77
|
+
}
|
|
78
|
+
export function ucOutputMCPSchema(uc) {
|
|
79
|
+
const jsonSchema = ucOutputJsonSchema(uc);
|
|
80
|
+
if (!jsonSchema) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
return fromJSONSchema(jsonSchema);
|
|
84
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ProductUCsLoaderOutput } from '../../../../product/index.js';
|
|
2
|
+
import type { Worker } from '../../../../std/index.js';
|
|
3
|
+
import type { UCManager } from '../../../../uc/index.js';
|
|
4
|
+
export interface MCPHTTPRequestHandlerBuilderInput {
|
|
5
|
+
ucs: ProductUCsLoaderOutput;
|
|
6
|
+
/**
|
|
7
|
+
* It is not injected in the handler constructor because it must be the same as the one used in ServerManager.
|
|
8
|
+
*
|
|
9
|
+
* And in some cases, this latter is specific to a context : for instance in automated tests.
|
|
10
|
+
*/
|
|
11
|
+
ucManager: UCManager;
|
|
12
|
+
}
|
|
13
|
+
export interface MCPHTTPRequestHandlerBuilder<H extends Function> extends Worker<MCPHTTPRequestHandlerBuilderInput, H> {
|
|
14
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/esm/target/lib/mcp-server/http/express/MCPHTTPExpressFakeRequestHandlerBuilder.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { injectable } from 'inversify';
|
|
8
|
+
let MCPHTTPExpressFakeRequestHandlerBuilder = class MCPHTTPExpressFakeRequestHandlerBuilder {
|
|
9
|
+
exec() {
|
|
10
|
+
return async (_req, res) => {
|
|
11
|
+
res.status(200).json({});
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
MCPHTTPExpressFakeRequestHandlerBuilder = __decorate([
|
|
16
|
+
injectable()
|
|
17
|
+
], MCPHTTPExpressFakeRequestHandlerBuilder);
|
|
18
|
+
export { MCPHTTPExpressFakeRequestHandlerBuilder };
|
package/dist/esm/target/lib/mcp-server/http/express/MCPHTTPExpressProtocolRequestHandlerBuilder.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { RequestHandler } from 'express';
|
|
2
|
+
import { WordingManager } from '../../../../../i18n/index.js';
|
|
3
|
+
import type { ProductManifest } from '../../../../../product/index.js';
|
|
4
|
+
import type { Logger } from '../../../../../std/index.js';
|
|
5
|
+
import { MCPServerRequestChecker } from '../../MCPServerRequestChecker.js';
|
|
6
|
+
import { MCPServerRequestHandler } from '../../MCPServerRequestHandler.js';
|
|
7
|
+
import type { MCPHTTPRequestHandlerBuilderInput } from '../MCPHTTPRequestHandlerBuilder.js';
|
|
8
|
+
import type { MCPHTTPExpressRequestHandlerBuilder } from './types.js';
|
|
9
|
+
export declare class MCPHTTPExpressProtocolRequestHandlerBuilder implements MCPHTTPExpressRequestHandlerBuilder {
|
|
10
|
+
private logger;
|
|
11
|
+
private productManifest;
|
|
12
|
+
private serverRequestChecker;
|
|
13
|
+
private serverRequestHandler;
|
|
14
|
+
private wordingManager;
|
|
15
|
+
constructor(logger: Logger, productManifest: ProductManifest, serverRequestChecker: MCPServerRequestChecker, serverRequestHandler: MCPServerRequestHandler, wordingManager: WordingManager);
|
|
16
|
+
exec({ ucs, ucManager, }: MCPHTTPRequestHandlerBuilderInput): RequestHandler;
|
|
17
|
+
}
|
package/dist/esm/target/lib/mcp-server/http/express/MCPHTTPExpressProtocolRequestHandlerBuilder.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
14
|
+
import { inject, injectable } from 'inversify';
|
|
15
|
+
import { WordingManager } from '../../../../../i18n/index.js';
|
|
16
|
+
import { ucMountingPoint, } from '../../../../../uc/index.js';
|
|
17
|
+
import { toReq, toRes } from '../../../server-express/funcs.js';
|
|
18
|
+
import { init, toolConfig } from '../../funcs.js';
|
|
19
|
+
import { MCPServerRequestChecker } from '../../MCPServerRequestChecker.js';
|
|
20
|
+
import { MCPServerRequestHandler } from '../../MCPServerRequestHandler.js';
|
|
21
|
+
import { ucStreamExecOpts } from '../funcs.js';
|
|
22
|
+
let MCPHTTPExpressProtocolRequestHandlerBuilder = class MCPHTTPExpressProtocolRequestHandlerBuilder {
|
|
23
|
+
logger;
|
|
24
|
+
productManifest;
|
|
25
|
+
serverRequestChecker;
|
|
26
|
+
serverRequestHandler;
|
|
27
|
+
wordingManager;
|
|
28
|
+
constructor(logger, productManifest, serverRequestChecker, serverRequestHandler, wordingManager) {
|
|
29
|
+
this.logger = logger;
|
|
30
|
+
this.productManifest = productManifest;
|
|
31
|
+
this.serverRequestChecker = serverRequestChecker;
|
|
32
|
+
this.serverRequestHandler = serverRequestHandler;
|
|
33
|
+
this.wordingManager = wordingManager;
|
|
34
|
+
}
|
|
35
|
+
exec({ ucs, ucManager, }) {
|
|
36
|
+
return async (req, res) => {
|
|
37
|
+
const { status } = await this.serverRequestChecker.exec({
|
|
38
|
+
req: toReq(req),
|
|
39
|
+
});
|
|
40
|
+
if (status) {
|
|
41
|
+
res.status(status).json({});
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const server = init(this.productManifest);
|
|
45
|
+
const transport = new StreamableHTTPServerTransport();
|
|
46
|
+
// In Streamable HTTP, there is usually one request => one transport => one server.
|
|
47
|
+
// So there shouldn't be multiple 'stream' use cases invoked at the same time.
|
|
48
|
+
// But maintaining a Map allows us to handle this case if it occurs.
|
|
49
|
+
// This way, we have all the streams available to close them when the transport is closed.
|
|
50
|
+
const execOptss = new Map();
|
|
51
|
+
for (const uc of ucs) {
|
|
52
|
+
const { def: { ext }, } = uc;
|
|
53
|
+
const mountingPoint = ext?.cmd?.mountAt ?? ucMountingPoint(uc);
|
|
54
|
+
const wording = this.wordingManager.uc(uc.def);
|
|
55
|
+
const config = toolConfig(uc, 'server', wording);
|
|
56
|
+
const transportType = ext?.http?.transportType ?? 'standard';
|
|
57
|
+
server.registerTool(mountingPoint, config, (input, extra) => {
|
|
58
|
+
const execOpts = ucStreamExecOpts(this.logger, transportType, extra);
|
|
59
|
+
if (execOpts) {
|
|
60
|
+
execOptss.set(mountingPoint, execOpts);
|
|
61
|
+
}
|
|
62
|
+
return this.serverRequestHandler.exec({
|
|
63
|
+
appManifest: uc.appManifest,
|
|
64
|
+
envelope: 'json',
|
|
65
|
+
execOpts,
|
|
66
|
+
req: {
|
|
67
|
+
...toReq(req),
|
|
68
|
+
bodyFromJSON: async () => input,
|
|
69
|
+
},
|
|
70
|
+
res: toRes(res),
|
|
71
|
+
ucd: uc.def,
|
|
72
|
+
ucManager,
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
transport.onclose = async () => {
|
|
77
|
+
this.logger.trace('Transport closed => closing streams');
|
|
78
|
+
await Promise.all(execOptss.values().map((eo) => eo.stream?.onClose()));
|
|
79
|
+
};
|
|
80
|
+
res.on('close', async () => {
|
|
81
|
+
this.logger.trace('Connection closed => closing transport');
|
|
82
|
+
await transport.close();
|
|
83
|
+
});
|
|
84
|
+
await server.connect(transport);
|
|
85
|
+
await transport.handleRequest(req, res, req.body);
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
MCPHTTPExpressProtocolRequestHandlerBuilder = __decorate([
|
|
90
|
+
injectable(),
|
|
91
|
+
__param(0, inject('Logger')),
|
|
92
|
+
__param(1, inject('ProductManifest')),
|
|
93
|
+
__param(2, inject(MCPServerRequestChecker)),
|
|
94
|
+
__param(3, inject(MCPServerRequestHandler)),
|
|
95
|
+
__param(4, inject(WordingManager)),
|
|
96
|
+
__metadata("design:paramtypes", [Object, Object, MCPServerRequestChecker,
|
|
97
|
+
MCPServerRequestHandler,
|
|
98
|
+
WordingManager])
|
|
99
|
+
], MCPHTTPExpressProtocolRequestHandlerBuilder);
|
|
100
|
+
export { MCPHTTPExpressProtocolRequestHandlerBuilder };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
|
|
2
|
+
import type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
import type { TransportType } from '../../../../dt/index.js';
|
|
4
|
+
import type { Logger } from '../../../../std/index.js';
|
|
5
|
+
import type { UCManagerExecServerOpts, UCOPIBase } from '../../../../uc/index.js';
|
|
6
|
+
export declare function ucStreamExecOpts<OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(logger: Logger, transportType: TransportType, extra: RequestHandlerExtra<ServerRequest, ServerNotification>): UCManagerExecServerOpts<OPI0, OPI1> | undefined;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { defaultStreamOnClose } from '../../../../utils/index.js';
|
|
2
|
+
export function ucStreamExecOpts(logger, transportType, extra) {
|
|
3
|
+
let execOpts;
|
|
4
|
+
switch (transportType) {
|
|
5
|
+
case 'standard':
|
|
6
|
+
// Nothing to do
|
|
7
|
+
break;
|
|
8
|
+
case 'stream': {
|
|
9
|
+
let streamedOnce = false;
|
|
10
|
+
execOpts = {
|
|
11
|
+
stream: {
|
|
12
|
+
onClose: defaultStreamOnClose(streamedOnce),
|
|
13
|
+
onData: async (output) => {
|
|
14
|
+
logger.trace('execOpts.stream.onData', {
|
|
15
|
+
output: JSON.stringify(output),
|
|
16
|
+
});
|
|
17
|
+
streamedOnce = true;
|
|
18
|
+
if (!output) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
await extra.sendNotification({
|
|
23
|
+
method: 'notifications/message',
|
|
24
|
+
params: {
|
|
25
|
+
data: output,
|
|
26
|
+
level: 'info',
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
catch (_err) {
|
|
31
|
+
// There are cases where the client (e.g. Claude) has already closed the stream
|
|
32
|
+
// without triggering any lifecycle method (e.g `transport.onclose` or `c.req.raw.signal.addEventListener('abort')` with hono.
|
|
33
|
+
// Sending a notification in this case triggers an error like so : `No connection established for request ID: 1`.
|
|
34
|
+
// So we assume it's closed and force close the stream.
|
|
35
|
+
logger.trace('Connection already closed => force closing stream');
|
|
36
|
+
await execOpts?.stream?.onClose();
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
onDone: async () => {
|
|
40
|
+
logger.trace('execOpts.stream.onDone');
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
default:
|
|
47
|
+
transportType;
|
|
48
|
+
}
|
|
49
|
+
return execOpts;
|
|
50
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { injectable } from 'inversify';
|
|
8
|
+
let MCPHTTPHonoFakeRequestHandlerBuilder = class MCPHTTPHonoFakeRequestHandlerBuilder {
|
|
9
|
+
exec() {
|
|
10
|
+
return async (c) => {
|
|
11
|
+
return c.json({}, 200);
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
MCPHTTPHonoFakeRequestHandlerBuilder = __decorate([
|
|
16
|
+
injectable()
|
|
17
|
+
], MCPHTTPHonoFakeRequestHandlerBuilder);
|
|
18
|
+
export { MCPHTTPHonoFakeRequestHandlerBuilder };
|
package/dist/esm/target/lib/mcp-server/http/hono/MCPHTTPHonoProtocolRequestHandlerBuilder.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { MiddlewareHandler } from 'hono';
|
|
2
|
+
import { WordingManager } from '../../../../../i18n/index.js';
|
|
3
|
+
import type { ProductManifest } from '../../../../../product/index.js';
|
|
4
|
+
import type { Logger } from '../../../../../std/index.js';
|
|
5
|
+
import { MCPServerRequestChecker } from '../../MCPServerRequestChecker.js';
|
|
6
|
+
import { MCPServerRequestHandler } from '../../MCPServerRequestHandler.js';
|
|
7
|
+
import type { MCPHTTPRequestHandlerBuilderInput } from '../MCPHTTPRequestHandlerBuilder.js';
|
|
8
|
+
import type { MCPHTTPHonoRequestHandlerBuilder } from './types.js';
|
|
9
|
+
export declare class MCPHTTPHonoProtocolRequestHandlerBuilder implements MCPHTTPHonoRequestHandlerBuilder {
|
|
10
|
+
private logger;
|
|
11
|
+
private productManifest;
|
|
12
|
+
private serverRequestChecker;
|
|
13
|
+
private serverRequestHandler;
|
|
14
|
+
private wordingManager;
|
|
15
|
+
constructor(logger: Logger, productManifest: ProductManifest, serverRequestChecker: MCPServerRequestChecker, serverRequestHandler: MCPServerRequestHandler, wordingManager: WordingManager);
|
|
16
|
+
exec({ ucs, ucManager, }: MCPHTTPRequestHandlerBuilderInput): MiddlewareHandler;
|
|
17
|
+
}
|