@egain/egain-mcp-server 1.0.1 → 1.0.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../../../src/hooks/registration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAYnC,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,QA8BrC"}
1
+ {"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../../../src/hooks/registration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAanC,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,QAoCrC"}
@@ -2,6 +2,7 @@ import { AuthenticationHook } from "./auth-hook.js";
2
2
  import { PortalCacheHook } from "./portal-cache-hook.js";
3
3
  import { PortalLookupHook } from "./portal-lookup-hook.js";
4
4
  import { ServerRoutingHook } from "./server-routing-hook.js";
5
+ import { VersionCheckHook } from "./version-check-hook.js";
5
6
  /*
6
7
  * This file is only ever generated once on the first generation and then is free to be modified.
7
8
  * Any hooks you wish to add should be registered in the initHooks function. Feel free to define them
@@ -9,6 +10,11 @@ import { ServerRoutingHook } from "./server-routing-hook.js";
9
10
  */
10
11
  export function initHooks(hooks) {
11
12
  console.error('🚀 Initializing eGain MCP hooks...');
13
+ // 0. Version Check Hook - checks for updates from npm
14
+ // Register this FIRST so users see update notifications early
15
+ const versionCheckHook = new VersionCheckHook();
16
+ hooks.registerSDKInitHook(versionCheckHook);
17
+ console.error('✅ VERSION: Registered version check hook for SDK init');
12
18
  // 1. Server Routing Hook - routes operations to correct API server
13
19
  // Register this FIRST before request creation so URLs are correct from the start
14
20
  const serverRoutingHook = new ServerRoutingHook();
@@ -1 +1 @@
1
- {"version":3,"file":"registration.js","sourceRoot":"","sources":["../../../src/hooks/registration.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D;;;;GAIG;AAEH,MAAM,UAAU,SAAS,CAAC,KAAY;IACpC,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAEpD,mEAAmE;IACnE,iFAAiF;IACjF,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAClD,KAAK,CAAC,+BAA+B,CAAC,iBAAiB,CAAC,CAAC;IACzD,OAAO,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;IAErF,sEAAsE;IACtE,iDAAiD;IACjD,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAC9C,KAAK,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC,CAAC,8BAA8B;IAC1E,KAAK,CAAC,+BAA+B,CAAC,eAAe,CAAC,CAAC,CAAC,mCAAmC;IAC3F,OAAO,CAAC,KAAK,CAAC,8EAA8E,CAAC,CAAC;IAE9F,oEAAoE;IACpE,qFAAqF;IACrF,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CAAC,eAAe,CAAC,CAAC;IACzD,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACpC,KAAK,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC,CAAC,uCAAuC;IAClF,OAAO,CAAC,KAAK,CAAC,wEAAwE,CAAC,CAAC;IAExF,qEAAqE;IACrE,gEAAgE;IAChE,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAC/D,KAAK,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,CAAC,CAAC,mCAAmC;IACtF,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAE5E,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;AACnE,CAAC"}
1
+ {"version":3,"file":"registration.js","sourceRoot":"","sources":["../../../src/hooks/registration.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D;;;;GAIG;AAEH,MAAM,UAAU,SAAS,CAAC,KAAY;IACpC,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAEpD,sDAAsD;IACtD,8DAA8D;IAC9D,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAChD,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IAC5C,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAEvE,mEAAmE;IACnE,iFAAiF;IACjF,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAClD,KAAK,CAAC,+BAA+B,CAAC,iBAAiB,CAAC,CAAC;IACzD,OAAO,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;IAErF,sEAAsE;IACtE,iDAAiD;IACjD,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAC9C,KAAK,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC,CAAC,8BAA8B;IAC1E,KAAK,CAAC,+BAA+B,CAAC,eAAe,CAAC,CAAC,CAAC,mCAAmC;IAC3F,OAAO,CAAC,KAAK,CAAC,8EAA8E,CAAC,CAAC;IAE9F,oEAAoE;IACpE,qFAAqF;IACrF,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CAAC,eAAe,CAAC,CAAC;IACzD,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACpC,KAAK,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC,CAAC,uCAAuC;IAClF,OAAO,CAAC,KAAK,CAAC,wEAAwE,CAAC,CAAC;IAExF,qEAAqE;IACrE,gEAAgE;IAChE,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAC/D,KAAK,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,CAAC,CAAC,mCAAmC;IACtF,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAE5E,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;AACnE,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Version Check Hook for eGain MCP Server
3
+ * Checks for updates by comparing local version with latest version on npm
4
+ */
5
+ import { SDKInitHook } from "./types.js";
6
+ import { SDKOptions } from "../lib/config.js";
7
+ export declare class VersionCheckHook implements SDKInitHook {
8
+ private checkPerformed;
9
+ sdkInit(opts: SDKOptions): SDKOptions;
10
+ }
11
+ //# sourceMappingURL=version-check-hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-check-hook.d.ts","sourceRoot":"","sources":["../../../src/hooks/version-check-hook.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAmG9C,qBAAa,gBAAiB,YAAW,WAAW;IAClD,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU;CA0DtC"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Version Check Hook for eGain MCP Server
3
+ * Checks for updates by comparing local version with latest version on npm
4
+ */
5
+ import * as fs from "fs";
6
+ import * as path from "path";
7
+ import { fileURLToPath } from 'url';
8
+ // ES module __dirname equivalent
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = path.dirname(__filename);
11
+ // Get the project root directory by finding package.json
12
+ const getProjectRoot = () => {
13
+ // Start from current directory and walk up until we find package.json
14
+ let currentDir = __dirname;
15
+ while (currentDir !== path.dirname(currentDir)) { // Stop at filesystem root
16
+ if (fs.existsSync(path.join(currentDir, 'package.json'))) {
17
+ return currentDir;
18
+ }
19
+ currentDir = path.dirname(currentDir);
20
+ }
21
+ // If package.json not found, use current working directory as fallback
22
+ return process.cwd();
23
+ };
24
+ /**
25
+ * Compare two semantic version strings
26
+ * Returns: 1 if v1 > v2, -1 if v1 < v2, 0 if equal
27
+ */
28
+ function compareVersions(v1, v2) {
29
+ const parts1 = v1.split('.').map(Number);
30
+ const parts2 = v2.split('.').map(Number);
31
+ for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
32
+ const part1 = parts1[i] || 0;
33
+ const part2 = parts2[i] || 0;
34
+ if (part1 > part2)
35
+ return 1;
36
+ if (part1 < part2)
37
+ return -1;
38
+ }
39
+ return 0;
40
+ }
41
+ /**
42
+ * Check if we're running from a git repository
43
+ */
44
+ function isGitRepo(projectRoot) {
45
+ try {
46
+ const gitDir = path.join(projectRoot, '.git');
47
+ return fs.existsSync(gitDir) || fs.existsSync(path.join(projectRoot, '.git', 'HEAD'));
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ }
53
+ /**
54
+ * Get local version from package.json
55
+ */
56
+ function getLocalVersion() {
57
+ try {
58
+ const projectRoot = getProjectRoot();
59
+ const packageJsonPath = path.join(projectRoot, 'package.json');
60
+ if (fs.existsSync(packageJsonPath)) {
61
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
62
+ return packageJson.version || null;
63
+ }
64
+ }
65
+ catch (error) {
66
+ console.error('⚠️ Could not read local version:', error);
67
+ }
68
+ return null;
69
+ }
70
+ /**
71
+ * Fetch latest version from npm registry
72
+ */
73
+ async function getLatestVersion() {
74
+ try {
75
+ const packageName = '@egain/egain-mcp-server';
76
+ const registryUrl = `https://registry.npmjs.org/${packageName}`;
77
+ const response = await fetch(registryUrl, {
78
+ headers: {
79
+ 'Accept': 'application/json',
80
+ },
81
+ });
82
+ if (!response.ok) {
83
+ throw new Error(`npm registry returned ${response.status}`);
84
+ }
85
+ const data = await response.json();
86
+ return data['dist-tags']?.latest || null;
87
+ }
88
+ catch (error) {
89
+ // Silently fail - network issues shouldn't block initialization
90
+ return null;
91
+ }
92
+ }
93
+ export class VersionCheckHook {
94
+ checkPerformed = false;
95
+ sdkInit(opts) {
96
+ // Only check once per SDK initialization
97
+ if (this.checkPerformed) {
98
+ return opts;
99
+ }
100
+ this.checkPerformed = true;
101
+ // Perform version check asynchronously (non-blocking)
102
+ setImmediate(async () => {
103
+ try {
104
+ const localVersion = getLocalVersion();
105
+ if (!localVersion) {
106
+ console.error('⚠️ Could not determine local version');
107
+ return;
108
+ }
109
+ console.error(`📦 Checking for updates (current version: ${localVersion})...`);
110
+ const latestVersion = await getLatestVersion();
111
+ if (!latestVersion) {
112
+ // Silently fail - network issues shouldn't be noisy
113
+ return;
114
+ }
115
+ if (compareVersions(latestVersion, localVersion) > 0) {
116
+ const projectRoot = getProjectRoot();
117
+ const isGit = isGitRepo(projectRoot);
118
+ console.error('');
119
+ console.error('⚠️ UPDATE AVAILABLE');
120
+ console.error(` Current version: ${localVersion}`);
121
+ console.error(` Latest version: ${latestVersion}`);
122
+ if (isGit) {
123
+ console.error(` Update with: git pull && npm run build`);
124
+ console.error(` Or visit: https://github.com/eGain/egain-mcp-server`);
125
+ }
126
+ else {
127
+ console.error(` Update with: npm install -g @egain/egain-mcp-server@latest`);
128
+ console.error(` Or visit: https://www.npmjs.com/package/@egain/egain-mcp-server`);
129
+ }
130
+ console.error('');
131
+ }
132
+ else {
133
+ console.error(`✅ You are running the latest version (${localVersion})`);
134
+ }
135
+ }
136
+ catch (error) {
137
+ // Silently fail - version check shouldn't break initialization
138
+ // Only log if it's a non-network error
139
+ if (error instanceof Error && !error.message.includes('fetch')) {
140
+ console.error('⚠️ Version check failed:', error.message);
141
+ }
142
+ }
143
+ });
144
+ return opts;
145
+ }
146
+ }
147
+ //# sourceMappingURL=version-check-hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-check-hook.js","sourceRoot":"","sources":["../../../src/hooks/version-check-hook.ts"],"names":[],"mappings":"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"}
@@ -50,8 +50,8 @@ export declare function serverURLFromOptions(options: SDKOptions): URL | null;
50
50
  export declare const SDK_METADATA: {
51
51
  readonly language: "typescript";
52
52
  readonly openapiDocVersion: "1.0.0";
53
- readonly sdkVersion: "1.0.1";
53
+ readonly sdkVersion: "1.0.3";
54
54
  readonly genVersion: "2.723.8";
55
- readonly userAgent: "speakeasy-sdk/mcp-typescript 1.0.1 2.723.8 1.0.0 @egain/egain-mcp-server";
55
+ readonly userAgent: "speakeasy-sdk/mcp-typescript 1.0.3 2.723.8 1.0.0 @egain/egain-mcp-server";
56
56
  };
57
57
  //# sourceMappingURL=config.d.ts.map
@@ -39,8 +39,8 @@ export function serverURLFromOptions(options) {
39
39
  export const SDK_METADATA = {
40
40
  language: "typescript",
41
41
  openapiDocVersion: "1.0.0",
42
- sdkVersion: "1.0.1",
42
+ sdkVersion: "1.0.3",
43
43
  genVersion: "2.723.8",
44
- userAgent: "speakeasy-sdk/mcp-typescript 1.0.1 2.723.8 1.0.0 @egain/egain-mcp-server",
44
+ userAgent: "speakeasy-sdk/mcp-typescript 1.0.3 2.723.8 1.0.0 @egain/egain-mcp-server",
45
45
  };
46
46
  //# sourceMappingURL=config.js.map
@@ -16,7 +16,7 @@ const routes = buildRouteMap({
16
16
  export const app = buildApplication(routes, {
17
17
  name: "mcp",
18
18
  versionInfo: {
19
- currentVersion: "1.0.1",
19
+ currentVersion: "1.0.3",
20
20
  },
21
21
  });
22
22
  run(app, process.argv.slice(2), buildContext(process));
@@ -17,7 +17,7 @@ import { tool$querySearch } from "./tools/querySearch.js";
17
17
  export function createMCPServer(deps) {
18
18
  const server = new McpServer({
19
19
  name: "EgainMcp",
20
- version: "1.0.1",
20
+ version: "1.0.3",
21
21
  });
22
22
  const getClient = deps.getSDK || (() => new EgainMcpCore({
23
23
  security: deps.security,
package/manifest.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "dxt_version": "0.1",
3
3
  "name": "@egain/egain-mcp-server",
4
- "version": "1.0.1",
4
+ "version": "1.0.3",
5
5
  "description": "",
6
6
  "long_description": "eGain Portal, Retrieve, Search, Answers APIs: Enterprise knowledge APIs for managing portals, searching content, retrieving AI-powered answers, and accessing content chunks for custom integrations.",
7
7
  "author": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@egain/egain-mcp-server",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "author": "Emily Loh - eGain Corporation",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -3,6 +3,7 @@ import { AuthenticationHook } from "./auth-hook.js";
3
3
  import { PortalCacheHook } from "./portal-cache-hook.js";
4
4
  import { PortalLookupHook } from "./portal-lookup-hook.js";
5
5
  import { ServerRoutingHook } from "./server-routing-hook.js";
6
+ import { VersionCheckHook } from "./version-check-hook.js";
6
7
 
7
8
  /*
8
9
  * This file is only ever generated once on the first generation and then is free to be modified.
@@ -13,6 +14,12 @@ import { ServerRoutingHook } from "./server-routing-hook.js";
13
14
  export function initHooks(hooks: Hooks) {
14
15
  console.error('🚀 Initializing eGain MCP hooks...');
15
16
 
17
+ // 0. Version Check Hook - checks for updates from npm
18
+ // Register this FIRST so users see update notifications early
19
+ const versionCheckHook = new VersionCheckHook();
20
+ hooks.registerSDKInitHook(versionCheckHook);
21
+ console.error('✅ VERSION: Registered version check hook for SDK init');
22
+
16
23
  // 1. Server Routing Hook - routes operations to correct API server
17
24
  // Register this FIRST before request creation so URLs are correct from the start
18
25
  const serverRoutingHook = new ServerRoutingHook();
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Version Check Hook for eGain MCP Server
3
+ * Checks for updates by comparing local version with latest version on npm
4
+ */
5
+
6
+ import { SDKInitHook } from "./types.js";
7
+ import { SDKOptions } from "../lib/config.js";
8
+ import * as fs from "fs";
9
+ import * as path from "path";
10
+ import { fileURLToPath } from 'url';
11
+
12
+ // ES module __dirname equivalent
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = path.dirname(__filename);
15
+
16
+ // Get the project root directory by finding package.json
17
+ const getProjectRoot = (): string => {
18
+ // Start from current directory and walk up until we find package.json
19
+ let currentDir = __dirname;
20
+ while (currentDir !== path.dirname(currentDir)) { // Stop at filesystem root
21
+ if (fs.existsSync(path.join(currentDir, 'package.json'))) {
22
+ return currentDir;
23
+ }
24
+ currentDir = path.dirname(currentDir);
25
+ }
26
+ // If package.json not found, use current working directory as fallback
27
+ return process.cwd();
28
+ };
29
+
30
+ /**
31
+ * Compare two semantic version strings
32
+ * Returns: 1 if v1 > v2, -1 if v1 < v2, 0 if equal
33
+ */
34
+ function compareVersions(v1: string, v2: string): number {
35
+ const parts1 = v1.split('.').map(Number);
36
+ const parts2 = v2.split('.').map(Number);
37
+
38
+ for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
39
+ const part1 = parts1[i] || 0;
40
+ const part2 = parts2[i] || 0;
41
+
42
+ if (part1 > part2) return 1;
43
+ if (part1 < part2) return -1;
44
+ }
45
+
46
+ return 0;
47
+ }
48
+
49
+ /**
50
+ * Check if we're running from a git repository
51
+ */
52
+ function isGitRepo(projectRoot: string): boolean {
53
+ try {
54
+ const gitDir = path.join(projectRoot, '.git');
55
+ return fs.existsSync(gitDir) || fs.existsSync(path.join(projectRoot, '.git', 'HEAD'));
56
+ } catch {
57
+ return false;
58
+ }
59
+ }
60
+
61
+ /**
62
+ * Get local version from package.json
63
+ */
64
+ function getLocalVersion(): string | null {
65
+ try {
66
+ const projectRoot = getProjectRoot();
67
+ const packageJsonPath = path.join(projectRoot, 'package.json');
68
+
69
+ if (fs.existsSync(packageJsonPath)) {
70
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
71
+ return packageJson.version || null;
72
+ }
73
+ } catch (error) {
74
+ console.error('⚠️ Could not read local version:', error);
75
+ }
76
+
77
+ return null;
78
+ }
79
+
80
+ /**
81
+ * Fetch latest version from npm registry
82
+ */
83
+ async function getLatestVersion(): Promise<string | null> {
84
+ try {
85
+ const packageName = '@egain/egain-mcp-server';
86
+ const registryUrl = `https://registry.npmjs.org/${packageName}`;
87
+
88
+ const response = await fetch(registryUrl, {
89
+ headers: {
90
+ 'Accept': 'application/json',
91
+ },
92
+ });
93
+
94
+ if (!response.ok) {
95
+ throw new Error(`npm registry returned ${response.status}`);
96
+ }
97
+
98
+ const data = await response.json() as { 'dist-tags'?: { latest?: string } };
99
+ return data['dist-tags']?.latest || null;
100
+ } catch (error) {
101
+ // Silently fail - network issues shouldn't block initialization
102
+ return null;
103
+ }
104
+ }
105
+
106
+ export class VersionCheckHook implements SDKInitHook {
107
+ private checkPerformed = false;
108
+
109
+ sdkInit(opts: SDKOptions): SDKOptions {
110
+ // Only check once per SDK initialization
111
+ if (this.checkPerformed) {
112
+ return opts;
113
+ }
114
+
115
+ this.checkPerformed = true;
116
+
117
+ // Perform version check asynchronously (non-blocking)
118
+ setImmediate(async () => {
119
+ try {
120
+ const localVersion = getLocalVersion();
121
+
122
+ if (!localVersion) {
123
+ console.error('⚠️ Could not determine local version');
124
+ return;
125
+ }
126
+
127
+ console.error(`📦 Checking for updates (current version: ${localVersion})...`);
128
+
129
+ const latestVersion = await getLatestVersion();
130
+
131
+ if (!latestVersion) {
132
+ // Silently fail - network issues shouldn't be noisy
133
+ return;
134
+ }
135
+
136
+ if (compareVersions(latestVersion, localVersion) > 0) {
137
+ const projectRoot = getProjectRoot();
138
+ const isGit = isGitRepo(projectRoot);
139
+
140
+ console.error('');
141
+ console.error('⚠️ UPDATE AVAILABLE');
142
+ console.error(` Current version: ${localVersion}`);
143
+ console.error(` Latest version: ${latestVersion}`);
144
+
145
+ if (isGit) {
146
+ console.error(` Update with: git pull && npm run build`);
147
+ console.error(` Or visit: https://github.com/eGain/egain-mcp-server`);
148
+ } else {
149
+ console.error(` Update with: npm install -g @egain/egain-mcp-server@latest`);
150
+ console.error(` Or visit: https://www.npmjs.com/package/@egain/egain-mcp-server`);
151
+ }
152
+ console.error('');
153
+ } else {
154
+ console.error(`✅ You are running the latest version (${localVersion})`);
155
+ }
156
+ } catch (error) {
157
+ // Silently fail - version check shouldn't break initialization
158
+ // Only log if it's a non-network error
159
+ if (error instanceof Error && !error.message.includes('fetch')) {
160
+ console.error('⚠️ Version check failed:', error.message);
161
+ }
162
+ }
163
+ });
164
+
165
+ return opts;
166
+ }
167
+ }
168
+
package/src/lib/config.ts CHANGED
@@ -82,8 +82,8 @@ export function serverURLFromOptions(options: SDKOptions): URL | null {
82
82
  export const SDK_METADATA = {
83
83
  language: "typescript",
84
84
  openapiDocVersion: "1.0.0",
85
- sdkVersion: "1.0.1",
85
+ sdkVersion: "1.0.3",
86
86
  genVersion: "2.723.8",
87
87
  userAgent:
88
- "speakeasy-sdk/mcp-typescript 1.0.1 2.723.8 1.0.0 @egain/egain-mcp-server",
88
+ "speakeasy-sdk/mcp-typescript 1.0.3 2.723.8 1.0.0 @egain/egain-mcp-server",
89
89
  } as const;
@@ -19,7 +19,7 @@ const routes = buildRouteMap({
19
19
  export const app = buildApplication(routes, {
20
20
  name: "mcp",
21
21
  versionInfo: {
22
- currentVersion: "1.0.1",
22
+ currentVersion: "1.0.3",
23
23
  },
24
24
  });
25
25
 
@@ -34,7 +34,7 @@ export function createMCPServer(deps: {
34
34
  }) {
35
35
  const server = new McpServer({
36
36
  name: "EgainMcp",
37
- version: "1.0.1",
37
+ version: "1.0.3",
38
38
  });
39
39
 
40
40
  const getClient = deps.getSDK || (() =>