git-doc-mcp 0.1.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/LICENSE +21 -0
- package/README.md +543 -0
- package/dist/audit/index.d.ts +2 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +2 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/logger.d.ts +81 -0
- package/dist/audit/logger.d.ts.map +1 -0
- package/dist/audit/logger.js +179 -0
- package/dist/audit/logger.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +44 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +360 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/index.d.ts +21 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +71 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/http/client.d.ts +39 -0
- package/dist/http/client.d.ts.map +1 -0
- package/dist/http/client.js +114 -0
- package/dist/http/client.js.map +1 -0
- package/dist/http/index.d.ts +7 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +7 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/redirect-utils.d.ts +27 -0
- package/dist/http/redirect-utils.d.ts.map +1 -0
- package/dist/http/redirect-utils.js +73 -0
- package/dist/http/redirect-utils.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest/index.d.ts +7 -0
- package/dist/manifest/index.d.ts.map +1 -0
- package/dist/manifest/index.js +7 -0
- package/dist/manifest/index.js.map +1 -0
- package/dist/manifest/loader.d.ts +55 -0
- package/dist/manifest/loader.d.ts.map +1 -0
- package/dist/manifest/loader.js +222 -0
- package/dist/manifest/loader.js.map +1 -0
- package/dist/manifest/schema.d.ts +909 -0
- package/dist/manifest/schema.d.ts.map +1 -0
- package/dist/manifest/schema.js +148 -0
- package/dist/manifest/schema.js.map +1 -0
- package/dist/rate-limit/index.d.ts +6 -0
- package/dist/rate-limit/index.d.ts.map +1 -0
- package/dist/rate-limit/index.js +6 -0
- package/dist/rate-limit/index.js.map +1 -0
- package/dist/rate-limit/limiter.d.ts +38 -0
- package/dist/rate-limit/limiter.d.ts.map +1 -0
- package/dist/rate-limit/limiter.js +55 -0
- package/dist/rate-limit/limiter.js.map +1 -0
- package/dist/sandbox/context.d.ts +69 -0
- package/dist/sandbox/context.d.ts.map +1 -0
- package/dist/sandbox/context.js +134 -0
- package/dist/sandbox/context.js.map +1 -0
- package/dist/sandbox/executor.d.ts +50 -0
- package/dist/sandbox/executor.d.ts.map +1 -0
- package/dist/sandbox/executor.js +259 -0
- package/dist/sandbox/executor.js.map +1 -0
- package/dist/sandbox/index.d.ts +8 -0
- package/dist/sandbox/index.d.ts.map +1 -0
- package/dist/sandbox/index.js +8 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/sandbox/url-validator.d.ts +40 -0
- package/dist/sandbox/url-validator.d.ts.map +1 -0
- package/dist/sandbox/url-validator.js +178 -0
- package/dist/sandbox/url-validator.js.map +1 -0
- package/dist/secrets/index.d.ts +7 -0
- package/dist/secrets/index.d.ts.map +1 -0
- package/dist/secrets/index.js +7 -0
- package/dist/secrets/index.js.map +1 -0
- package/dist/secrets/manager.d.ts +55 -0
- package/dist/secrets/manager.d.ts.map +1 -0
- package/dist/secrets/manager.js +94 -0
- package/dist/secrets/manager.js.map +1 -0
- package/dist/secrets/patterns.d.ts +33 -0
- package/dist/secrets/patterns.d.ts.map +1 -0
- package/dist/secrets/patterns.js +71 -0
- package/dist/secrets/patterns.js.map +1 -0
- package/dist/server/index.d.ts +6 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +6 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/mcp.d.ts +60 -0
- package/dist/server/mcp.d.ts.map +1 -0
- package/dist/server/mcp.js +173 -0
- package/dist/server/mcp.js.map +1 -0
- package/dist/worker/index.d.ts +7 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +7 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/process.d.ts +64 -0
- package/dist/worker/process.d.ts.map +1 -0
- package/dist/worker/process.js +222 -0
- package/dist/worker/process.js.map +1 -0
- package/dist/worker/protocol.d.ts +83 -0
- package/dist/worker/protocol.d.ts.map +1 -0
- package/dist/worker/protocol.js +55 -0
- package/dist/worker/protocol.js.map +1 -0
- package/dist/worker/worker-entry.d.ts +30 -0
- package/dist/worker/worker-entry.d.ts.map +1 -0
- package/dist/worker/worker-entry.js +136 -0
- package/dist/worker/worker-entry.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secret approval and scoping manager.
|
|
3
|
+
* @module secrets/manager
|
|
4
|
+
*/
|
|
5
|
+
import { normalizeScopes, validateUrlScope } from './patterns.js';
|
|
6
|
+
/**
|
|
7
|
+
* Secrets manager handles secret approval and scoped access.
|
|
8
|
+
*/
|
|
9
|
+
export class SecretsManager {
|
|
10
|
+
approvedSecrets = new Map();
|
|
11
|
+
/**
|
|
12
|
+
* Approve a secret with its value and scope patterns.
|
|
13
|
+
*/
|
|
14
|
+
approve(secret, value) {
|
|
15
|
+
this.approvedSecrets.set(secret.name, {
|
|
16
|
+
name: secret.name,
|
|
17
|
+
value,
|
|
18
|
+
scopes: normalizeScopes(secret.scope),
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Check if a secret is approved.
|
|
23
|
+
*/
|
|
24
|
+
isApproved(name) {
|
|
25
|
+
return this.approvedSecrets.has(name);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get a secret value if approved and URL is in scope.
|
|
29
|
+
* @returns The secret value, or undefined if not approved or out of scope
|
|
30
|
+
*/
|
|
31
|
+
getSecret(name, url) {
|
|
32
|
+
const secret = this.approvedSecrets.get(name);
|
|
33
|
+
if (!secret) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
// If URL provided, validate scope
|
|
37
|
+
if (url) {
|
|
38
|
+
try {
|
|
39
|
+
validateUrlScope(url, secret.scopes);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return secret.value;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get all approved secrets for a specific URL.
|
|
49
|
+
* Only returns secrets whose scopes include the URL.
|
|
50
|
+
*/
|
|
51
|
+
getSecretsForUrl(url) {
|
|
52
|
+
const result = {};
|
|
53
|
+
for (const [name, secret] of this.approvedSecrets) {
|
|
54
|
+
try {
|
|
55
|
+
validateUrlScope(url, secret.scopes);
|
|
56
|
+
result[name] = secret.value;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// Secret not in scope for this URL
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get all approved secrets (without scope validation).
|
|
66
|
+
* Use with caution - for passing to worker process only.
|
|
67
|
+
*/
|
|
68
|
+
getAllSecrets() {
|
|
69
|
+
const result = {};
|
|
70
|
+
for (const [name, secret] of this.approvedSecrets) {
|
|
71
|
+
result[name] = secret.value;
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get scope patterns for a secret.
|
|
77
|
+
*/
|
|
78
|
+
getScopes(name) {
|
|
79
|
+
return this.approvedSecrets.get(name)?.scopes;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Clear all approved secrets.
|
|
83
|
+
*/
|
|
84
|
+
clear() {
|
|
85
|
+
this.approvedSecrets.clear();
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* List all approved secret names.
|
|
89
|
+
*/
|
|
90
|
+
listApproved() {
|
|
91
|
+
return Array.from(this.approvedSecrets.keys());
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/secrets/manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAWlE;;GAEG;AACH,MAAM,OAAO,cAAc;IACjB,eAAe,GAAgC,IAAI,GAAG,EAAE,CAAC;IAEjE;;OAEG;IACH,OAAO,CAAC,MAAc,EAAE,KAAa;QACnC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;YACpC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,KAAK;YACL,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC;SACtC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,IAAY,EAAE,GAAY;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,kCAAkC;QAClC,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC;gBACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACvC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,gBAAgB,CAAC,GAAW;QAC1B,MAAM,MAAM,GAA2B,EAAE,CAAC;QAE1C,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAClD,IAAI,CAAC;gBACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBACrC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACP,mCAAmC;YACrC,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACH,aAAa;QACX,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QAC9B,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;CACF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* URL pattern matching for secret scopes.
|
|
3
|
+
* @module secrets/patterns
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Check if a URL matches a scope pattern.
|
|
7
|
+
*
|
|
8
|
+
* Pattern syntax:
|
|
9
|
+
* - `https://api.github.com/*` matches all paths under api.github.com
|
|
10
|
+
* - `https://api.github.com/repos/*` matches only /repos/* paths
|
|
11
|
+
* - `https://raw.githubusercontent.com` matches exact origin only
|
|
12
|
+
*
|
|
13
|
+
* Matching rules:
|
|
14
|
+
* - Pattern must match the FULL URL (origin + path)
|
|
15
|
+
* - `*` in path matches any path segment(s), including nested paths
|
|
16
|
+
* - No subdomain matching: `https://api.github.com/*` does NOT match `https://api.github.com.evil.com/`
|
|
17
|
+
* - Query strings and fragments are stripped before matching
|
|
18
|
+
*/
|
|
19
|
+
export declare function matchScopePattern(url: string, pattern: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Check if a URL matches any of the scope patterns.
|
|
22
|
+
*/
|
|
23
|
+
export declare function matchAnyScopePattern(url: string, patterns: string[]): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Validate that a URL is within the allowed scopes.
|
|
26
|
+
* @throws Error if URL doesn't match any scope
|
|
27
|
+
*/
|
|
28
|
+
export declare function validateUrlScope(url: string, patterns: string[]): void;
|
|
29
|
+
/**
|
|
30
|
+
* Normalize scope patterns to an array.
|
|
31
|
+
*/
|
|
32
|
+
export declare function normalizeScopes(scopes: string | string[]): string[];
|
|
33
|
+
//# sourceMappingURL=patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../src/secrets/patterns.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAkCvE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAE7E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAMtE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,CAEnE"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* URL pattern matching for secret scopes.
|
|
3
|
+
* @module secrets/patterns
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Check if a URL matches a scope pattern.
|
|
7
|
+
*
|
|
8
|
+
* Pattern syntax:
|
|
9
|
+
* - `https://api.github.com/*` matches all paths under api.github.com
|
|
10
|
+
* - `https://api.github.com/repos/*` matches only /repos/* paths
|
|
11
|
+
* - `https://raw.githubusercontent.com` matches exact origin only
|
|
12
|
+
*
|
|
13
|
+
* Matching rules:
|
|
14
|
+
* - Pattern must match the FULL URL (origin + path)
|
|
15
|
+
* - `*` in path matches any path segment(s), including nested paths
|
|
16
|
+
* - No subdomain matching: `https://api.github.com/*` does NOT match `https://api.github.com.evil.com/`
|
|
17
|
+
* - Query strings and fragments are stripped before matching
|
|
18
|
+
*/
|
|
19
|
+
export function matchScopePattern(url, pattern) {
|
|
20
|
+
try {
|
|
21
|
+
const urlObj = new URL(url);
|
|
22
|
+
// Strip query and fragment
|
|
23
|
+
urlObj.search = '';
|
|
24
|
+
urlObj.hash = '';
|
|
25
|
+
// Handle wildcard pattern
|
|
26
|
+
if (pattern.endsWith('/*')) {
|
|
27
|
+
const basePattern = pattern.slice(0, -2);
|
|
28
|
+
const patternObj = new URL(basePattern);
|
|
29
|
+
// Exact origin match required
|
|
30
|
+
if (urlObj.origin !== patternObj.origin) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
// Path must be exactly the base path or start with base path + '/'
|
|
34
|
+
// This prevents /repos-private matching a /repos/* scope
|
|
35
|
+
const basePath = patternObj.pathname;
|
|
36
|
+
if (basePath === '/') {
|
|
37
|
+
// Root wildcard (/*): matches any path on this origin
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
return urlObj.pathname === basePath || urlObj.pathname.startsWith(basePath + '/');
|
|
41
|
+
}
|
|
42
|
+
// Exact match (no wildcard)
|
|
43
|
+
const patternObj = new URL(pattern);
|
|
44
|
+
return urlObj.origin === patternObj.origin && urlObj.pathname === patternObj.pathname;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check if a URL matches any of the scope patterns.
|
|
52
|
+
*/
|
|
53
|
+
export function matchAnyScopePattern(url, patterns) {
|
|
54
|
+
return patterns.some((pattern) => matchScopePattern(url, pattern));
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Validate that a URL is within the allowed scopes.
|
|
58
|
+
* @throws Error if URL doesn't match any scope
|
|
59
|
+
*/
|
|
60
|
+
export function validateUrlScope(url, patterns) {
|
|
61
|
+
if (!matchAnyScopePattern(url, patterns)) {
|
|
62
|
+
throw new Error(`URL "${url}" is not within allowed scopes: ${patterns.join(', ')}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Normalize scope patterns to an array.
|
|
67
|
+
*/
|
|
68
|
+
export function normalizeScopes(scopes) {
|
|
69
|
+
return Array.isArray(scopes) ? scopes : [scopes];
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../src/secrets/patterns.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,OAAe;IAC5D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAE5B,2BAA2B;QAC3B,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QAEjB,0BAA0B;QAC1B,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;YAExC,8BAA8B;YAC9B,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC;gBACxC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,mEAAmE;YACnE,yDAAyD;YACzD,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;YACrC,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;gBACrB,sDAAsD;gBACtD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;QACpF,CAAC;QAED,4BAA4B;QAC5B,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,UAAU,CAAC,QAAQ,CAAC;IACxF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAW,EAAE,QAAkB;IAClE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;AACrE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,QAAkB;IAC9D,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CACb,QAAQ,GAAG,mCAAmC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACpE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAyB;IACvD,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP server setup using @modelcontextprotocol/sdk.
|
|
3
|
+
* @module server/mcp
|
|
4
|
+
*/
|
|
5
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { Manifest } from '../manifest/schema.js';
|
|
8
|
+
/**
|
|
9
|
+
* Result from a prompt get handler, matching MCP GetPromptResult shape.
|
|
10
|
+
*
|
|
11
|
+
* For resource content, `resource.text` is required per MCP TextResourceContents.
|
|
12
|
+
* Use empty string if the resource text is not available at prompt resolution time.
|
|
13
|
+
*/
|
|
14
|
+
export interface PromptResult {
|
|
15
|
+
description?: string;
|
|
16
|
+
messages: Array<{
|
|
17
|
+
role: 'user' | 'assistant';
|
|
18
|
+
content: {
|
|
19
|
+
type: 'text';
|
|
20
|
+
text: string;
|
|
21
|
+
} | {
|
|
22
|
+
type: 'resource';
|
|
23
|
+
resource: {
|
|
24
|
+
uri: string;
|
|
25
|
+
text: string;
|
|
26
|
+
mimeType?: string;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
}>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* MCP server options.
|
|
33
|
+
*/
|
|
34
|
+
export interface McpServerOptions {
|
|
35
|
+
manifest: Manifest;
|
|
36
|
+
/** Tool execution handler */
|
|
37
|
+
onToolCall: (name: string, input: unknown) => Promise<unknown>;
|
|
38
|
+
/** Resource read handler */
|
|
39
|
+
onResourceRead?: (uri: string) => Promise<string>;
|
|
40
|
+
/** Prompt get handler - returns structured messages matching MCP PromptMessage[] */
|
|
41
|
+
onPromptGet?: (name: string, args: Record<string, string>) => Promise<PromptResult>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Create and configure MCP server from manifest.
|
|
45
|
+
*/
|
|
46
|
+
export declare function createMcpServer(options: McpServerOptions): McpServer;
|
|
47
|
+
/**
|
|
48
|
+
* Convert JSON Schema to Zod schema.
|
|
49
|
+
* This is a simplified implementation for basic types.
|
|
50
|
+
*/
|
|
51
|
+
export declare function jsonSchemaToZod(schema: {
|
|
52
|
+
type: string;
|
|
53
|
+
properties?: Record<string, unknown>;
|
|
54
|
+
required?: string[];
|
|
55
|
+
}): z.ZodObject<Record<string, z.ZodType>>;
|
|
56
|
+
/**
|
|
57
|
+
* Start the MCP server with stdio transport.
|
|
58
|
+
*/
|
|
59
|
+
export declare function startMcpServer(server: McpServer): Promise<void>;
|
|
60
|
+
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/server/mcp.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAA0B,MAAM,uBAAuB,CAAC;AAEzE;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAC3B,OAAO,EACH;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,GAC9B;YAAE,IAAI,EAAE,UAAU,CAAC;YAAC,QAAQ,EAAE;gBAAE,GAAG,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAC;gBAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC;KACtF,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,6BAA6B;IAC7B,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D,4BAA4B;IAC5B,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAClD,oFAAoF;IACpF,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;CACrF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAsCpE;AA8HD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CA4C3J;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAGrE"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP server setup using @modelcontextprotocol/sdk.
|
|
3
|
+
* @module server/mcp
|
|
4
|
+
*/
|
|
5
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
6
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
/**
|
|
9
|
+
* Create and configure MCP server from manifest.
|
|
10
|
+
*/
|
|
11
|
+
export function createMcpServer(options) {
|
|
12
|
+
const { manifest, onToolCall, onResourceRead, onPromptGet } = options;
|
|
13
|
+
// Build server options
|
|
14
|
+
const serverOptions = {
|
|
15
|
+
capabilities: {
|
|
16
|
+
tools: {},
|
|
17
|
+
resources: {},
|
|
18
|
+
prompts: {},
|
|
19
|
+
},
|
|
20
|
+
...(manifest.instructions ? { instructions: manifest.instructions } : {}),
|
|
21
|
+
};
|
|
22
|
+
// Create server instance
|
|
23
|
+
const server = new McpServer({
|
|
24
|
+
name: manifest.name,
|
|
25
|
+
version: manifest.version,
|
|
26
|
+
}, serverOptions);
|
|
27
|
+
// Register tools
|
|
28
|
+
for (const tool of manifest.tools ?? []) {
|
|
29
|
+
registerTool(server, tool, onToolCall);
|
|
30
|
+
}
|
|
31
|
+
// Register resources
|
|
32
|
+
for (const resource of manifest.resources ?? []) {
|
|
33
|
+
registerResource(server, resource, onResourceRead);
|
|
34
|
+
}
|
|
35
|
+
// Register prompts
|
|
36
|
+
for (const prompt of manifest.prompts ?? []) {
|
|
37
|
+
registerPrompt(server, prompt, onPromptGet);
|
|
38
|
+
}
|
|
39
|
+
return server;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Register a tool with the MCP server.
|
|
43
|
+
*/
|
|
44
|
+
function registerTool(server, tool, onToolCall) {
|
|
45
|
+
// Convert JSON Schema to Zod schema
|
|
46
|
+
const zodSchema = jsonSchemaToZod(tool.inputSchema);
|
|
47
|
+
// Build tool options
|
|
48
|
+
const toolOptions = {
|
|
49
|
+
description: tool.description,
|
|
50
|
+
inputSchema: zodSchema,
|
|
51
|
+
};
|
|
52
|
+
if (tool.title) {
|
|
53
|
+
toolOptions.title = tool.title;
|
|
54
|
+
}
|
|
55
|
+
if (tool.annotations) {
|
|
56
|
+
toolOptions.annotations = tool.annotations;
|
|
57
|
+
}
|
|
58
|
+
server.registerTool(tool.name, toolOptions, async (input) => {
|
|
59
|
+
const result = await onToolCall(tool.name, input);
|
|
60
|
+
return result;
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Register a resource with the MCP server.
|
|
65
|
+
*/
|
|
66
|
+
function registerResource(server, resource, onResourceRead) {
|
|
67
|
+
if (!onResourceRead)
|
|
68
|
+
return;
|
|
69
|
+
const resourceOptions = {};
|
|
70
|
+
if (resource.description) {
|
|
71
|
+
resourceOptions.description = resource.description;
|
|
72
|
+
}
|
|
73
|
+
if (resource.mimeType) {
|
|
74
|
+
resourceOptions.mimeType = resource.mimeType;
|
|
75
|
+
}
|
|
76
|
+
server.registerResource(resource.name, resource.uri, resourceOptions, async (uri) => {
|
|
77
|
+
const content = await onResourceRead(uri.href);
|
|
78
|
+
const contents = {
|
|
79
|
+
uri: uri.href,
|
|
80
|
+
text: content,
|
|
81
|
+
};
|
|
82
|
+
if (resource.mimeType) {
|
|
83
|
+
contents.mimeType = resource.mimeType;
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
contents: [contents],
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Register a prompt with the MCP server.
|
|
92
|
+
*/
|
|
93
|
+
function registerPrompt(server, prompt, onPromptGet) {
|
|
94
|
+
if (!onPromptGet)
|
|
95
|
+
return;
|
|
96
|
+
// Build Zod schema from prompt args
|
|
97
|
+
const argsSchemaRecord = {};
|
|
98
|
+
for (const arg of prompt.args ?? []) {
|
|
99
|
+
let schema = z.string();
|
|
100
|
+
if (arg.description) {
|
|
101
|
+
schema = schema.describe(arg.description);
|
|
102
|
+
}
|
|
103
|
+
if (!arg.required) {
|
|
104
|
+
schema = schema.optional();
|
|
105
|
+
}
|
|
106
|
+
argsSchemaRecord[arg.name] = schema;
|
|
107
|
+
}
|
|
108
|
+
server.registerPrompt(prompt.name, {
|
|
109
|
+
description: prompt.description,
|
|
110
|
+
...(prompt.title ? { title: prompt.title } : {}),
|
|
111
|
+
...(Object.keys(argsSchemaRecord).length > 0 ? { argsSchema: argsSchemaRecord } : {}),
|
|
112
|
+
}, async (args) => {
|
|
113
|
+
const result = await onPromptGet(prompt.name, args);
|
|
114
|
+
return {
|
|
115
|
+
...(result.description ? { description: result.description } : {}),
|
|
116
|
+
messages: result.messages.map((msg) => ({
|
|
117
|
+
role: msg.role,
|
|
118
|
+
content: msg.content,
|
|
119
|
+
})),
|
|
120
|
+
};
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Convert JSON Schema to Zod schema.
|
|
125
|
+
* This is a simplified implementation for basic types.
|
|
126
|
+
*/
|
|
127
|
+
export function jsonSchemaToZod(schema) {
|
|
128
|
+
const shape = {};
|
|
129
|
+
if (schema.type === 'object' && schema.properties) {
|
|
130
|
+
for (const [key, prop] of Object.entries(schema.properties)) {
|
|
131
|
+
const propSchema = prop;
|
|
132
|
+
let zodType;
|
|
133
|
+
switch (propSchema.type) {
|
|
134
|
+
case 'string':
|
|
135
|
+
zodType = z.string();
|
|
136
|
+
break;
|
|
137
|
+
case 'number':
|
|
138
|
+
case 'integer':
|
|
139
|
+
zodType = z.number();
|
|
140
|
+
break;
|
|
141
|
+
case 'boolean':
|
|
142
|
+
zodType = z.boolean();
|
|
143
|
+
break;
|
|
144
|
+
case 'array':
|
|
145
|
+
zodType = z.array(z.unknown());
|
|
146
|
+
break;
|
|
147
|
+
case 'object':
|
|
148
|
+
zodType = z.record(z.unknown());
|
|
149
|
+
break;
|
|
150
|
+
default:
|
|
151
|
+
zodType = z.unknown();
|
|
152
|
+
}
|
|
153
|
+
if (propSchema.description) {
|
|
154
|
+
zodType = zodType.describe(propSchema.description);
|
|
155
|
+
}
|
|
156
|
+
// Check if required
|
|
157
|
+
const isRequired = schema.required?.includes(key);
|
|
158
|
+
if (!isRequired) {
|
|
159
|
+
zodType = zodType.optional();
|
|
160
|
+
}
|
|
161
|
+
shape[key] = zodType;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return z.object(shape);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Start the MCP server with stdio transport.
|
|
168
|
+
*/
|
|
169
|
+
export async function startMcpServer(server) {
|
|
170
|
+
const transport = new StdioServerTransport();
|
|
171
|
+
await server.connect(transport);
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/server/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/worker/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/worker/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker process manager.
|
|
3
|
+
* @module worker/process
|
|
4
|
+
*/
|
|
5
|
+
import { WorkerRequest, WorkerResponse } from './protocol.js';
|
|
6
|
+
import type { AuditLogger } from '../audit/logger.js';
|
|
7
|
+
/**
|
|
8
|
+
* Worker process options.
|
|
9
|
+
*/
|
|
10
|
+
export interface WorkerOptions {
|
|
11
|
+
/** Worker process timeout in ms (default: 60000) */
|
|
12
|
+
timeout?: number;
|
|
13
|
+
/** Maximum restart attempts (default: 2) */
|
|
14
|
+
maxRestarts?: number;
|
|
15
|
+
/** Logger function */
|
|
16
|
+
logger?: (level: string, message: string) => void;
|
|
17
|
+
/** Optional audit logger for forwarding worker audit events */
|
|
18
|
+
auditLogger?: AuditLogger;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Worker process manager.
|
|
22
|
+
* Handles spawning, communication, and lifecycle of worker processes.
|
|
23
|
+
*/
|
|
24
|
+
export declare class WorkerManager {
|
|
25
|
+
private worker;
|
|
26
|
+
private isHealthy;
|
|
27
|
+
private pendingRequests;
|
|
28
|
+
private buffer;
|
|
29
|
+
private options;
|
|
30
|
+
constructor(options?: WorkerOptions);
|
|
31
|
+
/**
|
|
32
|
+
* Spawn a new worker process.
|
|
33
|
+
*/
|
|
34
|
+
private spawnWorker;
|
|
35
|
+
/**
|
|
36
|
+
* Handle stdout data from worker.
|
|
37
|
+
*/
|
|
38
|
+
private handleStdout;
|
|
39
|
+
/**
|
|
40
|
+
* Handle a response from the worker.
|
|
41
|
+
*/
|
|
42
|
+
private handleResponse;
|
|
43
|
+
/**
|
|
44
|
+
* Send a request to the worker.
|
|
45
|
+
*/
|
|
46
|
+
private sendRequest;
|
|
47
|
+
/**
|
|
48
|
+
* Kill the worker process.
|
|
49
|
+
*/
|
|
50
|
+
private killWorker;
|
|
51
|
+
/**
|
|
52
|
+
* Ping the worker to check if it's alive.
|
|
53
|
+
*/
|
|
54
|
+
private pingWorker;
|
|
55
|
+
/**
|
|
56
|
+
* Execute an action in the worker.
|
|
57
|
+
*/
|
|
58
|
+
executeAction(request: WorkerRequest): Promise<WorkerResponse>;
|
|
59
|
+
/**
|
|
60
|
+
* Shutdown the worker.
|
|
61
|
+
*/
|
|
62
|
+
shutdown(): Promise<void>;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=process.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/worker/process.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAmBtD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sBAAsB;IACtB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,+DAA+D;IAC/D,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAoBD;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,OAAO,CAA+E;gBAElF,OAAO,GAAE,aAAkB;IAKvC;;OAEG;YACW,WAAW;IAwDzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACH,OAAO,CAAC,cAAc;IAuBtB;;OAEG;IACH,OAAO,CAAC,WAAW;IAyBnB;;OAEG;IACH,OAAO,CAAC,UAAU;IAQlB;;OAEG;YACW,UAAU;IAYxB;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IA2BpE;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAkBhC"}
|