@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.
- package/bin/mcp-server.js +133 -11
- package/bin/mcp-server.js.map +8 -7
- package/esm/src/hooks/registration.d.ts.map +1 -1
- package/esm/src/hooks/registration.js +6 -0
- package/esm/src/hooks/registration.js.map +1 -1
- package/esm/src/hooks/version-check-hook.d.ts +11 -0
- package/esm/src/hooks/version-check-hook.d.ts.map +1 -0
- package/esm/src/hooks/version-check-hook.js +147 -0
- package/esm/src/hooks/version-check-hook.js.map +1 -0
- package/esm/src/lib/config.d.ts +2 -2
- package/esm/src/lib/config.js +2 -2
- package/esm/src/mcp-server/mcp-server.js +1 -1
- package/esm/src/mcp-server/server.js +1 -1
- package/manifest.json +1 -1
- package/package.json +1 -1
- package/src/hooks/registration.ts +7 -0
- package/src/hooks/version-check-hook.ts +168 -0
- package/src/lib/config.ts +2 -2
- package/src/mcp-server/mcp-server.ts +1 -1
- package/src/mcp-server/server.ts +1 -1
|
@@ -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;
|
|
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;
|
|
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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"}
|
package/esm/src/lib/config.d.ts
CHANGED
|
@@ -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.
|
|
53
|
+
readonly sdkVersion: "1.0.3";
|
|
54
54
|
readonly genVersion: "2.723.8";
|
|
55
|
-
readonly userAgent: "speakeasy-sdk/mcp-typescript 1.0.
|
|
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
|
package/esm/src/lib/config.js
CHANGED
|
@@ -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.
|
|
42
|
+
sdkVersion: "1.0.3",
|
|
43
43
|
genVersion: "2.723.8",
|
|
44
|
-
userAgent: "speakeasy-sdk/mcp-typescript 1.0.
|
|
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
|
|
@@ -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.
|
|
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.
|
|
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
|
@@ -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.
|
|
85
|
+
sdkVersion: "1.0.3",
|
|
86
86
|
genVersion: "2.723.8",
|
|
87
87
|
userAgent:
|
|
88
|
-
"speakeasy-sdk/mcp-typescript 1.0.
|
|
88
|
+
"speakeasy-sdk/mcp-typescript 1.0.3 2.723.8 1.0.0 @egain/egain-mcp-server",
|
|
89
89
|
} as const;
|