hawkeye-mcp-server 2.2.0 → 2.3.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/README.md +82 -2
- package/build/config/config.d.ts +6 -1
- package/build/config/config.js +24 -5
- package/build/config/config.js.map +1 -1
- package/build/db/index.d.ts +51 -0
- package/build/db/index.js +174 -0
- package/build/db/index.js.map +1 -0
- package/build/db/postgres-state-provider.d.ts +52 -0
- package/build/db/postgres-state-provider.js +165 -0
- package/build/db/postgres-state-provider.js.map +1 -0
- package/build/index.d.ts +4 -1
- package/build/index.js +17 -84
- package/build/index.js.map +1 -1
- package/build/mcp-server-factory.d.ts +36 -0
- package/build/mcp-server-factory.js +92 -0
- package/build/mcp-server-factory.js.map +1 -0
- package/build/server.d.ts +9 -0
- package/build/server.js +337 -0
- package/build/server.js.map +1 -0
- package/build/services/auth.service.d.ts +38 -0
- package/build/services/auth.service.js +64 -0
- package/build/services/auth.service.js.map +1 -1
- package/build/services/project.service.d.ts +11 -0
- package/build/services/project.service.js +31 -0
- package/build/services/project.service.js.map +1 -1
- package/build/services/state.service.d.ts +115 -0
- package/build/services/state.service.js +172 -0
- package/build/services/state.service.js.map +1 -0
- package/build/tools/create-connection.d.ts +12 -0
- package/build/tools/create-connection.js +6 -0
- package/build/tools/create-connection.js.map +1 -1
- package/build/tools/create-manual-investigation.js +10 -6
- package/build/tools/create-manual-investigation.js.map +1 -1
- package/build/tools/get-connection-info.js +1 -0
- package/build/tools/get-connection-info.js.map +1 -1
- package/build/tools/get-session-link.js +1 -2
- package/build/tools/get-session-link.js.map +1 -1
- package/build/tools/get-status.js +2 -4
- package/build/tools/get-status.js.map +1 -1
- package/build/tools/index.js +11 -1
- package/build/tools/index.js.map +1 -1
- package/build/tools/inspect-session.js +1 -2
- package/build/tools/inspect-session.js.map +1 -1
- package/build/tools/list-connection-types.js +9 -0
- package/build/tools/list-connection-types.js.map +1 -1
- package/build/types/hawkeye.d.ts +7 -0
- package/build/types/hawkeye.js.map +1 -1
- package/build/utils/connection-builders.d.ts +8 -0
- package/build/utils/connection-builders.js +48 -1
- package/build/utils/connection-builders.js.map +1 -1
- package/build/utils/state.d.ts +24 -17
- package/build/utils/state.js +63 -72
- package/build/utils/state.js.map +1 -1
- package/package.json +12 -4
package/build/utils/state.d.ts
CHANGED
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* State management for persisting user preferences
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
|
+
* BACKWARDS COMPATIBILITY LAYER
|
|
5
|
+
* This file maintains the original StateManager API for existing code.
|
|
6
|
+
* It delegates to the new StateProvider abstraction which supports
|
|
7
|
+
* multiple backends (file-based for stdio, PostgreSQL for HTTP/SSE).
|
|
8
|
+
*
|
|
9
|
+
* For new code, prefer using StateProvider directly from '../services/state.service.js'
|
|
10
|
+
*/
|
|
11
|
+
import { StateProvider, StateData } from '../services/state.service.js';
|
|
12
|
+
/**
|
|
13
|
+
* StateManager - backwards compatible wrapper around StateProvider
|
|
14
|
+
* Maintains the original synchronous-looking API for existing code
|
|
15
|
+
*
|
|
16
|
+
* @deprecated For new code, use StateProvider from '../services/state.service.js'
|
|
4
17
|
*/
|
|
5
|
-
interface StateData {
|
|
6
|
-
defaultProjectUuid?: string;
|
|
7
|
-
baseUrl?: string;
|
|
8
|
-
}
|
|
9
18
|
export declare class StateManager {
|
|
10
|
-
private
|
|
11
|
-
|
|
12
|
-
constructor();
|
|
13
|
-
/**
|
|
14
|
-
* Load state from file
|
|
15
|
-
*/
|
|
16
|
-
private load;
|
|
17
|
-
/**
|
|
18
|
-
* Save state to file
|
|
19
|
-
*/
|
|
20
|
-
private save;
|
|
19
|
+
private provider;
|
|
20
|
+
constructor(provider?: StateProvider);
|
|
21
21
|
/**
|
|
22
22
|
* Get default project UUID
|
|
23
|
+
* Note: This is now async internally but we cache the result for sync access
|
|
23
24
|
*/
|
|
24
25
|
getDefaultProjectUuid(): string | undefined;
|
|
25
26
|
/**
|
|
@@ -53,6 +54,12 @@ export declare class StateManager {
|
|
|
53
54
|
}
|
|
54
55
|
/**
|
|
55
56
|
* Get the state manager singleton
|
|
57
|
+
*
|
|
58
|
+
* @deprecated For new code, use getStateProvider() from '../services/state.service.js'
|
|
56
59
|
*/
|
|
57
60
|
export declare function getStateManager(): StateManager;
|
|
58
|
-
|
|
61
|
+
/**
|
|
62
|
+
* Reset the state manager (useful for testing)
|
|
63
|
+
*/
|
|
64
|
+
export declare function resetStateManager(): void;
|
|
65
|
+
export type { StateData, StateProvider };
|
package/build/utils/state.js
CHANGED
|
@@ -1,126 +1,111 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* State management for persisting user preferences
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
|
+
* BACKWARDS COMPATIBILITY LAYER
|
|
5
|
+
* This file maintains the original StateManager API for existing code.
|
|
6
|
+
* It delegates to the new StateProvider abstraction which supports
|
|
7
|
+
* multiple backends (file-based for stdio, PostgreSQL for HTTP/SSE).
|
|
8
|
+
*
|
|
9
|
+
* For new code, prefer using StateProvider directly from '../services/state.service.js'
|
|
4
10
|
*/
|
|
5
|
-
import * as fs from 'fs';
|
|
6
|
-
import * as path from 'path';
|
|
7
|
-
import * as os from 'os';
|
|
8
11
|
import { logger } from './logger.js';
|
|
12
|
+
import { getFileStateProvider } from '../services/state.service.js';
|
|
13
|
+
/**
|
|
14
|
+
* StateManager - backwards compatible wrapper around StateProvider
|
|
15
|
+
* Maintains the original synchronous-looking API for existing code
|
|
16
|
+
*
|
|
17
|
+
* @deprecated For new code, use StateProvider from '../services/state.service.js'
|
|
18
|
+
*/
|
|
9
19
|
export class StateManager {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const stateDir = path.join(homeDir, '.hawkeye-mcp');
|
|
15
|
-
this.statePath = path.join(stateDir, 'state.json');
|
|
16
|
-
// Ensure state directory exists
|
|
17
|
-
if (!fs.existsSync(stateDir)) {
|
|
18
|
-
try {
|
|
19
|
-
fs.mkdirSync(stateDir, { recursive: true });
|
|
20
|
-
logger.info('Created state directory', { path: stateDir });
|
|
21
|
-
}
|
|
22
|
-
catch (error) {
|
|
23
|
-
logger.error('Failed to create state directory', { error, path: stateDir });
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
// Load existing state
|
|
27
|
-
this.load();
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Load state from file
|
|
31
|
-
*/
|
|
32
|
-
load() {
|
|
33
|
-
try {
|
|
34
|
-
if (fs.existsSync(this.statePath)) {
|
|
35
|
-
const data = fs.readFileSync(this.statePath, 'utf-8');
|
|
36
|
-
this.state = JSON.parse(data);
|
|
37
|
-
logger.debug('Loaded state from file', { state: this.state });
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
logger.debug('No state file found, starting with empty state');
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
catch (error) {
|
|
44
|
-
logger.error('Failed to load state file', { error, path: this.statePath });
|
|
45
|
-
this.state = {};
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Save state to file
|
|
50
|
-
*/
|
|
51
|
-
save() {
|
|
52
|
-
try {
|
|
53
|
-
const data = JSON.stringify(this.state, null, 2);
|
|
54
|
-
fs.writeFileSync(this.statePath, data, 'utf-8');
|
|
55
|
-
logger.debug('Saved state to file', { state: this.state });
|
|
56
|
-
}
|
|
57
|
-
catch (error) {
|
|
58
|
-
logger.error('Failed to save state file', { error, path: this.statePath });
|
|
59
|
-
}
|
|
20
|
+
provider;
|
|
21
|
+
constructor(provider) {
|
|
22
|
+
// Use provided provider or default to file-based
|
|
23
|
+
this.provider = provider || getFileStateProvider();
|
|
60
24
|
}
|
|
61
25
|
/**
|
|
62
26
|
* Get default project UUID
|
|
27
|
+
* Note: This is now async internally but we cache the result for sync access
|
|
63
28
|
*/
|
|
64
29
|
getDefaultProjectUuid() {
|
|
65
|
-
|
|
30
|
+
// For backwards compatibility, we use the file provider which loads sync
|
|
31
|
+
// The FileStateProvider caches state in memory, so this is effectively sync
|
|
32
|
+
const fileProvider = this.provider;
|
|
33
|
+
if (fileProvider.state) {
|
|
34
|
+
return fileProvider.state.defaultProjectUuid;
|
|
35
|
+
}
|
|
36
|
+
// Fallback: return undefined (async operations should use StateProvider directly)
|
|
37
|
+
return undefined;
|
|
66
38
|
}
|
|
67
39
|
/**
|
|
68
40
|
* Set default project UUID
|
|
69
41
|
*/
|
|
70
42
|
setDefaultProjectUuid(projectUuid) {
|
|
71
|
-
this
|
|
72
|
-
this.
|
|
73
|
-
|
|
43
|
+
// Fire and forget - the FileStateProvider handles this synchronously internally
|
|
44
|
+
this.provider.setDefaultProjectUuid(projectUuid).catch(error => {
|
|
45
|
+
logger.error('Failed to set default project UUID', { error, projectUuid });
|
|
46
|
+
});
|
|
74
47
|
}
|
|
75
48
|
/**
|
|
76
49
|
* Clear default project UUID
|
|
77
50
|
*/
|
|
78
51
|
clearDefaultProjectUuid() {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
52
|
+
this.provider.clearDefaultProjectUuid().catch(error => {
|
|
53
|
+
logger.error('Failed to clear default project UUID', { error });
|
|
54
|
+
});
|
|
82
55
|
}
|
|
83
56
|
/**
|
|
84
57
|
* Get base URL
|
|
85
58
|
*/
|
|
86
59
|
getBaseUrl() {
|
|
87
|
-
|
|
60
|
+
// For backwards compatibility, access the cached state directly
|
|
61
|
+
const fileProvider = this.provider;
|
|
62
|
+
if (fileProvider.state) {
|
|
63
|
+
return fileProvider.state.baseUrl;
|
|
64
|
+
}
|
|
65
|
+
return undefined;
|
|
88
66
|
}
|
|
89
67
|
/**
|
|
90
68
|
* Set base URL
|
|
91
69
|
*/
|
|
92
70
|
setBaseUrl(baseUrl) {
|
|
93
|
-
this.
|
|
94
|
-
|
|
95
|
-
|
|
71
|
+
this.provider.setBaseUrl(baseUrl).catch(error => {
|
|
72
|
+
logger.error('Failed to set base URL', { error, baseUrl });
|
|
73
|
+
});
|
|
96
74
|
}
|
|
97
75
|
/**
|
|
98
76
|
* Clear base URL
|
|
99
77
|
*/
|
|
100
78
|
clearBaseUrl() {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
79
|
+
this.provider.clearBaseUrl().catch(error => {
|
|
80
|
+
logger.error('Failed to clear base URL', { error });
|
|
81
|
+
});
|
|
104
82
|
}
|
|
105
83
|
/**
|
|
106
84
|
* Clear all state
|
|
107
85
|
*/
|
|
108
86
|
clearAll() {
|
|
109
|
-
this.
|
|
110
|
-
|
|
111
|
-
|
|
87
|
+
this.provider.clearAll().catch(error => {
|
|
88
|
+
logger.error('Failed to clear all state', { error });
|
|
89
|
+
});
|
|
112
90
|
}
|
|
113
91
|
/**
|
|
114
92
|
* Get all state
|
|
115
93
|
*/
|
|
116
94
|
getAll() {
|
|
117
|
-
|
|
95
|
+
// For backwards compatibility, access the cached state directly
|
|
96
|
+
const fileProvider = this.provider;
|
|
97
|
+
if (fileProvider.state) {
|
|
98
|
+
return { ...fileProvider.state };
|
|
99
|
+
}
|
|
100
|
+
return {};
|
|
118
101
|
}
|
|
119
102
|
}
|
|
120
103
|
// Singleton instance
|
|
121
104
|
let stateManager = null;
|
|
122
105
|
/**
|
|
123
106
|
* Get the state manager singleton
|
|
107
|
+
*
|
|
108
|
+
* @deprecated For new code, use getStateProvider() from '../services/state.service.js'
|
|
124
109
|
*/
|
|
125
110
|
export function getStateManager() {
|
|
126
111
|
if (!stateManager) {
|
|
@@ -128,4 +113,10 @@ export function getStateManager() {
|
|
|
128
113
|
}
|
|
129
114
|
return stateManager;
|
|
130
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* Reset the state manager (useful for testing)
|
|
118
|
+
*/
|
|
119
|
+
export function resetStateManager() {
|
|
120
|
+
stateManager = null;
|
|
121
|
+
}
|
|
131
122
|
//# sourceMappingURL=state.js.map
|
package/build/utils/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/utils/state.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/utils/state.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hawkeye-mcp-server",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"description": "MCP Server for Hawkeye automated incident investigation and root cause analysis",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
@@ -19,10 +19,12 @@
|
|
|
19
19
|
],
|
|
20
20
|
"scripts": {
|
|
21
21
|
"start": "node build/index.js",
|
|
22
|
-
"
|
|
22
|
+
"start:http": "TRANSPORT_MODE=http node build/server.js",
|
|
23
|
+
"build": "tsc && chmod 755 build/index.js && chmod 755 build/server.js",
|
|
23
24
|
"typecheck": "tsc --noEmit",
|
|
24
25
|
"prestart": "npm run build",
|
|
25
26
|
"prepublishOnly": "npm run build",
|
|
27
|
+
"test": "npm run build && node --test tests/basic/**/*.test.mjs",
|
|
26
28
|
"test:install": "node build/index.js --version"
|
|
27
29
|
},
|
|
28
30
|
"keywords": [
|
|
@@ -43,9 +45,9 @@
|
|
|
43
45
|
"license": "MIT",
|
|
44
46
|
"repository": {
|
|
45
47
|
"type": "git",
|
|
46
|
-
"url": "https://github.com/
|
|
48
|
+
"url": "https://github.com/neubirdai/mcp-server-hawkeye"
|
|
47
49
|
},
|
|
48
|
-
"homepage": "https://github.com/
|
|
50
|
+
"homepage": "https://github.com/neubirdai/mcp-server-hawkeye/tree/main",
|
|
49
51
|
"bugs": {
|
|
50
52
|
"email": "support@neubird.ai"
|
|
51
53
|
},
|
|
@@ -55,12 +57,18 @@
|
|
|
55
57
|
"dependencies": {
|
|
56
58
|
"@modelcontextprotocol/sdk": "^1.10.0",
|
|
57
59
|
"axios": "^1.9.0",
|
|
60
|
+
"cors": "^2.8.5",
|
|
58
61
|
"dotenv": "^16.4.5",
|
|
62
|
+
"express": "^5.2.1",
|
|
59
63
|
"json-schema-to-zod": "^2.6.1",
|
|
64
|
+
"pg": "^8.16.3",
|
|
60
65
|
"zod": "^3.24.3"
|
|
61
66
|
},
|
|
62
67
|
"devDependencies": {
|
|
68
|
+
"@types/cors": "^2.8.19",
|
|
69
|
+
"@types/express": "^5.0.6",
|
|
63
70
|
"@types/node": "^22.15.2",
|
|
71
|
+
"@types/pg": "^8.15.6",
|
|
64
72
|
"typescript": "^5.8.3"
|
|
65
73
|
}
|
|
66
74
|
}
|