genexus-mcp 3.3.1 → 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.
@@ -235,21 +235,41 @@ async function probeGatewaySpawn() {
235
235
  });
236
236
  }
237
237
 
238
- function resolveMcpBaseUrl(cwd) {
238
+ function resolveMcpSmokeTarget(cwd) {
239
239
  const configPath = resolveConfigPathNoMutate(cwd);
240
240
  const fallback = 'http://127.0.0.1:5000/mcp';
241
- if (!configPath) return fallback;
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') return fallback;
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 baseUrl = resolveMcpBaseUrl(cwd);
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.1",
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": [
@@ -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.1": {
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.1": {
69
+ "GxMcp.Gateway/3.3.2": {
70
70
  "type": "project",
71
71
  "serviceable": false,
72
72
  "sha512": ""
Binary file
Binary file
@@ -1,19 +1,19 @@
1
1
  {
2
+ "GatewayMode": "stdio-isolated",
2
3
  "GeneXus": {
3
- "InstallationPath": "C:\\Program Files (x86)\\GeneXus\\GeneXus18",
4
- "WorkerExecutable": "worker\\\\GxMcp.Worker.exe"
4
+ "WorkerExecutable": "worker\\\\GxMcp.Worker.exe",
5
+ "InstallationPath": "C:\\Program Files (x86)\\GeneXus\\GeneXus18"
6
+ },
7
+ "Environment": {
8
+ "ResolutionPolicy": "strict"
5
9
  },
6
- "GatewayMode": "stdio-isolated",
7
- "ConfigSchemaVersion": 2,
8
10
  "Server": {
9
- "SessionIdleTimeoutMinutes": 10,
11
+ "McpStdio": true,
10
12
  "EmitStructuredContent": false,
11
13
  "HttpPort": 0,
12
- "WorkerIdleTimeoutMinutes": 5,
13
- "McpStdio": true,
14
- "TerseResponses": true
14
+ "TerseResponses": true,
15
+ "SessionIdleTimeoutMinutes": 10,
16
+ "WorkerIdleTimeoutMinutes": 5
15
17
  },
16
- "Environment": {
17
- "ResolutionPolicy": "strict"
18
- }
18
+ "ConfigSchemaVersion": 2
19
19
  }
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "schemaVersion": "gxmcp-release-manifest/1",
3
- "version": "3.3.1",
4
- "sourceCommit": "334159fa59789dca040f3b3be578a520ef10928d",
3
+ "version": "3.3.2",
4
+ "sourceCommit": "1196063f31a24e9615640855cc4b2023c217c9cf",
5
5
  "sourceCommitPolicy": "exact-tag",
6
- "generatedAtUtc": "2026-09-11T17:44:21.9875381Z",
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": "ad4b76c1840203c5a1484021d52361d173e0b2e06c0c7b1d9b5d78894e100f10"
24
+ "sha256": "485151f0264f6806d60f3452304e7a962d59efb75c8af065ec68ac88a94a7add"
25
25
  },
26
26
  {
27
27
  "path": "GxMcp.Gateway.exe",
28
28
  "size": 162304,
29
- "sha256": "90c2ea4c63d95d0c5377dc69b8365d8b8248fd0493aeeb9d244c4100b399c80d"
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": 3083264,
39
- "sha256": "876879949e6f6f687be2822352ab7d4746de8794dd59fa541134954ae17abdcd"
38
+ "size": 3086336,
39
+ "sha256": "da4cb5c66cdfa117ff1dfe271f0f7f5603b18dda70967afe2da5c433989443b1"
40
40
  }
41
41
  ]
42
42
  }
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "schemaVersion": "gxmcp-provenance/1",
3
- "version": "3.3.1",
4
- "sourceCommit": "334159fa59789dca040f3b3be578a520ef10928d",
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": "a0741a4b780bd14c0388cb43a09a1f95d1d348b8673907788749108d2f96e144"
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": "8cae436c7d7f139645cc26ed9b232fe29b75fb35bcd29cc2c05f22937d26f6a3"
17
+ "sha256": "4899762362b2c5c5f2f9892578a824b85f0097e3c5f621cfb29fdc272951dfaa"
18
18
  }
19
19
  ]
20
20
  }
Binary file