genexus-mcp 3.3.0 → 3.3.2
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/cli/commands/axi.js +32 -7
- package/cli/run.test.js +21 -2
- package/package.json +5 -3
- package/publish/GxMcp.Gateway.deps.json +2 -2
- package/publish/GxMcp.Gateway.dll +0 -0
- package/publish/GxMcp.Gateway.exe +0 -0
- package/publish/config.json +10 -10
- package/publish/gxmcp-manifest.json +7 -7
- package/publish/gxmcp-sbom.json +4 -4
- package/publish/worker/GxMcp.Worker.exe +0 -0
package/cli/commands/axi.js
CHANGED
|
@@ -235,21 +235,41 @@ async function probeGatewaySpawn() {
|
|
|
235
235
|
});
|
|
236
236
|
}
|
|
237
237
|
|
|
238
|
-
function
|
|
238
|
+
function resolveMcpSmokeTarget(cwd) {
|
|
239
239
|
const configPath = resolveConfigPathNoMutate(cwd);
|
|
240
240
|
const fallback = 'http://127.0.0.1:5000/mcp';
|
|
241
|
-
if (!configPath)
|
|
241
|
+
if (!configPath) {
|
|
242
|
+
return { applicable: true, status: null, detail: null, baseUrl: fallback };
|
|
243
|
+
}
|
|
242
244
|
|
|
243
245
|
const cfg = readJsonFileSafe(configPath);
|
|
244
|
-
if (!cfg || typeof cfg !== 'object')
|
|
246
|
+
if (!cfg || typeof cfg !== 'object') {
|
|
247
|
+
return { applicable: true, status: null, detail: null, baseUrl: fallback };
|
|
248
|
+
}
|
|
245
249
|
|
|
246
250
|
const server = cfg.Server && typeof cfg.Server === 'object' ? cfg.Server : {};
|
|
251
|
+
const gatewayMode = typeof cfg.GatewayMode === 'string' ? cfg.GatewayMode.toLowerCase() : '';
|
|
252
|
+
const rawPort = server.HttpPort;
|
|
253
|
+
const parsedPort = typeof rawPort === 'number'
|
|
254
|
+
? rawPort
|
|
255
|
+
: Number.parseInt(String(rawPort ?? ''), 10);
|
|
256
|
+
const stdioRuntime = gatewayMode === 'stdio-isolated'
|
|
257
|
+
|| gatewayMode === 'stdio'
|
|
258
|
+
|| (server.McpStdio === true && (!Number.isFinite(parsedPort) || parsedPort <= 0));
|
|
259
|
+
if (stdioRuntime) {
|
|
260
|
+
return {
|
|
261
|
+
applicable: false,
|
|
262
|
+
status: 'not_applicable',
|
|
263
|
+
detail: `MCP HTTP smoke skipped: ${gatewayMode || 'stdio'} runtime has no HTTP listener.`,
|
|
264
|
+
baseUrl: null
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
|
|
247
268
|
const host = server.BindAddress && typeof server.BindAddress === 'string'
|
|
248
269
|
? server.BindAddress
|
|
249
270
|
: '127.0.0.1';
|
|
250
|
-
const parsedPort = Number.parseInt(String(server.HttpPort || ''), 10);
|
|
251
271
|
const port = Number.isFinite(parsedPort) && parsedPort > 0 ? parsedPort : 5000;
|
|
252
|
-
return `http://${host}:${port}/mcp
|
|
272
|
+
return { applicable: true, status: null, detail: null, baseUrl: `http://${host}:${port}/mcp` };
|
|
253
273
|
}
|
|
254
274
|
|
|
255
275
|
async function runMcpSmokeProbe(cwd) {
|
|
@@ -258,7 +278,11 @@ async function runMcpSmokeProbe(cwd) {
|
|
|
258
278
|
return { status: 'warn', detail: 'MCP smoke script is missing.' };
|
|
259
279
|
}
|
|
260
280
|
|
|
261
|
-
const
|
|
281
|
+
const target = resolveMcpSmokeTarget(cwd);
|
|
282
|
+
if (!target.applicable) {
|
|
283
|
+
return { status: target.status, detail: target.detail };
|
|
284
|
+
}
|
|
285
|
+
const baseUrl = target.baseUrl;
|
|
262
286
|
const shell = process.platform === 'win32' ? 'powershell' : 'pwsh';
|
|
263
287
|
const args = process.platform === 'win32'
|
|
264
288
|
? ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', scriptPath, '-BaseUrl', baseUrl]
|
|
@@ -793,7 +817,7 @@ async function handleDoctor(options, ctx) {
|
|
|
793
817
|
const summary = checks.reduce((acc, row) => {
|
|
794
818
|
acc[row.status] = (acc[row.status] || 0) + 1;
|
|
795
819
|
return acc;
|
|
796
|
-
}, { pass: 0, warn: 0, fail: 0 });
|
|
820
|
+
}, { pass: 0, warn: 0, fail: 0, not_applicable: 0 });
|
|
797
821
|
|
|
798
822
|
// Support bundle for handing off to support: doctor output + config (with paths
|
|
799
823
|
// anonymized by hash so we don't leak filesystem layout) + recent worker logs +
|
|
@@ -2608,5 +2632,6 @@ module.exports = {
|
|
|
2608
2632
|
handleHelp,
|
|
2609
2633
|
usageEnvelope,
|
|
2610
2634
|
operationalErrorEnvelope,
|
|
2635
|
+
resolveMcpSmokeTarget,
|
|
2611
2636
|
commandHelpMap
|
|
2612
2637
|
};
|
package/cli/run.test.js
CHANGED
|
@@ -25,7 +25,7 @@ const {
|
|
|
25
25
|
compareGeneXusKbAndInstallation,
|
|
26
26
|
patchClientConfig
|
|
27
27
|
} = require('./lib/config');
|
|
28
|
-
const { handleInit } = require('./commands/axi');
|
|
28
|
+
const { handleInit, resolveMcpSmokeTarget } = require('./commands/axi');
|
|
29
29
|
|
|
30
30
|
const cliPath = path.join(__dirname, 'run.js');
|
|
31
31
|
const testGxPath = fs.mkdtempSync(path.join(os.tmpdir(), 'genexus-mcp-gx-'));
|
|
@@ -911,7 +911,26 @@ test('doctor --mcp-smoke adds explicit mcp_smoke check', () => {
|
|
|
911
911
|
const parsed = JSON.parse(result.stdout);
|
|
912
912
|
const smoke = parsed.ok.checks.find((c) => c.id === 'mcp_smoke');
|
|
913
913
|
assert.ok(smoke);
|
|
914
|
-
assert.ok(['pass', 'warn', 'fail'].includes(smoke.status));
|
|
914
|
+
assert.ok(['pass', 'warn', 'fail', 'not_applicable'].includes(smoke.status));
|
|
915
|
+
});
|
|
916
|
+
|
|
917
|
+
test('doctor marks HTTP smoke not applicable for stdio-isolated runtime', () => {
|
|
918
|
+
const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'genexus-mcp-doctor-stdio-'));
|
|
919
|
+
const configPath = path.join(tempRoot, 'config.json');
|
|
920
|
+
fs.writeFileSync(configPath, JSON.stringify({
|
|
921
|
+
GatewayMode: 'stdio-isolated',
|
|
922
|
+
Server: { HttpPort: 0, McpStdio: true }
|
|
923
|
+
}));
|
|
924
|
+
|
|
925
|
+
try {
|
|
926
|
+
const target = resolveMcpSmokeTarget(tempRoot);
|
|
927
|
+
assert.equal(target.applicable, false);
|
|
928
|
+
assert.equal(target.status, 'not_applicable');
|
|
929
|
+
assert.equal(target.baseUrl, null);
|
|
930
|
+
assert.match(target.detail, /stdio-isolated|HTTP listener is disabled/);
|
|
931
|
+
} finally {
|
|
932
|
+
fs.rmSync(tempRoot, { recursive: true, force: true });
|
|
933
|
+
}
|
|
915
934
|
});
|
|
916
935
|
|
|
917
936
|
test('doctor reports a KB and SDK major mismatch', () => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "genexus-mcp",
|
|
3
|
-
"version": "3.3.
|
|
3
|
+
"version": "3.3.2",
|
|
4
4
|
"mcpName": "io.github.lennix1337/genexus",
|
|
5
5
|
"description": "GeneXus 17, GeneXus 18 MCP server — read, edit, and analyze Knowledge Base objects directly from Claude, Cursor, and other AI agents over the Model Context Protocol.",
|
|
6
6
|
"keywords": [
|
|
@@ -32,8 +32,10 @@
|
|
|
32
32
|
"automation"
|
|
33
33
|
],
|
|
34
34
|
"scripts": {
|
|
35
|
-
"test": "node --test cli/run.test.js cli/lib/client-adapters.test.js cli/docs.test.js",
|
|
36
|
-
"lint": "
|
|
35
|
+
"test": "node --test cli/run.test.js cli/lib/client-adapters.test.js cli/docs.test.js scripts/lint.test.js && npm run test:live-contract",
|
|
36
|
+
"lint": "node scripts/lint.js",
|
|
37
|
+
"test:live-contract": "pwsh -NoProfile -ExecutionPolicy Bypass -File scripts/tests/test-live.test.ps1",
|
|
38
|
+
"test:upstream-drift": "pwsh -NoProfile -ExecutionPolicy Bypass -File scripts/tests/test-upstream-drift.ps1",
|
|
37
39
|
"test:one": "node scripts/test-one.js",
|
|
38
40
|
"prepack": "node scripts/clean-package.js",
|
|
39
41
|
"postinstall": "node scripts/verify-install.js"
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"targets": {
|
|
8
8
|
".NETCoreApp,Version=v10.0": {},
|
|
9
9
|
".NETCoreApp,Version=v10.0/win-x64": {
|
|
10
|
-
"GxMcp.Gateway/3.3.
|
|
10
|
+
"GxMcp.Gateway/3.3.2": {
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"Newtonsoft.Json": "13.0.3",
|
|
13
13
|
"System.Management": "10.0.5",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
}
|
|
67
67
|
},
|
|
68
68
|
"libraries": {
|
|
69
|
-
"GxMcp.Gateway/3.3.
|
|
69
|
+
"GxMcp.Gateway/3.3.2": {
|
|
70
70
|
"type": "project",
|
|
71
71
|
"serviceable": false,
|
|
72
72
|
"sha512": ""
|
|
Binary file
|
|
Binary file
|
package/publish/config.json
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"GatewayMode": "stdio-isolated",
|
|
3
|
-
"Server": {
|
|
4
|
-
"EmitStructuredContent": false,
|
|
5
|
-
"McpStdio": true,
|
|
6
|
-
"WorkerIdleTimeoutMinutes": 5,
|
|
7
|
-
"TerseResponses": true,
|
|
8
|
-
"HttpPort": 0,
|
|
9
|
-
"SessionIdleTimeoutMinutes": 10
|
|
10
|
-
},
|
|
11
|
-
"ConfigSchemaVersion": 2,
|
|
12
3
|
"GeneXus": {
|
|
13
4
|
"WorkerExecutable": "worker\\\\GxMcp.Worker.exe",
|
|
14
5
|
"InstallationPath": "C:\\Program Files (x86)\\GeneXus\\GeneXus18"
|
|
15
6
|
},
|
|
16
7
|
"Environment": {
|
|
17
8
|
"ResolutionPolicy": "strict"
|
|
18
|
-
}
|
|
9
|
+
},
|
|
10
|
+
"Server": {
|
|
11
|
+
"McpStdio": true,
|
|
12
|
+
"EmitStructuredContent": false,
|
|
13
|
+
"HttpPort": 0,
|
|
14
|
+
"TerseResponses": true,
|
|
15
|
+
"SessionIdleTimeoutMinutes": 10,
|
|
16
|
+
"WorkerIdleTimeoutMinutes": 5
|
|
17
|
+
},
|
|
18
|
+
"ConfigSchemaVersion": 2
|
|
19
19
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "gxmcp-release-manifest/1",
|
|
3
|
-
"version": "3.3.
|
|
4
|
-
"sourceCommit": "
|
|
3
|
+
"version": "3.3.2",
|
|
4
|
+
"sourceCommit": "1196063f31a24e9615640855cc4b2023c217c9cf",
|
|
5
5
|
"sourceCommitPolicy": "exact-tag",
|
|
6
|
-
"generatedAtUtc": "2026-09-
|
|
6
|
+
"generatedAtUtc": "2026-09-11T19:28:01.8382135Z",
|
|
7
7
|
"runtime": {
|
|
8
8
|
"gateway": "net10.0-windows",
|
|
9
9
|
"worker": "net48-x86",
|
|
@@ -21,12 +21,12 @@
|
|
|
21
21
|
{
|
|
22
22
|
"path": "gxmcp-sbom.json",
|
|
23
23
|
"size": 590,
|
|
24
|
-
"sha256": "
|
|
24
|
+
"sha256": "485151f0264f6806d60f3452304e7a962d59efb75c8af065ec68ac88a94a7add"
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
"path": "GxMcp.Gateway.exe",
|
|
28
28
|
"size": 162304,
|
|
29
|
-
"sha256": "
|
|
29
|
+
"sha256": "2272c4ad133fe2600c7bdf88fa82d58bbb8acf993a38889016cd986bc5906b11"
|
|
30
30
|
},
|
|
31
31
|
{
|
|
32
32
|
"path": "tool_definitions.json",
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
},
|
|
36
36
|
{
|
|
37
37
|
"path": "worker/GxMcp.Worker.exe",
|
|
38
|
-
"size":
|
|
39
|
-
"sha256": "
|
|
38
|
+
"size": 3086336,
|
|
39
|
+
"sha256": "da4cb5c66cdfa117ff1dfe271f0f7f5603b18dda70967afe2da5c433989443b1"
|
|
40
40
|
}
|
|
41
41
|
]
|
|
42
42
|
}
|
package/publish/gxmcp-sbom.json
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "gxmcp-provenance/1",
|
|
3
|
-
"version": "3.3.
|
|
4
|
-
"sourceCommit": "
|
|
3
|
+
"version": "3.3.2",
|
|
4
|
+
"sourceCommit": "1196063f31a24e9615640855cc4b2023c217c9cf",
|
|
5
5
|
"sourceCommitPolicy": "exact-tag",
|
|
6
6
|
"components": [
|
|
7
7
|
{
|
|
8
8
|
"name": "genexus-mcp",
|
|
9
9
|
"lockfile": "package-lock.json",
|
|
10
10
|
"size": 39914,
|
|
11
|
-
"sha256": "
|
|
11
|
+
"sha256": "4a8fa8579a01a562f681e00c344de4b4b896af33ad87e6787a4a99c2ba059b05"
|
|
12
12
|
},
|
|
13
13
|
{
|
|
14
14
|
"name": "nexus-ide",
|
|
15
15
|
"lockfile": "src/nexus-ide/package-lock.json",
|
|
16
16
|
"size": 274983,
|
|
17
|
-
"sha256": "
|
|
17
|
+
"sha256": "4899762362b2c5c5f2f9892578a824b85f0097e3c5f621cfb29fdc272951dfaa"
|
|
18
18
|
}
|
|
19
19
|
]
|
|
20
20
|
}
|
|
Binary file
|