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
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "libmodulor",
|
|
3
3
|
"description": "A TypeScript library to create platform-agnostic applications",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.31.0",
|
|
5
5
|
"license": "LGPL-3.0",
|
|
6
6
|
"author": "Chafik H'nini <chafik.hnini@gmail.com>",
|
|
7
7
|
"homepage": "https://libmodulor.c100k.eu",
|
|
@@ -29,6 +29,9 @@
|
|
|
29
29
|
"./cloudflare-worker-hono": {
|
|
30
30
|
"import": "./dist/esm/index.cloudflare-worker-hono.js"
|
|
31
31
|
},
|
|
32
|
+
"./instrumentation-otl": {
|
|
33
|
+
"import": "./dist/esm/index.instrumentation-otl.js"
|
|
34
|
+
},
|
|
32
35
|
"./locales/de": {
|
|
33
36
|
"import": "./dist/esm/i18n/locales/de.js"
|
|
34
37
|
},
|
|
@@ -53,6 +56,12 @@
|
|
|
53
56
|
"./node-mcp": {
|
|
54
57
|
"import": "./dist/esm/index.node-mcp.js"
|
|
55
58
|
},
|
|
59
|
+
"./node-mcp-express": {
|
|
60
|
+
"import": "./dist/esm/index.node-mcp-express.js"
|
|
61
|
+
},
|
|
62
|
+
"./node-mcp-hono": {
|
|
63
|
+
"import": "./dist/esm/index.node-mcp-hono.js"
|
|
64
|
+
},
|
|
56
65
|
"./node-stricli-cli": {
|
|
57
66
|
"import": "./dist/esm/index.node-stricli-cli.js"
|
|
58
67
|
},
|
|
@@ -97,44 +106,59 @@
|
|
|
97
106
|
"test": "tsc && vitest run"
|
|
98
107
|
},
|
|
99
108
|
"devDependencies": {
|
|
100
|
-
"@
|
|
109
|
+
"@babel/core": "^7.29.7",
|
|
110
|
+
"@biomejs/biome": "^2.5.2",
|
|
111
|
+
"@opentelemetry/auto-instrumentations-node": "^0.77.0",
|
|
112
|
+
"@opentelemetry/exporter-trace-otlp-http": "^0.220.0",
|
|
113
|
+
"@opentelemetry/resources": "^2.9.0",
|
|
114
|
+
"@opentelemetry/sdk-node": "^0.220.0",
|
|
115
|
+
"@opentelemetry/semantic-conventions": "^1.41.1",
|
|
101
116
|
"@react-native-community/slider": "^4.5.7",
|
|
102
|
-
"@types/react": "^19.2.
|
|
117
|
+
"@types/react": "^19.2.17",
|
|
103
118
|
"@types/react-dom": "^19.2.3",
|
|
104
|
-
"babel-plugin-parameter-decorator": "^1.0.16",
|
|
105
119
|
"babel-plugin-transform-typescript-metadata": "^0.3.2",
|
|
106
|
-
"expo": "
|
|
107
|
-
"expo-document-picker": "
|
|
120
|
+
"expo": "^57.0.2",
|
|
121
|
+
"expo-document-picker": "^14.0.8",
|
|
108
122
|
"expo-image-picker": "^17.0.11",
|
|
109
|
-
"react-native-safe-area-context": "^5.
|
|
110
|
-
"wrangler": "^4.
|
|
123
|
+
"react-native-safe-area-context": "^5.8.0",
|
|
124
|
+
"wrangler": "^4.107.0",
|
|
125
|
+
"zod": "^4.4.3"
|
|
111
126
|
},
|
|
112
127
|
"peerDependencies": {
|
|
113
128
|
"@hono/node-server": "^1.19.14",
|
|
114
129
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
115
|
-
"@
|
|
130
|
+
"@opentelemetry/api": "^1.9.1",
|
|
131
|
+
"@opentelemetry/instrumentation": "^0.220.0",
|
|
132
|
+
"@stricli/core": "^1.2.9",
|
|
116
133
|
"buffer": "^6.0.3",
|
|
117
134
|
"cookie-parser": "^1.4.7",
|
|
118
135
|
"express": "^5.2.1",
|
|
119
136
|
"express-fileupload": "^1.5.2",
|
|
120
|
-
"fast-check": "^4.
|
|
121
|
-
"helmet": "^8.
|
|
122
|
-
"hono": "^4.12.
|
|
137
|
+
"fast-check": "^4.8.0",
|
|
138
|
+
"helmet": "^8.2.0",
|
|
139
|
+
"hono": "^4.12.28",
|
|
123
140
|
"inversify": "^7.11.0",
|
|
124
141
|
"jose": "^6.2.3",
|
|
125
|
-
"knex": "^3.
|
|
126
|
-
"next": "^15.5.
|
|
127
|
-
"pg": "^8.
|
|
128
|
-
"react": "19.2.
|
|
129
|
-
"react-dom": "19.2.
|
|
130
|
-
"react-native": "^0.
|
|
142
|
+
"knex": "^3.3.0",
|
|
143
|
+
"next": "^15.5.20",
|
|
144
|
+
"pg": "^8.22.0",
|
|
145
|
+
"react": "^19.2.7",
|
|
146
|
+
"react-dom": "^19.2.7",
|
|
147
|
+
"react-native": "^0.86.0",
|
|
131
148
|
"reflect-metadata": "^0.2.2",
|
|
132
149
|
"sqlite3": "^5.1.7",
|
|
133
150
|
"typescript": "^6.0.3",
|
|
134
|
-
"vite": "^
|
|
135
|
-
"vitest": "^
|
|
151
|
+
"vite": "^8.1.3",
|
|
152
|
+
"vitest": "^4.1.10",
|
|
153
|
+
"zod": "^4.4.3"
|
|
136
154
|
},
|
|
137
155
|
"peerDependenciesMeta": {
|
|
156
|
+
"@opentelemetry/api": {
|
|
157
|
+
"optional": true
|
|
158
|
+
},
|
|
159
|
+
"@opentelemetry/instrumentation": {
|
|
160
|
+
"optional": true
|
|
161
|
+
},
|
|
138
162
|
"@hono/node-server": {
|
|
139
163
|
"optional": true
|
|
140
164
|
},
|
|
@@ -194,6 +218,9 @@
|
|
|
194
218
|
},
|
|
195
219
|
"vitest": {
|
|
196
220
|
"optional": true
|
|
221
|
+
},
|
|
222
|
+
"zod": {
|
|
223
|
+
"optional": true
|
|
197
224
|
}
|
|
198
225
|
},
|
|
199
226
|
"sideEffects": false
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export const SUCCESS_DESCRIPTION = '🕺🏽';
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { DataType } from '../../../dt/index.js';
|
|
2
|
-
import { type UCInputField } from '../../../uc/index.js';
|
|
3
|
-
import type { OpenAPIProperty } from './types.js';
|
|
4
|
-
export interface OpenAPIInputDef<T extends DataType> {
|
|
5
|
-
/**
|
|
6
|
-
* Internal types that are not part of the spec
|
|
7
|
-
*/
|
|
8
|
-
internal?: {
|
|
9
|
-
required?: boolean;
|
|
10
|
-
};
|
|
11
|
-
/**
|
|
12
|
-
* Fields that are part of the spec
|
|
13
|
-
*/
|
|
14
|
-
spec?: OpenAPIProperty<T>;
|
|
15
|
-
}
|
|
16
|
-
export declare function openAPIInputDef<T extends DataType>(field: UCInputField<T>): OpenAPIInputDef<T>;
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { ucifExamples, ucifIsMandatory, ucifRepeatability, } from '../../../uc/index.js';
|
|
2
|
-
export function openAPIInputDef(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
|
-
const examples = ucifExamples(fDef);
|
|
16
|
-
if (examples) {
|
|
17
|
-
def.spec.examples = examples;
|
|
18
|
-
}
|
|
19
|
-
const options = fType.getOptions();
|
|
20
|
-
if (options) {
|
|
21
|
-
def.spec.enum = options.map((o) => o.value);
|
|
22
|
-
}
|
|
23
|
-
const [isRepeatable] = ucifRepeatability(fDef);
|
|
24
|
-
if (isRepeatable) {
|
|
25
|
-
def.spec = {
|
|
26
|
-
items: def.spec,
|
|
27
|
-
maxItems: fDef.cardinality?.max,
|
|
28
|
-
minItems: fDef.cardinality?.min,
|
|
29
|
-
type: 'array',
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
return def;
|
|
33
|
-
}
|
|
@@ -1,188 +0,0 @@
|
|
|
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 { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
14
|
-
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
15
|
-
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
16
|
-
import { inject, injectable } from 'inversify';
|
|
17
|
-
import { NotAvailableError } from '../../error/index.js';
|
|
18
|
-
import { WordingManager } from '../../i18n/index.js';
|
|
19
|
-
import { UCBuilder, ucifIsMandatory, ucMountingPoint, } from '../../uc/index.js';
|
|
20
|
-
import { DEFAULT_VERSION } from '../lib/shared.js';
|
|
21
|
-
import { propertyType, resError, resObj } from './funcs.js';
|
|
22
|
-
/**
|
|
23
|
-
* A simple MCP Server implementation
|
|
24
|
-
*
|
|
25
|
-
* Although it implements {@link ServerManager}, this implementation is not necessarily a "server".
|
|
26
|
-
* Indeed, it uses a local `Transport` so it must be considered the same as a {@link NodeCoreCLIManager}.
|
|
27
|
-
* Therefore, it calls `execClient` and not `execServer`.
|
|
28
|
-
* This way, Claude AI, or any other client is just a wrapper on top of it.
|
|
29
|
-
*
|
|
30
|
-
* @alpha This implementation still has lots of TODOs and has not been tested in real conditions. It needs to be stabilized before usage.
|
|
31
|
-
*/
|
|
32
|
-
let NodeLocalStdioMCPServerManager = class NodeLocalStdioMCPServerManager {
|
|
33
|
-
productManifest;
|
|
34
|
-
settingsManager;
|
|
35
|
-
ucBuilder;
|
|
36
|
-
ucManager;
|
|
37
|
-
wordingManager;
|
|
38
|
-
runtime;
|
|
39
|
-
transport;
|
|
40
|
-
appManifests;
|
|
41
|
-
tools;
|
|
42
|
-
constructor(productManifest, settingsManager, ucBuilder, ucManager, wordingManager) {
|
|
43
|
-
this.productManifest = productManifest;
|
|
44
|
-
this.settingsManager = settingsManager;
|
|
45
|
-
this.ucBuilder = ucBuilder;
|
|
46
|
-
this.ucManager = ucManager;
|
|
47
|
-
this.wordingManager = wordingManager;
|
|
48
|
-
this.appManifests = new Map();
|
|
49
|
-
this.tools = new Map();
|
|
50
|
-
}
|
|
51
|
-
s() {
|
|
52
|
-
return {
|
|
53
|
-
logger_level: this.settingsManager.get()('logger_level'),
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
overrideUCManager(ucManager) {
|
|
57
|
-
this.ucManager = ucManager;
|
|
58
|
-
}
|
|
59
|
-
async init() {
|
|
60
|
-
this.initCommon();
|
|
61
|
-
}
|
|
62
|
-
initSync() {
|
|
63
|
-
this.initCommon();
|
|
64
|
-
}
|
|
65
|
-
async mount(appManifest, ucd, contract) {
|
|
66
|
-
this.mountCommon(appManifest, ucd, contract);
|
|
67
|
-
}
|
|
68
|
-
mountSync(appManifest, ucd, contract) {
|
|
69
|
-
this.mountCommon(appManifest, ucd, contract);
|
|
70
|
-
}
|
|
71
|
-
async mountOpenAPISpec(_spec, _at) {
|
|
72
|
-
// Nothing to do
|
|
73
|
-
}
|
|
74
|
-
async mountStaticDir(_dirPath) {
|
|
75
|
-
throw new NotAvailableError('mountStaticDir');
|
|
76
|
-
}
|
|
77
|
-
async start() {
|
|
78
|
-
this.transport = new StdioServerTransport();
|
|
79
|
-
await this.runtime.connect(this.transport);
|
|
80
|
-
}
|
|
81
|
-
async stop() {
|
|
82
|
-
await this.runtime.close();
|
|
83
|
-
await this.transport.close();
|
|
84
|
-
}
|
|
85
|
-
async warmUp() {
|
|
86
|
-
this.runtime.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
87
|
-
return {
|
|
88
|
-
tools: [...this.tools.values().map((v) => v.tool)],
|
|
89
|
-
};
|
|
90
|
-
});
|
|
91
|
-
this.runtime.setRequestHandler(CallToolRequestSchema, async (request) => this.execRequest(request));
|
|
92
|
-
}
|
|
93
|
-
buildInputSchema(uc) {
|
|
94
|
-
const res = {
|
|
95
|
-
type: 'object',
|
|
96
|
-
};
|
|
97
|
-
if (!uc.hasInput()) {
|
|
98
|
-
return res;
|
|
99
|
-
}
|
|
100
|
-
res.properties = {};
|
|
101
|
-
for (const f of uc.inputFields) {
|
|
102
|
-
const { def, key } = f;
|
|
103
|
-
const { desc } = this.wordingManager.ucif(f);
|
|
104
|
-
res.properties[key] = {
|
|
105
|
-
...propertyType(def),
|
|
106
|
-
description: desc,
|
|
107
|
-
required: ucifIsMandatory(def),
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
return res;
|
|
111
|
-
}
|
|
112
|
-
async execRequest(request) {
|
|
113
|
-
const { name, arguments: args } = request.params;
|
|
114
|
-
// TODO : Check authentication in some way (see if MCP handles it)
|
|
115
|
-
const auth = null;
|
|
116
|
-
try {
|
|
117
|
-
const route = this.tools.get(name);
|
|
118
|
-
if (!route) {
|
|
119
|
-
throw new Error(`Unrecognized use case : ${name}`);
|
|
120
|
-
}
|
|
121
|
-
const { appName, ucd } = route;
|
|
122
|
-
const appManifest = this.appManifests.get(appName);
|
|
123
|
-
if (!appManifest) {
|
|
124
|
-
throw new Error(`Unrecognized app : ${appName}`);
|
|
125
|
-
}
|
|
126
|
-
const uc = this.ucBuilder.exec({
|
|
127
|
-
appManifest,
|
|
128
|
-
auth,
|
|
129
|
-
def: ucd,
|
|
130
|
-
});
|
|
131
|
-
if (args) {
|
|
132
|
-
// biome-ignore lint/suspicious/noExplicitAny: can be anything
|
|
133
|
-
uc.fill(args);
|
|
134
|
-
}
|
|
135
|
-
const confirmed = await this.ucManager.confirmClient(uc);
|
|
136
|
-
if (!confirmed) {
|
|
137
|
-
throw new Error('Ask for the user to confirm');
|
|
138
|
-
}
|
|
139
|
-
const ucor = await this.ucManager.execClient(uc);
|
|
140
|
-
return resObj(ucor);
|
|
141
|
-
}
|
|
142
|
-
catch (err) {
|
|
143
|
-
return resError(err);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
initCommon() {
|
|
147
|
-
const { name, version } = this.productManifest;
|
|
148
|
-
this.runtime = new Server({
|
|
149
|
-
name: name,
|
|
150
|
-
version: version ?? DEFAULT_VERSION,
|
|
151
|
-
}, {
|
|
152
|
-
capabilities: {
|
|
153
|
-
tools: {},
|
|
154
|
-
},
|
|
155
|
-
});
|
|
156
|
-
if (this.s().logger_level !== 'error') {
|
|
157
|
-
const message = 'Set the logging_level to "error" as MCP does not want the server to log to stdout (see https://modelcontextprotocol.io/docs/tools/debugging#implementing-logging)';
|
|
158
|
-
// Depending on the `Logger` implementation, this.logger.error() might not write to stderr (e.g. can write to a file).
|
|
159
|
-
// That's why we explicitly write to stdout by calling console.error().
|
|
160
|
-
// biome-ignore lint/suspicious/noConsole: we want it
|
|
161
|
-
console.error(new Error(message));
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
mountCommon(appManifest, ucd, _contract) {
|
|
165
|
-
const uc = this.ucBuilder.exec({
|
|
166
|
-
appManifest,
|
|
167
|
-
auth: null,
|
|
168
|
-
def: ucd,
|
|
169
|
-
});
|
|
170
|
-
if (!this.appManifests.has(appManifest.name)) {
|
|
171
|
-
this.appManifests.set(appManifest.name, appManifest);
|
|
172
|
-
}
|
|
173
|
-
const inputSchema = this.buildInputSchema(uc);
|
|
174
|
-
const mountingPoint = uc.def.ext?.cmd?.mountAt ?? ucMountingPoint(uc);
|
|
175
|
-
const tool = { inputSchema, name: mountingPoint };
|
|
176
|
-
this.tools.set(mountingPoint, { appName: appManifest.name, tool, ucd });
|
|
177
|
-
}
|
|
178
|
-
};
|
|
179
|
-
NodeLocalStdioMCPServerManager = __decorate([
|
|
180
|
-
injectable(),
|
|
181
|
-
__param(0, inject('ProductManifest')),
|
|
182
|
-
__param(1, inject('SettingsManager')),
|
|
183
|
-
__param(2, inject(UCBuilder)),
|
|
184
|
-
__param(3, inject('UCManager')),
|
|
185
|
-
__param(4, inject(WordingManager)),
|
|
186
|
-
__metadata("design:paramtypes", [Object, Object, UCBuilder, Object, WordingManager])
|
|
187
|
-
], NodeLocalStdioMCPServerManager);
|
|
188
|
-
export { NodeLocalStdioMCPServerManager };
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
-
import { type DataType } from '../../dt/index.js';
|
|
3
|
-
import { type UCInputFieldDef } from '../../uc/index.js';
|
|
4
|
-
import type { PropertyType } from './types.js';
|
|
5
|
-
export declare function propertyType<T extends DataType>(def: UCInputFieldDef<T>): PropertyType;
|
|
6
|
-
export declare function resError(err: Error): CallToolResult;
|
|
7
|
-
export declare function resObj<T>(obj: T): CallToolResult;
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { TBoolean, TEmbeddedObject, TInt, TNumber, } from '../../dt/index.js';
|
|
2
|
-
import { ucifRepeatability } from '../../uc/index.js';
|
|
3
|
-
export function propertyType(def) {
|
|
4
|
-
const { cardinality, type } = def;
|
|
5
|
-
let primitive = 'string';
|
|
6
|
-
if (type instanceof TBoolean) {
|
|
7
|
-
primitive = 'boolean';
|
|
8
|
-
}
|
|
9
|
-
else if (type instanceof TInt) {
|
|
10
|
-
primitive = 'integer';
|
|
11
|
-
}
|
|
12
|
-
else if (type instanceof TNumber) {
|
|
13
|
-
primitive = 'number';
|
|
14
|
-
}
|
|
15
|
-
else if (type instanceof TEmbeddedObject) {
|
|
16
|
-
primitive = 'object';
|
|
17
|
-
}
|
|
18
|
-
const [isRepeatable] = ucifRepeatability(def);
|
|
19
|
-
const maxItems = cardinality?.max;
|
|
20
|
-
const minItems = cardinality?.min;
|
|
21
|
-
return isRepeatable
|
|
22
|
-
? { items: { type: primitive }, maxItems, minItems, type: 'array' }
|
|
23
|
-
: { type: primitive };
|
|
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
|
-
{
|
|
40
|
-
text: JSON.stringify(obj),
|
|
41
|
-
type: 'text',
|
|
42
|
-
},
|
|
43
|
-
],
|
|
44
|
-
};
|
|
45
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { ListToolsResult } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
-
import type { UIntQuantity } from '../../dt/index.js';
|
|
3
|
-
export type PropertyPrimitiveType = 'boolean' | 'integer' | 'number' | 'object' | 'string';
|
|
4
|
-
export type PropertyArrayType<T extends PropertyPrimitiveType> = {
|
|
5
|
-
items: {
|
|
6
|
-
type: T;
|
|
7
|
-
};
|
|
8
|
-
maxItems?: UIntQuantity | undefined;
|
|
9
|
-
minItems?: UIntQuantity | undefined;
|
|
10
|
-
type: 'array';
|
|
11
|
-
};
|
|
12
|
-
export type PropertyType<T extends PropertyPrimitiveType = PropertyPrimitiveType> = {
|
|
13
|
-
type: T;
|
|
14
|
-
} | PropertyArrayType<T>;
|
|
15
|
-
export type Tool = ListToolsResult['tools'][0];
|
|
File without changes
|