libmodulor 0.29.0 → 0.30.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 +40 -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 +6 -6
- 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/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.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/products/Helper/i18n.d.ts +2 -0
- 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/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 +15 -0
- package/dist/esm/target/lib/mcp-server/http/express/MCPHTTPExpressProtocolRequestHandlerBuilder.js +88 -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 +15 -0
- package/dist/esm/target/lib/mcp-server/http/hono/MCPHTTPHonoProtocolRequestHandlerBuilder.js +88 -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/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/testing/impl/newNodeAppTester.js +5 -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/package.json +20 -9
- 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
|
@@ -0,0 +1,44 @@
|
|
|
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 { SettingsServerClientManager } from '../../../../std/impl/SettingsServerClientManager.js';
|
|
15
|
+
let MixedServerClientManager = class MixedServerClientManager {
|
|
16
|
+
authDataStore;
|
|
17
|
+
settingsServerClientManager;
|
|
18
|
+
constructor(authDataStore, settingsServerClientManager) {
|
|
19
|
+
this.authDataStore = authDataStore;
|
|
20
|
+
this.settingsServerClientManager = settingsServerClientManager;
|
|
21
|
+
}
|
|
22
|
+
async authApiKey(opts) {
|
|
23
|
+
return this.settingsServerClientManager.authApiKey(opts);
|
|
24
|
+
}
|
|
25
|
+
async authBasic(opts) {
|
|
26
|
+
return this.settingsServerClientManager.authBasic(opts);
|
|
27
|
+
}
|
|
28
|
+
async authJWT(_opts) {
|
|
29
|
+
return this.authDataStore.get();
|
|
30
|
+
}
|
|
31
|
+
async baseURL(opts) {
|
|
32
|
+
return this.settingsServerClientManager.baseURL(opts);
|
|
33
|
+
}
|
|
34
|
+
async publicApiKey(opts) {
|
|
35
|
+
return this.settingsServerClientManager.publicApiKey(opts);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
MixedServerClientManager = __decorate([
|
|
39
|
+
injectable(),
|
|
40
|
+
__param(0, inject('AuthDataStore')),
|
|
41
|
+
__param(1, inject(SettingsServerClientManager)),
|
|
42
|
+
__metadata("design:paramtypes", [Object, SettingsServerClientManager])
|
|
43
|
+
], MixedServerClientManager);
|
|
44
|
+
export { MixedServerClientManager };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { IllegalArgumentError, } from '../../../error/index.js';
|
|
2
|
+
export function serverErrorJsonSchema(message) {
|
|
3
|
+
return {
|
|
4
|
+
additionalProperties: false,
|
|
5
|
+
properties: {
|
|
6
|
+
message: {
|
|
7
|
+
examples: [message ?? new IllegalArgumentError().message],
|
|
8
|
+
type: 'string',
|
|
9
|
+
},
|
|
10
|
+
},
|
|
11
|
+
required: ['message'],
|
|
12
|
+
type: 'object',
|
|
13
|
+
};
|
|
14
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { DataType, JSONSchemaObject, JSONSchemaProperty } from '../../../dt/index.js';
|
|
2
|
+
import { type UC, type UCInput, type UCInputField, type UCInputUnwrapped, type UCOPIBase } from '../../../uc/index.js';
|
|
3
|
+
export interface UCInputFieldJsonSchemaDef<T extends DataType> {
|
|
4
|
+
/**
|
|
5
|
+
* Internal types that are not part of the spec
|
|
6
|
+
*/
|
|
7
|
+
internal?: {
|
|
8
|
+
required?: boolean;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Fields that are part of the spec
|
|
12
|
+
*/
|
|
13
|
+
spec?: JSONSchemaProperty<T>;
|
|
14
|
+
}
|
|
15
|
+
export declare function ucifJsonSchemaDef<T extends DataType>(field: UCInputField<T>): UCInputFieldJsonSchemaDef<T>;
|
|
16
|
+
export declare function ucInputJsonSchema<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(uc: UC<I, OPI0, OPI1>): JSONSchemaObject<UCInputUnwrapped<I>>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { ucifExamples, ucifIsMandatory, ucifRepeatability, } from '../../../uc/index.js';
|
|
2
|
+
export function ucifJsonSchemaDef(field) {
|
|
3
|
+
const def = {
|
|
4
|
+
internal: {},
|
|
5
|
+
spec: { type: 'string' },
|
|
6
|
+
};
|
|
7
|
+
if (!def.internal || !def.spec) {
|
|
8
|
+
// Just a guard to safely type the rest of the function without using !
|
|
9
|
+
return def;
|
|
10
|
+
}
|
|
11
|
+
const { def: fDef } = field;
|
|
12
|
+
const { type: fType } = fDef;
|
|
13
|
+
def.internal.required = ucifIsMandatory(fDef);
|
|
14
|
+
def.spec = fType.jsonSchemaType();
|
|
15
|
+
if (!def.internal.required && !Array.isArray(def.spec.type)) {
|
|
16
|
+
def.spec.type = [def.spec.type, 'null'];
|
|
17
|
+
}
|
|
18
|
+
const examples = ucifExamples(fDef);
|
|
19
|
+
if (examples) {
|
|
20
|
+
def.spec.examples = examples;
|
|
21
|
+
}
|
|
22
|
+
const options = fType.getOptions();
|
|
23
|
+
if (options) {
|
|
24
|
+
def.spec.enum = options.map((o) => o.value);
|
|
25
|
+
if (!def.internal.required) {
|
|
26
|
+
def.spec.enum.push(null);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const [isRepeatable] = ucifRepeatability(fDef);
|
|
30
|
+
if (isRepeatable) {
|
|
31
|
+
def.spec = {
|
|
32
|
+
items: def.spec,
|
|
33
|
+
type: def.internal.required ? 'array' : ['array', 'null'],
|
|
34
|
+
};
|
|
35
|
+
if (fDef.cardinality?.max !== undefined) {
|
|
36
|
+
def.spec.maxItems = fDef.cardinality?.max;
|
|
37
|
+
}
|
|
38
|
+
if (fDef.cardinality?.min !== undefined) {
|
|
39
|
+
def.spec.minItems = fDef.cardinality?.min;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return def;
|
|
43
|
+
}
|
|
44
|
+
export function ucInputJsonSchema(uc) {
|
|
45
|
+
const res = {
|
|
46
|
+
additionalProperties: false,
|
|
47
|
+
properties: {},
|
|
48
|
+
type: 'object',
|
|
49
|
+
};
|
|
50
|
+
for (const f of uc.inputFields) {
|
|
51
|
+
const { key } = f;
|
|
52
|
+
const { internal, spec } = ucifJsonSchemaDef(f);
|
|
53
|
+
if (!spec) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
const k = key;
|
|
57
|
+
res.properties[k] = spec;
|
|
58
|
+
if (!internal?.required) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (!res.required) {
|
|
62
|
+
res.required = [];
|
|
63
|
+
}
|
|
64
|
+
res.required.push(k);
|
|
65
|
+
}
|
|
66
|
+
return res;
|
|
67
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { DataType, JSONSchemaObject, JSONSchemaProperty } from '../../../dt/index.js';
|
|
2
|
+
import { type UC, type UCInput, type UCOPIBase, type UCOutput, UCOutputField, type UCOutputPart, type UCOutputPartDef } from '../../../uc/index.js';
|
|
3
|
+
export interface UCOutputFieldJsonSchemaDef<T extends DataType> {
|
|
4
|
+
/**
|
|
5
|
+
* Internal types that are not part of the spec
|
|
6
|
+
*/
|
|
7
|
+
internal?: {
|
|
8
|
+
required?: boolean;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Fields that are part of the spec
|
|
12
|
+
*/
|
|
13
|
+
spec?: JSONSchemaProperty<T>;
|
|
14
|
+
}
|
|
15
|
+
export declare function ucofJsonSchemaDef<OPI extends UCOPIBase, T extends DataType>(field: UCOutputField<OPI, T>): UCOutputFieldJsonSchemaDef<T>;
|
|
16
|
+
export declare function ucOPIJsonSchema<OPI extends UCOPIBase>(part: UCOutputPartDef<NonNullable<OPI>>): JSONSchemaObject<OPI>;
|
|
17
|
+
export declare function ucOutputPartJsonSchema<OPI extends UCOPIBase>(part: UCOutputPartDef<NonNullable<OPI>>): JSONSchemaObject<UCOutputPart<OPI>>;
|
|
18
|
+
export declare function ucOutputPartPaginationJsonSchema<OPI extends UCOPIBase>(): JSONSchemaObject<NonNullable<UCOutputPart<OPI>['pagination']>>;
|
|
19
|
+
export declare function ucOutputJsonSchema<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>(uc: UC<I, OPI0, OPI1>): JSONSchemaObject<UCOutput<OPI0, OPI1>> | null;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { UCOPIBaseDefFields, UCOutputField, ucofExamples, ucofIsMandatory, ucofRepeatability, } from '../../../uc/index.js';
|
|
2
|
+
export function ucofJsonSchemaDef(field) {
|
|
3
|
+
const def = {
|
|
4
|
+
internal: {},
|
|
5
|
+
spec: { type: 'string' },
|
|
6
|
+
};
|
|
7
|
+
if (!def.internal || !def.spec) {
|
|
8
|
+
// Just a guard to safely type the rest of the function without using !
|
|
9
|
+
return def;
|
|
10
|
+
}
|
|
11
|
+
const { def: fDef } = field;
|
|
12
|
+
const { type: fType } = fDef;
|
|
13
|
+
def.internal.required = ucofIsMandatory(fDef);
|
|
14
|
+
def.spec = fType.jsonSchemaType();
|
|
15
|
+
if (!def.internal.required && !Array.isArray(def.spec.type)) {
|
|
16
|
+
def.spec.type = [def.spec.type, 'null'];
|
|
17
|
+
}
|
|
18
|
+
const examples = ucofExamples(fDef);
|
|
19
|
+
if (examples) {
|
|
20
|
+
def.spec.examples = examples;
|
|
21
|
+
}
|
|
22
|
+
const options = fType.getOptions();
|
|
23
|
+
if (options) {
|
|
24
|
+
def.spec.enum = options.map((o) => o.value);
|
|
25
|
+
if (!def.internal.required) {
|
|
26
|
+
def.spec.enum.push(null);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const [isRepeatable] = ucofRepeatability(fDef);
|
|
30
|
+
if (isRepeatable) {
|
|
31
|
+
def.spec = {
|
|
32
|
+
items: def.spec,
|
|
33
|
+
type: def.internal.required ? 'array' : ['array', 'null'],
|
|
34
|
+
};
|
|
35
|
+
if (fDef.cardinality?.max !== undefined) {
|
|
36
|
+
def.spec.maxItems = fDef.cardinality?.max;
|
|
37
|
+
}
|
|
38
|
+
if (fDef.cardinality?.min !== undefined) {
|
|
39
|
+
def.spec.minItems = fDef.cardinality?.min;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return def;
|
|
43
|
+
}
|
|
44
|
+
export function ucOPIJsonSchema(part) {
|
|
45
|
+
const res = {
|
|
46
|
+
additionalProperties: false,
|
|
47
|
+
properties: {},
|
|
48
|
+
type: 'object',
|
|
49
|
+
};
|
|
50
|
+
const allFields = { ...UCOPIBaseDefFields, ...part.fields };
|
|
51
|
+
for (const entry of Object.entries(allFields)) {
|
|
52
|
+
const key = entry[0];
|
|
53
|
+
const fDef = entry[1];
|
|
54
|
+
const f = new UCOutputField(key, fDef);
|
|
55
|
+
const { internal, spec } = ucofJsonSchemaDef(f);
|
|
56
|
+
if (!spec) {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const k = key;
|
|
60
|
+
res.properties[k] = spec;
|
|
61
|
+
if (!internal?.required) {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (!res.required) {
|
|
65
|
+
res.required = [];
|
|
66
|
+
}
|
|
67
|
+
res.required.push(k);
|
|
68
|
+
}
|
|
69
|
+
return res;
|
|
70
|
+
}
|
|
71
|
+
export function ucOutputPartJsonSchema(part) {
|
|
72
|
+
return {
|
|
73
|
+
additionalProperties: false,
|
|
74
|
+
properties: {
|
|
75
|
+
items: {
|
|
76
|
+
items: ucOPIJsonSchema(part),
|
|
77
|
+
type: 'array',
|
|
78
|
+
},
|
|
79
|
+
pagination: ucOutputPartPaginationJsonSchema(),
|
|
80
|
+
total: { examples: [1], type: 'integer' },
|
|
81
|
+
},
|
|
82
|
+
required: ['items', 'total'],
|
|
83
|
+
type: 'object',
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
export function ucOutputPartPaginationJsonSchema() {
|
|
87
|
+
return {
|
|
88
|
+
additionalProperties: false,
|
|
89
|
+
properties: {
|
|
90
|
+
id: { format: 'uuid', type: 'string' },
|
|
91
|
+
limit: { type: 'integer' },
|
|
92
|
+
offset: { type: 'integer' },
|
|
93
|
+
q: { type: 'string' },
|
|
94
|
+
},
|
|
95
|
+
type: 'object',
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
export function ucOutputJsonSchema(uc) {
|
|
99
|
+
if (!uc.hasOutputParts()) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
const res = {
|
|
103
|
+
additionalProperties: false,
|
|
104
|
+
properties: {},
|
|
105
|
+
type: 'object',
|
|
106
|
+
};
|
|
107
|
+
const part0 = uc.def.io.o?.parts?._0;
|
|
108
|
+
if (!part0) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
res.properties.parts = {
|
|
112
|
+
additionalProperties: false,
|
|
113
|
+
properties: {
|
|
114
|
+
_0: ucOutputPartJsonSchema(part0),
|
|
115
|
+
},
|
|
116
|
+
required: ['_0'],
|
|
117
|
+
type: 'object',
|
|
118
|
+
};
|
|
119
|
+
const part1 = uc.def.io.o?.parts?._1;
|
|
120
|
+
if (!part1) {
|
|
121
|
+
return res;
|
|
122
|
+
}
|
|
123
|
+
res.properties.parts.properties = {
|
|
124
|
+
_1: ucOutputPartJsonSchema(part1),
|
|
125
|
+
};
|
|
126
|
+
res.properties.parts.required?.push('_1');
|
|
127
|
+
return res;
|
|
128
|
+
}
|
|
@@ -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,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,15 @@
|
|
|
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 { MCPServerRequestHandler } from '../../MCPServerRequestHandler.js';
|
|
6
|
+
import type { MCPHTTPRequestHandlerBuilderInput } from '../MCPHTTPRequestHandlerBuilder.js';
|
|
7
|
+
import type { MCPHTTPExpressRequestHandlerBuilder } from './types.js';
|
|
8
|
+
export declare class MCPHTTPExpressProtocolRequestHandlerBuilder implements MCPHTTPExpressRequestHandlerBuilder {
|
|
9
|
+
private logger;
|
|
10
|
+
private productManifest;
|
|
11
|
+
private serverRequestHandler;
|
|
12
|
+
private wordingManager;
|
|
13
|
+
constructor(logger: Logger, productManifest: ProductManifest, serverRequestHandler: MCPServerRequestHandler, wordingManager: WordingManager);
|
|
14
|
+
exec({ ucs, ucManager, }: MCPHTTPRequestHandlerBuilderInput): RequestHandler;
|
|
15
|
+
}
|