@true-and-useful/janee 0.11.2 → 0.12.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 +27 -0
- package/dist/cli/commands/add.d.ts +1 -0
- package/dist/cli/commands/add.d.ts.map +1 -1
- package/dist/cli/commands/add.js +23 -5
- package/dist/cli/commands/add.js.map +1 -1
- package/dist/cli/commands/serve-mcp.d.ts.map +1 -1
- package/dist/cli/commands/serve-mcp.js +46 -97
- package/dist/cli/commands/serve-mcp.js.map +1 -1
- package/dist/cli/commands/test.d.ts +6 -0
- package/dist/cli/commands/test.d.ts.map +1 -0
- package/dist/cli/commands/test.js +101 -0
- package/dist/cli/commands/test.js.map +1 -0
- package/dist/cli/config-yaml.d.ts +3 -1
- package/dist/cli/config-yaml.d.ts.map +1 -1
- package/dist/cli/config-yaml.js +4 -4
- package/dist/cli/config-yaml.js.map +1 -1
- package/dist/cli/index.js +16 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/core/auth.d.ts +25 -0
- package/dist/core/auth.d.ts.map +1 -0
- package/dist/core/auth.js +136 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/authority.d.ts +2 -0
- package/dist/core/authority.d.ts.map +1 -1
- package/dist/core/authority.js +23 -1
- package/dist/core/authority.js.map +1 -1
- package/dist/core/directory.d.ts +2 -0
- package/dist/core/directory.d.ts.map +1 -1
- package/dist/core/directory.js +23 -0
- package/dist/core/directory.js.map +1 -1
- package/dist/core/exec.d.ts +0 -5
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js +41 -4
- package/dist/core/exec.js.map +1 -1
- package/dist/core/health.d.ts +39 -1
- package/dist/core/health.d.ts.map +1 -1
- package/dist/core/health.js +123 -1
- package/dist/core/health.js.map +1 -1
- package/dist/core/mcp-server.d.ts +9 -5
- package/dist/core/mcp-server.d.ts.map +1 -1
- package/dist/core/mcp-server.js +73 -15
- package/dist/core/mcp-server.js.map +1 -1
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/package.json +8 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"directory.js","sourceRoot":"","sources":["../../src/core/directory.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;
|
|
1
|
+
{"version":3,"file":"directory.js","sourceRoot":"","sources":["../../src/core/directory.ts"],"names":[],"mappings":"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"}
|
package/dist/core/exec.d.ts
CHANGED
|
@@ -65,11 +65,6 @@ export declare function hashPolicyFingerprint(capability: {
|
|
|
65
65
|
timeout?: number;
|
|
66
66
|
env?: Record<string, string>;
|
|
67
67
|
}): string;
|
|
68
|
-
/**
|
|
69
|
-
* Run a command with credentials injected as env vars.
|
|
70
|
-
* Inherits the caller's environment — the only additions are the
|
|
71
|
-
* credential env vars. Output is scrubbed before returning.
|
|
72
|
-
*/
|
|
73
68
|
export declare function executeCommand(command: string[], injectedEnv: Record<string, string>, options: {
|
|
74
69
|
workDir?: string;
|
|
75
70
|
timeout?: number;
|
package/dist/core/exec.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/core/exec.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/core/exec.ts"],"names":[],"mappings":"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"}
|
package/dist/core/exec.js
CHANGED
|
@@ -15,7 +15,9 @@ exports.scrubCredentials = scrubCredentials;
|
|
|
15
15
|
exports.hashPolicyFingerprint = hashPolicyFingerprint;
|
|
16
16
|
exports.executeCommand = executeCommand;
|
|
17
17
|
const child_process_1 = require("child_process");
|
|
18
|
+
const fs_1 = __importDefault(require("fs"));
|
|
18
19
|
const path_1 = __importDefault(require("path"));
|
|
20
|
+
const crypto_1 = require("crypto");
|
|
19
21
|
function countOccurrences(output, needle) {
|
|
20
22
|
if (!needle || needle.length < 8)
|
|
21
23
|
return 0;
|
|
@@ -84,16 +86,41 @@ function hashPolicyFingerprint(capability) {
|
|
|
84
86
|
return `policy-${hash.toString(16)}`;
|
|
85
87
|
}
|
|
86
88
|
/**
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
89
|
+
* When running `git` with a GH/GITHUB token in the env, create a temp
|
|
90
|
+
* askpass script so git can authenticate over HTTPS automatically.
|
|
91
|
+
* Returns the temp file path (caller must clean up) or null.
|
|
90
92
|
*/
|
|
93
|
+
function setupGitAskpass(executable, env) {
|
|
94
|
+
if (path_1.default.basename(executable) !== 'git')
|
|
95
|
+
return null;
|
|
96
|
+
const tokenVar = env.GH_TOKEN ? 'GH_TOKEN'
|
|
97
|
+
: env.GITHUB_TOKEN ? 'GITHUB_TOKEN'
|
|
98
|
+
: null;
|
|
99
|
+
if (!tokenVar)
|
|
100
|
+
return null;
|
|
101
|
+
const askpassPath = path_1.default.join(process.env.TMPDIR || process.env.TMP || '/tmp', `janee-askpass-${(0, crypto_1.randomUUID)()}.sh`);
|
|
102
|
+
fs_1.default.writeFileSync(askpassPath, [
|
|
103
|
+
'#!/bin/sh',
|
|
104
|
+
`case "$1" in`,
|
|
105
|
+
` Username*|username*) echo "x-access-token" ;;`,
|
|
106
|
+
` *) echo "\${${tokenVar}}" ;;`,
|
|
107
|
+
'esac',
|
|
108
|
+
'',
|
|
109
|
+
].join('\n'), { mode: 0o700 });
|
|
110
|
+
return askpassPath;
|
|
111
|
+
}
|
|
91
112
|
async function executeCommand(command, injectedEnv, options) {
|
|
92
113
|
const timeout = options.timeout || 30000;
|
|
93
114
|
const startTime = Date.now();
|
|
115
|
+
const mergedEnv = { ...process.env, ...injectedEnv };
|
|
116
|
+
const askpassFile = setupGitAskpass(command[0], injectedEnv);
|
|
117
|
+
if (askpassFile) {
|
|
118
|
+
mergedEnv.GIT_ASKPASS = askpassFile;
|
|
119
|
+
mergedEnv.GIT_TERMINAL_PROMPT = '0';
|
|
120
|
+
}
|
|
94
121
|
return new Promise((resolve) => {
|
|
95
122
|
const proc = (0, child_process_1.spawn)(command[0], command.slice(1), {
|
|
96
|
-
env:
|
|
123
|
+
env: mergedEnv,
|
|
97
124
|
cwd: options.workDir || process.cwd(),
|
|
98
125
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
99
126
|
});
|
|
@@ -110,6 +137,11 @@ async function executeCommand(command, injectedEnv, options) {
|
|
|
110
137
|
}, timeout);
|
|
111
138
|
proc.on('close', (code) => {
|
|
112
139
|
clearTimeout(timeoutId);
|
|
140
|
+
if (askpassFile)
|
|
141
|
+
try {
|
|
142
|
+
fs_1.default.unlinkSync(askpassFile);
|
|
143
|
+
}
|
|
144
|
+
catch { /* best effort */ }
|
|
113
145
|
const executionTimeMs = Date.now() - startTime;
|
|
114
146
|
const secrets = [
|
|
115
147
|
options.credential,
|
|
@@ -130,6 +162,11 @@ async function executeCommand(command, injectedEnv, options) {
|
|
|
130
162
|
});
|
|
131
163
|
proc.on('error', (error) => {
|
|
132
164
|
clearTimeout(timeoutId);
|
|
165
|
+
if (askpassFile)
|
|
166
|
+
try {
|
|
167
|
+
fs_1.default.unlinkSync(askpassFile);
|
|
168
|
+
}
|
|
169
|
+
catch { /* best effort */ }
|
|
133
170
|
resolve({
|
|
134
171
|
stdout: '',
|
|
135
172
|
stderr: `Failed to execute command: ${error.message}`,
|
package/dist/core/exec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/core/exec.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/core/exec.ts"],"names":[],"mappings":"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"}
|
package/dist/core/health.d.ts
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Health check module for Janee services
|
|
3
3
|
* Provides connectivity and latency checks for configured API backends
|
|
4
4
|
*/
|
|
5
|
+
import { ServiceConfig } from './mcp-server.js';
|
|
5
6
|
export interface HealthCheckResult {
|
|
6
7
|
service: string;
|
|
7
8
|
healthy: boolean;
|
|
@@ -15,7 +16,11 @@ export interface HealthCheckOptions {
|
|
|
15
16
|
fetchFn?: typeof fetch;
|
|
16
17
|
}
|
|
17
18
|
/**
|
|
18
|
-
*
|
|
19
|
+
* Quick reachability check — unauthenticated HEAD against the base URL.
|
|
20
|
+
* Use for uptime monitoring where you just care "is the endpoint up?"
|
|
21
|
+
* Considers 401/403 as reachable (the server answered, auth is just expected).
|
|
22
|
+
*
|
|
23
|
+
* For verifying credentials actually work, use testServiceConnection() instead.
|
|
19
24
|
*/
|
|
20
25
|
export declare function checkServiceHealth(serviceName: string, baseUrl: string, options?: HealthCheckOptions): Promise<HealthCheckResult>;
|
|
21
26
|
/**
|
|
@@ -24,4 +29,37 @@ export declare function checkServiceHealth(serviceName: string, baseUrl: string,
|
|
|
24
29
|
export declare function checkAllServicesHealth(services: Map<string, {
|
|
25
30
|
baseUrl: string;
|
|
26
31
|
}>, options?: HealthCheckOptions): Promise<HealthCheckResult[]>;
|
|
32
|
+
export interface ServiceTestResult {
|
|
33
|
+
service: string;
|
|
34
|
+
baseUrl: string;
|
|
35
|
+
testUrl: string;
|
|
36
|
+
reachable: boolean;
|
|
37
|
+
authOk: boolean;
|
|
38
|
+
statusCode?: number;
|
|
39
|
+
latencyMs: number;
|
|
40
|
+
authType: string;
|
|
41
|
+
error?: string;
|
|
42
|
+
/** Truncated upstream response body on failure — helps agents diagnose issues */
|
|
43
|
+
responseBody?: string;
|
|
44
|
+
checkedAt: string;
|
|
45
|
+
}
|
|
46
|
+
export interface ServiceTestOptions {
|
|
47
|
+
/** Auth-required endpoint path to test (e.g. "/v1/balance" for Stripe). Falls back to "/" */
|
|
48
|
+
testPath?: string;
|
|
49
|
+
timeout?: number;
|
|
50
|
+
fetchFn?: typeof fetch;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Resolve the best testPath for a service by matching against the template directory.
|
|
54
|
+
* Returns undefined if no template match is found.
|
|
55
|
+
*/
|
|
56
|
+
export declare function resolveTestPath(serviceName: string, baseUrl: string): string | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* Full credential test — authenticated GET against an auth-required endpoint.
|
|
59
|
+
* Use when you need to verify that stored credentials are actually valid.
|
|
60
|
+
* Injects auth headers via buildAuthHeaders() (same path as the proxy).
|
|
61
|
+
*
|
|
62
|
+
* For simple reachability without auth, use checkServiceHealth() instead.
|
|
63
|
+
*/
|
|
64
|
+
export declare function testServiceConnection(serviceName: string, serviceConfig: ServiceConfig, options?: ServiceTestOptions): Promise<ServiceTestResult>;
|
|
27
65
|
//# sourceMappingURL=health.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/core/health.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/core/health.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CA6D5B;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EAC1C,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAK9B;AAGD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOxF;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,aAAa,EAC5B,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAqG5B"}
|
package/dist/core/health.js
CHANGED
|
@@ -6,8 +6,17 @@
|
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.checkServiceHealth = checkServiceHealth;
|
|
8
8
|
exports.checkAllServicesHealth = checkAllServicesHealth;
|
|
9
|
+
exports.resolveTestPath = resolveTestPath;
|
|
10
|
+
exports.testServiceConnection = testServiceConnection;
|
|
11
|
+
const url_1 = require("url");
|
|
12
|
+
const auth_js_1 = require("./auth.js");
|
|
13
|
+
const directory_js_1 = require("./directory.js");
|
|
9
14
|
/**
|
|
10
|
-
*
|
|
15
|
+
* Quick reachability check — unauthenticated HEAD against the base URL.
|
|
16
|
+
* Use for uptime monitoring where you just care "is the endpoint up?"
|
|
17
|
+
* Considers 401/403 as reachable (the server answered, auth is just expected).
|
|
18
|
+
*
|
|
19
|
+
* For verifying credentials actually work, use testServiceConnection() instead.
|
|
11
20
|
*/
|
|
12
21
|
async function checkServiceHealth(serviceName, baseUrl, options = {}) {
|
|
13
22
|
const { timeout = 5000, fetchFn = fetch } = options;
|
|
@@ -70,4 +79,117 @@ async function checkAllServicesHealth(services, options = {}) {
|
|
|
70
79
|
const checks = Array.from(services.entries()).map(([name, config]) => checkServiceHealth(name, config.baseUrl, options));
|
|
71
80
|
return Promise.all(checks);
|
|
72
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Resolve the best testPath for a service by matching against the template directory.
|
|
84
|
+
* Returns undefined if no template match is found.
|
|
85
|
+
*/
|
|
86
|
+
function resolveTestPath(serviceName, baseUrl) {
|
|
87
|
+
const byName = (0, directory_js_1.getService)(serviceName);
|
|
88
|
+
if (byName?.testPath)
|
|
89
|
+
return byName.testPath;
|
|
90
|
+
// Fall back to matching by baseUrl
|
|
91
|
+
const byUrl = directory_js_1.serviceDirectory.find(t => t.testPath && baseUrl.startsWith(t.baseUrl));
|
|
92
|
+
return byUrl?.testPath;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Full credential test — authenticated GET against an auth-required endpoint.
|
|
96
|
+
* Use when you need to verify that stored credentials are actually valid.
|
|
97
|
+
* Injects auth headers via buildAuthHeaders() (same path as the proxy).
|
|
98
|
+
*
|
|
99
|
+
* For simple reachability without auth, use checkServiceHealth() instead.
|
|
100
|
+
*/
|
|
101
|
+
async function testServiceConnection(serviceName, serviceConfig, options = {}) {
|
|
102
|
+
const { timeout = 10000, fetchFn = fetch } = options;
|
|
103
|
+
const checkedAt = new Date().toISOString();
|
|
104
|
+
const authType = serviceConfig.auth.type;
|
|
105
|
+
if (!serviceConfig.baseUrl) {
|
|
106
|
+
return {
|
|
107
|
+
service: serviceName,
|
|
108
|
+
baseUrl: '',
|
|
109
|
+
testUrl: '',
|
|
110
|
+
reachable: false,
|
|
111
|
+
authOk: false,
|
|
112
|
+
latencyMs: 0,
|
|
113
|
+
authType,
|
|
114
|
+
error: 'No base URL configured',
|
|
115
|
+
checkedAt
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
const testPath = options.testPath || serviceConfig.testPath || resolveTestPath(serviceName, serviceConfig.baseUrl);
|
|
119
|
+
const start = Date.now();
|
|
120
|
+
try {
|
|
121
|
+
let baseUrl = serviceConfig.baseUrl;
|
|
122
|
+
if (!baseUrl.endsWith('/'))
|
|
123
|
+
baseUrl += '/';
|
|
124
|
+
let reqPath = testPath || '';
|
|
125
|
+
if (reqPath.startsWith('/'))
|
|
126
|
+
reqPath = reqPath.slice(1);
|
|
127
|
+
const targetUrl = new url_1.URL(reqPath, baseUrl);
|
|
128
|
+
const authResult = await (0, auth_js_1.buildAuthHeaders)(serviceName, serviceConfig, {
|
|
129
|
+
method: 'GET',
|
|
130
|
+
targetUrl,
|
|
131
|
+
body: undefined,
|
|
132
|
+
});
|
|
133
|
+
if (authResult.urlParams) {
|
|
134
|
+
for (const [key, value] of Object.entries(authResult.urlParams)) {
|
|
135
|
+
targetUrl.searchParams.set(key, value);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
const controller = new AbortController();
|
|
139
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
140
|
+
const response = await fetchFn(targetUrl.toString(), {
|
|
141
|
+
method: 'GET',
|
|
142
|
+
headers: authResult.headers,
|
|
143
|
+
signal: controller.signal,
|
|
144
|
+
});
|
|
145
|
+
clearTimeout(timeoutId);
|
|
146
|
+
const latencyMs = Date.now() - start;
|
|
147
|
+
const reachable = true;
|
|
148
|
+
const authOk = response.ok;
|
|
149
|
+
// On failure, capture upstream response body so agents can diagnose
|
|
150
|
+
let responseBody;
|
|
151
|
+
if (!authOk) {
|
|
152
|
+
try {
|
|
153
|
+
const raw = await response.text();
|
|
154
|
+
responseBody = raw.length > 512 ? raw.slice(0, 512) + '…' : raw;
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
// best-effort
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
service: serviceName,
|
|
162
|
+
baseUrl: serviceConfig.baseUrl,
|
|
163
|
+
testUrl: targetUrl.toString(),
|
|
164
|
+
reachable,
|
|
165
|
+
authOk,
|
|
166
|
+
statusCode: response.status,
|
|
167
|
+
latencyMs,
|
|
168
|
+
authType,
|
|
169
|
+
...(response.status === 401 && { error: 'Authentication failed (401)' }),
|
|
170
|
+
...(response.status === 403 && { error: 'Forbidden (403) — credentials may lack required permissions' }),
|
|
171
|
+
...(!response.ok && response.status !== 401 && response.status !== 403 && {
|
|
172
|
+
error: `HTTP ${response.status} ${response.statusText}`
|
|
173
|
+
}),
|
|
174
|
+
responseBody,
|
|
175
|
+
checkedAt,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
catch (err) {
|
|
179
|
+
const latencyMs = Date.now() - start;
|
|
180
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
181
|
+
const isTimeout = message.includes('abort');
|
|
182
|
+
return {
|
|
183
|
+
service: serviceName,
|
|
184
|
+
baseUrl: serviceConfig.baseUrl,
|
|
185
|
+
testUrl: serviceConfig.baseUrl + (testPath || ''),
|
|
186
|
+
reachable: false,
|
|
187
|
+
authOk: false,
|
|
188
|
+
latencyMs,
|
|
189
|
+
authType,
|
|
190
|
+
error: isTimeout ? `Timeout after ${timeout}ms` : message,
|
|
191
|
+
checkedAt,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
}
|
|
73
195
|
//# sourceMappingURL=health.js.map
|
package/dist/core/health.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/core/health.ts"],"names":[],"mappings":";AAAA;;;GAGG;;
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/core/health.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAgCH,gDAiEC;AAKD,wDAQC;AA6BD,0CAOC;AASD,sDAyGC;AAlQD,6BAA0B;AAE1B,uCAA6C;AAC7C,iDAGwB;AAiBxB;;;;;;GAMG;AACI,KAAK,UAAU,kBAAkB,CACtC,WAAmB,EACnB,OAAe,EACf,UAA8B,EAAE;IAEhC,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,CAAC;YACZ,KAAK,EAAE,wBAAwB;YAC/B,SAAS;SACV,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEzB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;QAEhE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE;YACtC,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAErC,uFAAuF;QACvF,MAAM,WAAW,GAAG,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC;QAEtF,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO;gBACL,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,QAAQ,CAAC,MAAM;gBAC3B,SAAS;gBACT,SAAS;aACV,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,QAAQ,CAAC,MAAM;YAC3B,SAAS;YACT,KAAK,EAAE,QAAQ,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE;YACvD,SAAS;SACV,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACrC,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEjE,OAAO;YACL,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE,KAAK;YACd,SAAS;YACT,KAAK,EAAE,OAAO;YACd,SAAS;SACV,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,sBAAsB,CAC1C,QAA0C,EAC1C,UAA8B,EAAE;IAEhC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CACnE,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAClD,CAAC;IACF,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC;AAyBD;;;GAGG;AACH,SAAgB,eAAe,CAAC,WAAmB,EAAE,OAAe;IAClE,MAAM,MAAM,GAAG,IAAA,yBAAU,EAAC,WAAW,CAAC,CAAC;IACvC,IAAI,MAAM,EAAE,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC;IAE7C,mCAAmC;IACnC,MAAM,KAAK,GAAG,+BAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACtF,OAAO,KAAK,EAAE,QAAQ,CAAC;AACzB,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,qBAAqB,CACzC,WAAmB,EACnB,aAA4B,EAC5B,UAA8B,EAAE;IAEhC,MAAM,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACrD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;IAEzC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QAC3B,OAAO;YACL,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,KAAK;YACb,SAAS,EAAE,CAAC;YACZ,QAAQ;YACR,KAAK,EAAE,wBAAwB;YAC/B,SAAS;SACV,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,aAAa,CAAC,QAAQ,IAAI,eAAe,CAAC,WAAW,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IACnH,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEzB,IAAI,CAAC;QACH,IAAI,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,GAAG,CAAC;QAC3C,IAAI,OAAO,GAAG,QAAQ,IAAI,EAAE,CAAC;QAC7B,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,SAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAE5C,MAAM,UAAU,GAAG,MAAM,IAAA,0BAAgB,EAAC,WAAW,EAAE,aAAa,EAAE;YACpE,MAAM,EAAE,KAAK;YACb,SAAS;YACT,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;QAEH,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;YACzB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChE,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;QAEhE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE;YACnD,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAErC,MAAM,SAAS,GAAG,IAAI,CAAC;QACvB,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,CAAC;QAE3B,oEAAoE;QACpE,IAAI,YAAgC,CAAC;QACrC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAClC,YAAY,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAClE,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc;YAChB,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE,aAAa,CAAC,OAAO;YAC9B,OAAO,EAAE,SAAS,CAAC,QAAQ,EAAE;YAC7B,SAAS;YACT,MAAM;YACN,UAAU,EAAE,QAAQ,CAAC,MAAM;YAC3B,SAAS;YACT,QAAQ;YACR,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC;YACxE,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,6DAA6D,EAAE,CAAC;YACxG,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI;gBACxE,KAAK,EAAE,QAAQ,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE;aACxD,CAAC;YACF,YAAY;YACZ,SAAS;SACV,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACrC,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE5C,OAAO;YACL,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE,aAAa,CAAC,OAAO;YAC9B,OAAO,EAAE,aAAa,CAAC,OAAO,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;YACjD,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,KAAK;YACb,SAAS;YACT,QAAQ;YACR,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,iBAAiB,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO;YACzD,SAAS;SACV,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
* MCP Server for Janee
|
|
3
3
|
* Exposes capabilities to AI agents via Model Context Protocol
|
|
4
4
|
*/
|
|
5
|
+
import { URL } from 'url';
|
|
5
6
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
6
|
-
import {
|
|
7
|
-
import { Rules } from './rules.js';
|
|
7
|
+
import { CredentialOwnership } from './agent-scope.js';
|
|
8
8
|
import { AuditLogger } from './audit.js';
|
|
9
|
-
import { URL } from 'url';
|
|
10
9
|
import { ExecResult } from './exec.js';
|
|
11
|
-
import {
|
|
10
|
+
import { Rules } from './rules.js';
|
|
11
|
+
import { SessionManager } from './sessions.js';
|
|
12
12
|
export interface Capability {
|
|
13
13
|
name: string;
|
|
14
14
|
service: string;
|
|
@@ -38,6 +38,8 @@ export interface ServiceConfig {
|
|
|
38
38
|
privateKey?: string;
|
|
39
39
|
installationId?: string;
|
|
40
40
|
};
|
|
41
|
+
/** Auth-required GET path used by `janee test` to verify credentials (e.g. "/v1/balance") */
|
|
42
|
+
testPath?: string;
|
|
41
43
|
/** Ownership metadata for agent-scoped credential access control */
|
|
42
44
|
ownership?: CredentialOwnership;
|
|
43
45
|
}
|
|
@@ -81,6 +83,8 @@ export interface MCPServerOptions {
|
|
|
81
83
|
hideExecTool?: boolean;
|
|
82
84
|
}
|
|
83
85
|
export interface MCPServerResult {
|
|
86
|
+
/** Swap capabilities and services in the closure. Used for SIGHUP reload. */
|
|
87
|
+
reloadConfig: (result: ReloadResult) => void;
|
|
84
88
|
server: Server;
|
|
85
89
|
/** Per-session clientInfo.name storage. Populated by captureClientInfo(). */
|
|
86
90
|
clientSessions: Map<string, string>;
|
|
@@ -104,7 +108,7 @@ export declare function captureClientInfo(transport: {
|
|
|
104
108
|
/**
|
|
105
109
|
* Start MCP server with stdio transport (single session).
|
|
106
110
|
*/
|
|
107
|
-
export declare function startMCPServer(serverOptions: MCPServerOptions): Promise<
|
|
111
|
+
export declare function startMCPServer(serverOptions: MCPServerOptions): Promise<MCPServerResult>;
|
|
108
112
|
/** Handle returned by startMCPServerHTTP for lifecycle management. */
|
|
109
113
|
export interface HTTPServerHandle {
|
|
110
114
|
/** Gracefully close all sessions and stop the HTTP listener. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/core/mcp-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/core/mcp-server.ts"],"names":[],"mappings":"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"}
|
package/dist/core/mcp-server.js
CHANGED
|
@@ -45,18 +45,19 @@ exports.makeAPIRequest = makeAPIRequest;
|
|
|
45
45
|
exports.captureClientInfo = captureClientInfo;
|
|
46
46
|
exports.startMCPServer = startMCPServer;
|
|
47
47
|
exports.startMCPServerHTTP = startMCPServerHTTP;
|
|
48
|
+
const express_1 = __importDefault(require("express"));
|
|
49
|
+
const fs_1 = require("fs");
|
|
50
|
+
const http_1 = __importDefault(require("http"));
|
|
51
|
+
const https_1 = __importDefault(require("https"));
|
|
52
|
+
const path_1 = require("path");
|
|
48
53
|
const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
|
|
49
54
|
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
50
55
|
const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
|
|
51
56
|
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
52
|
-
const rules_js_1 = require("./rules.js");
|
|
53
|
-
const http_1 = __importDefault(require("http"));
|
|
54
|
-
const https_1 = __importDefault(require("https"));
|
|
55
|
-
const express_1 = __importDefault(require("express"));
|
|
56
|
-
const exec_js_1 = require("./exec.js");
|
|
57
|
-
const fs_1 = require("fs");
|
|
58
57
|
const agent_scope_js_1 = require("./agent-scope.js");
|
|
59
|
-
const
|
|
58
|
+
const exec_js_1 = require("./exec.js");
|
|
59
|
+
const health_js_1 = require("./health.js");
|
|
60
|
+
const rules_js_1 = require("./rules.js");
|
|
60
61
|
// Read version from package.json
|
|
61
62
|
const packageJsonPath = (0, path_1.join)(__dirname, '../../package.json');
|
|
62
63
|
const pkgVersion = JSON.parse((0, fs_1.readFileSync)(packageJsonPath, 'utf8')).version || '0.0.0';
|
|
@@ -239,9 +240,24 @@ function createMCPServer(options) {
|
|
|
239
240
|
required: ['action', 'service']
|
|
240
241
|
}
|
|
241
242
|
};
|
|
243
|
+
// Tool: test_service
|
|
244
|
+
const testServiceTool = {
|
|
245
|
+
name: 'test_service',
|
|
246
|
+
description: 'Test connectivity and authentication for a configured service. Verifies that Janee can reach the service and that credentials are valid.',
|
|
247
|
+
inputSchema: {
|
|
248
|
+
type: 'object',
|
|
249
|
+
properties: {
|
|
250
|
+
service: {
|
|
251
|
+
type: 'string',
|
|
252
|
+
description: 'Service name to test (from list_services). Omit to test all services.'
|
|
253
|
+
}
|
|
254
|
+
},
|
|
255
|
+
required: []
|
|
256
|
+
}
|
|
257
|
+
};
|
|
242
258
|
// Register tools
|
|
243
259
|
server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
|
|
244
|
-
const tools = [listServicesTool, executeTool, manageCredentialTool];
|
|
260
|
+
const tools = [listServicesTool, executeTool, manageCredentialTool, testServiceTool];
|
|
245
261
|
if (onExecCommand && !options.hideExecTool) {
|
|
246
262
|
tools.push(execTool);
|
|
247
263
|
}
|
|
@@ -267,11 +283,8 @@ function createMCPServer(options) {
|
|
|
267
283
|
content: [{
|
|
268
284
|
type: 'text',
|
|
269
285
|
text: JSON.stringify(capabilities
|
|
270
|
-
.filter(cap => {
|
|
271
|
-
const svc = services.get(cap.service);
|
|
272
|
-
return canAccessCapability(listAgentId, cap, svc, defaultAccess);
|
|
273
|
-
})
|
|
274
286
|
.map(cap => ({
|
|
287
|
+
accessible: canAccessCapability(listAgentId, cap, services.get(cap.service), defaultAccess),
|
|
275
288
|
name: cap.name,
|
|
276
289
|
service: cap.service,
|
|
277
290
|
mode: cap.mode || 'proxy',
|
|
@@ -533,6 +546,30 @@ function createMCPServer(options) {
|
|
|
533
546
|
}
|
|
534
547
|
throw new Error(`Unknown action: ${credAction}. Use 'view', 'grant', or 'revoke'.`);
|
|
535
548
|
}
|
|
549
|
+
case 'test_service': {
|
|
550
|
+
const { service: testSvcName } = (args || {});
|
|
551
|
+
let targets;
|
|
552
|
+
if (testSvcName) {
|
|
553
|
+
const svc = services.get(testSvcName);
|
|
554
|
+
if (!svc) {
|
|
555
|
+
throw new Error(`Unknown service: ${testSvcName}. Use list_services to see available services.`);
|
|
556
|
+
}
|
|
557
|
+
targets = [[testSvcName, svc]];
|
|
558
|
+
}
|
|
559
|
+
else {
|
|
560
|
+
targets = Array.from(services.entries());
|
|
561
|
+
}
|
|
562
|
+
if (targets.length === 0) {
|
|
563
|
+
throw new Error('No services configured');
|
|
564
|
+
}
|
|
565
|
+
const results = await Promise.all(targets.map(([name, config]) => (0, health_js_1.testServiceConnection)(name, config)));
|
|
566
|
+
return {
|
|
567
|
+
content: [{
|
|
568
|
+
type: 'text',
|
|
569
|
+
text: JSON.stringify(results.length === 1 ? results[0] : results, null, 2)
|
|
570
|
+
}]
|
|
571
|
+
};
|
|
572
|
+
}
|
|
536
573
|
default:
|
|
537
574
|
throw new Error(`Unknown tool: ${name}`);
|
|
538
575
|
}
|
|
@@ -549,7 +586,14 @@ function createMCPServer(options) {
|
|
|
549
586
|
};
|
|
550
587
|
}
|
|
551
588
|
});
|
|
552
|
-
return {
|
|
589
|
+
return {
|
|
590
|
+
server,
|
|
591
|
+
clientSessions,
|
|
592
|
+
reloadConfig: (result) => {
|
|
593
|
+
capabilities = result.capabilities;
|
|
594
|
+
services = result.services;
|
|
595
|
+
},
|
|
596
|
+
};
|
|
553
597
|
}
|
|
554
598
|
/**
|
|
555
599
|
* Make HTTP/HTTPS request to real API
|
|
@@ -608,11 +652,13 @@ function captureClientInfo(transport, clientSessions) {
|
|
|
608
652
|
* Start MCP server with stdio transport (single session).
|
|
609
653
|
*/
|
|
610
654
|
async function startMCPServer(serverOptions) {
|
|
611
|
-
const
|
|
655
|
+
const mcpResult = createMCPServer(serverOptions);
|
|
656
|
+
const { server, clientSessions } = mcpResult;
|
|
612
657
|
const transport = new stdio_js_1.StdioServerTransport();
|
|
613
658
|
await server.connect(transport);
|
|
614
659
|
captureClientInfo(transport, clientSessions);
|
|
615
660
|
console.error('Janee MCP server started (stdio)');
|
|
661
|
+
return mcpResult;
|
|
616
662
|
}
|
|
617
663
|
/**
|
|
618
664
|
* Start MCP server with StreamableHTTP transport over HTTP.
|
|
@@ -675,6 +721,17 @@ async function startMCPServerHTTP(serverOptions, httpOptions) {
|
|
|
675
721
|
res.status(500).json({ error: error instanceof Error ? error.message : 'completion failed' });
|
|
676
722
|
}
|
|
677
723
|
});
|
|
724
|
+
if (hooks.testService) {
|
|
725
|
+
app.post('/v1/test', authMiddleware, async (req, res) => {
|
|
726
|
+
try {
|
|
727
|
+
const result = await hooks.testService(req.body?.service);
|
|
728
|
+
res.status(200).json(result);
|
|
729
|
+
}
|
|
730
|
+
catch (error) {
|
|
731
|
+
res.status(500).json({ error: error instanceof Error ? error.message : 'Test failed' });
|
|
732
|
+
}
|
|
733
|
+
});
|
|
734
|
+
}
|
|
678
735
|
}
|
|
679
736
|
// Sweep idle sessions every 60 seconds
|
|
680
737
|
const idleSweepInterval = idleTimeoutMs > 0 ? setInterval(async () => {
|
|
@@ -706,7 +763,8 @@ async function startMCPServerHTTP(serverOptions, httpOptions) {
|
|
|
706
763
|
}
|
|
707
764
|
else if (!sessionId && (0, types_js_1.isInitializeRequest)(req.body)) {
|
|
708
765
|
const clientName = req.body?.params?.clientInfo?.name;
|
|
709
|
-
const
|
|
766
|
+
const mcpResult = createMCPServer(serverOptions);
|
|
767
|
+
const { server, clientSessions } = mcpResult;
|
|
710
768
|
const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
|
|
711
769
|
sessionIdGenerator: () => crypto.randomUUID(),
|
|
712
770
|
onsessioninitialized: (sid) => {
|