@enfyra/mcp-server 0.1.13 → 0.1.15
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 +14 -1
- package/dist/index.d.ts +5 -0
- package/{src/index.mjs → dist/index.js} +8 -10
- package/dist/index.js.map +1 -0
- package/dist/lib/auth.d.ts +34 -0
- package/dist/lib/auth.js +161 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/config-local.d.ts +1 -0
- package/dist/lib/config-local.js +719 -0
- package/dist/lib/config-local.js.map +1 -0
- package/dist/lib/extension-search-tools.d.ts +59 -0
- package/dist/lib/extension-search-tools.js +483 -0
- package/dist/lib/extension-search-tools.js.map +1 -0
- package/dist/lib/fetch.d.ts +28 -0
- package/dist/lib/fetch.js +106 -0
- package/dist/lib/fetch.js.map +1 -0
- package/dist/lib/mcp-examples.d.ts +99 -0
- package/dist/lib/mcp-examples.js +2285 -0
- package/dist/lib/mcp-examples.js.map +1 -0
- package/dist/lib/mcp-instructions.d.ts +11 -0
- package/dist/lib/mcp-instructions.js +78 -0
- package/dist/lib/mcp-instructions.js.map +1 -0
- package/dist/lib/mutation-guards.d.ts +33 -0
- package/dist/lib/mutation-guards.js +106 -0
- package/dist/lib/mutation-guards.js.map +1 -0
- package/dist/lib/platform-operation-tools.d.ts +12 -0
- package/dist/lib/platform-operation-tools.js +2304 -0
- package/dist/lib/platform-operation-tools.js.map +1 -0
- package/dist/lib/required-knowledge.d.ts +32 -0
- package/dist/lib/required-knowledge.js +181 -0
- package/dist/lib/required-knowledge.js.map +1 -0
- package/dist/lib/response-format.d.ts +7 -0
- package/dist/lib/response-format.js +179 -0
- package/dist/lib/response-format.js.map +1 -0
- package/dist/lib/route-guards.d.ts +1 -0
- package/dist/lib/route-guards.js +19 -0
- package/dist/lib/route-guards.js.map +1 -0
- package/dist/lib/route-permission-tools.d.ts +91 -0
- package/dist/lib/route-permission-tools.js +151 -0
- package/dist/lib/route-permission-tools.js.map +1 -0
- package/dist/lib/source-artifacts.d.ts +27 -0
- package/dist/lib/source-artifacts.js +82 -0
- package/dist/lib/source-artifacts.js.map +1 -0
- package/dist/lib/table-tools.d.ts +62 -0
- package/dist/lib/table-tools.js +774 -0
- package/dist/lib/table-tools.js.map +1 -0
- package/dist/lib/tool-routing.d.ts +297 -0
- package/dist/lib/tool-routing.js +585 -0
- package/dist/lib/tool-routing.js.map +1 -0
- package/dist/lib/types.d.ts +17 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/mcp-server-entry.d.ts +4 -0
- package/dist/mcp-server-entry.js +2787 -0
- package/dist/mcp-server-entry.js.map +1 -0
- package/package.json +17 -10
- package/src/lib/auth.js +0 -179
- package/src/lib/config-local.mjs +0 -718
- package/src/lib/fetch.js +0 -111
- package/src/lib/mcp-examples.js +0 -2289
- package/src/lib/mcp-instructions.js +0 -80
- package/src/lib/mutation-guards.js +0 -118
- package/src/lib/platform-operation-tools.js +0 -2616
- package/src/lib/required-knowledge.js +0 -188
- package/src/lib/response-format.js +0 -187
- package/src/lib/route-guards.js +0 -24
- package/src/lib/route-permission-tools.js +0 -160
- package/src/lib/source-artifacts.js +0 -82
- package/src/lib/table-tools.js +0 -907
- package/src/lib/tool-routing.js +0 -589
- package/src/mcp-server-entry.mjs +0 -3177
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client module for Enfyra MCP Server
|
|
3
|
+
* Handles API requests with auth, timeout, and error handling
|
|
4
|
+
*/
|
|
5
|
+
type FetchApiOptions = RequestInit & {
|
|
6
|
+
headers?: Record<string, string>;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Make HTTP request to Enfyra API
|
|
10
|
+
* @param {string} apiUrl - Base API URL
|
|
11
|
+
* @param {string} path - Request path
|
|
12
|
+
* @param {object} options - Fetch options
|
|
13
|
+
* @returns {Promise<any>} Response data
|
|
14
|
+
*/
|
|
15
|
+
export declare function fetchAPI(apiUrl: string, path: string, options?: FetchApiOptions): Promise<any>;
|
|
16
|
+
/**
|
|
17
|
+
* Validate filter JSON and check for injection patterns
|
|
18
|
+
* @param {string} filterStr - Filter JSON string
|
|
19
|
+
* @returns {object|null} Parsed filter object
|
|
20
|
+
*/
|
|
21
|
+
export declare function validateFilter(filterStr: string): any;
|
|
22
|
+
/**
|
|
23
|
+
* Validate table name (alphanumeric, underscores only)
|
|
24
|
+
* @param {string} tableName - Table name to validate
|
|
25
|
+
* @returns {string} Validated table name
|
|
26
|
+
*/
|
|
27
|
+
export declare function validateTableName(tableName: string): string;
|
|
28
|
+
export {};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client module for Enfyra MCP Server
|
|
3
|
+
* Handles API requests with auth, timeout, and error handling
|
|
4
|
+
*/
|
|
5
|
+
import { getValidToken, hasApiToken, resetTokens } from './auth.js';
|
|
6
|
+
// Timeout configuration
|
|
7
|
+
const FETCH_TIMEOUT = 30000; // 30 seconds
|
|
8
|
+
/**
|
|
9
|
+
* Make HTTP request to Enfyra API
|
|
10
|
+
* @param {string} apiUrl - Base API URL
|
|
11
|
+
* @param {string} path - Request path
|
|
12
|
+
* @param {object} options - Fetch options
|
|
13
|
+
* @returns {Promise<any>} Response data
|
|
14
|
+
*/
|
|
15
|
+
export async function fetchAPI(apiUrl, path, options = {}) {
|
|
16
|
+
const url = `${apiUrl}${path}`;
|
|
17
|
+
async function requestWithCurrentToken() {
|
|
18
|
+
const token = await getValidToken(apiUrl);
|
|
19
|
+
const headersList = [
|
|
20
|
+
['Content-Type', 'application/json'],
|
|
21
|
+
['Authorization', `Bearer ${token}`],
|
|
22
|
+
];
|
|
23
|
+
if (options.headers) {
|
|
24
|
+
const optHeaders = options.headers;
|
|
25
|
+
for (const key of Object.keys(optHeaders)) {
|
|
26
|
+
const existingIdx = headersList.findIndex(h => h[0] === key);
|
|
27
|
+
if (existingIdx >= 0) {
|
|
28
|
+
headersList[existingIdx] = [key, optHeaders[key]];
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
headersList.push([key, optHeaders[key]]);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const controller = new AbortController();
|
|
36
|
+
const timeoutId = setTimeout(() => controller.abort(), FETCH_TIMEOUT);
|
|
37
|
+
try {
|
|
38
|
+
const res = await fetch(url, {
|
|
39
|
+
...options,
|
|
40
|
+
headers: headersList,
|
|
41
|
+
signal: controller.signal,
|
|
42
|
+
});
|
|
43
|
+
clearTimeout(timeoutId);
|
|
44
|
+
return res;
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
clearTimeout(timeoutId);
|
|
48
|
+
if (error.name === 'AbortError') {
|
|
49
|
+
throw new Error(`Request timeout after ${FETCH_TIMEOUT}ms`);
|
|
50
|
+
}
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
let res = await requestWithCurrentToken();
|
|
55
|
+
if ((res.status === 401 || res.status === 403) && hasApiToken()) {
|
|
56
|
+
resetTokens();
|
|
57
|
+
res = await requestWithCurrentToken();
|
|
58
|
+
}
|
|
59
|
+
if (!res.ok) {
|
|
60
|
+
const error = await res.text().catch(() => res.statusText);
|
|
61
|
+
throw new Error(`API error (${res.status}): ${error}`);
|
|
62
|
+
}
|
|
63
|
+
return res.json();
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Validate filter JSON and check for injection patterns
|
|
67
|
+
* @param {string} filterStr - Filter JSON string
|
|
68
|
+
* @returns {object|null} Parsed filter object
|
|
69
|
+
*/
|
|
70
|
+
export function validateFilter(filterStr) {
|
|
71
|
+
if (!filterStr)
|
|
72
|
+
return null;
|
|
73
|
+
try {
|
|
74
|
+
const parsed = JSON.parse(filterStr);
|
|
75
|
+
// Check depth limit (max 10 levels)
|
|
76
|
+
function checkDepth(obj, depth = 0) {
|
|
77
|
+
if (depth > 10) {
|
|
78
|
+
throw new Error('Filter depth exceeds maximum of 10 levels');
|
|
79
|
+
}
|
|
80
|
+
if (obj && typeof obj === 'object') {
|
|
81
|
+
for (const key of Object.keys(obj)) {
|
|
82
|
+
checkDepth(obj[key], depth + 1);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
checkDepth(parsed);
|
|
87
|
+
return parsed;
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
if (e.message.includes('depth'))
|
|
91
|
+
throw e;
|
|
92
|
+
throw new Error(`Invalid filter JSON: ${e.message}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Validate table name (alphanumeric, underscores only)
|
|
97
|
+
* @param {string} tableName - Table name to validate
|
|
98
|
+
* @returns {string} Validated table name
|
|
99
|
+
*/
|
|
100
|
+
export function validateTableName(tableName) {
|
|
101
|
+
if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(tableName)) {
|
|
102
|
+
throw new Error(`Invalid table name: ${tableName}. Must start with letter/underscore and contain only alphanumeric characters and underscores.`);
|
|
103
|
+
}
|
|
104
|
+
return tableName;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/lib/fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
export declare const EXAMPLE_REASONING_GUIDE: string[];
|
|
2
|
+
export declare const EXAMPLE_CATEGORIES: {
|
|
3
|
+
'ssr-app-auth': {
|
|
4
|
+
title: string;
|
|
5
|
+
useWhen: string;
|
|
6
|
+
examples: {
|
|
7
|
+
name: string;
|
|
8
|
+
code: string;
|
|
9
|
+
notes: string[];
|
|
10
|
+
}[];
|
|
11
|
+
};
|
|
12
|
+
'oauth-setup': {
|
|
13
|
+
title: string;
|
|
14
|
+
useWhen: string;
|
|
15
|
+
examples: {
|
|
16
|
+
name: string;
|
|
17
|
+
code: string;
|
|
18
|
+
notes: string[];
|
|
19
|
+
}[];
|
|
20
|
+
};
|
|
21
|
+
'schema-relations': {
|
|
22
|
+
title: string;
|
|
23
|
+
useWhen: string;
|
|
24
|
+
examples: {
|
|
25
|
+
name: string;
|
|
26
|
+
code: string;
|
|
27
|
+
notes: string[];
|
|
28
|
+
}[];
|
|
29
|
+
};
|
|
30
|
+
'queries-deep': {
|
|
31
|
+
title: string;
|
|
32
|
+
useWhen: string;
|
|
33
|
+
examples: {
|
|
34
|
+
name: string;
|
|
35
|
+
code: string;
|
|
36
|
+
notes: string[];
|
|
37
|
+
}[];
|
|
38
|
+
};
|
|
39
|
+
'handlers-hooks': {
|
|
40
|
+
title: string;
|
|
41
|
+
useWhen: string;
|
|
42
|
+
examples: {
|
|
43
|
+
name: string;
|
|
44
|
+
code: string;
|
|
45
|
+
notes: string[];
|
|
46
|
+
}[];
|
|
47
|
+
};
|
|
48
|
+
'permissions-rls': {
|
|
49
|
+
title: string;
|
|
50
|
+
useWhen: string;
|
|
51
|
+
examples: {
|
|
52
|
+
name: string;
|
|
53
|
+
code: string;
|
|
54
|
+
notes: string[];
|
|
55
|
+
}[];
|
|
56
|
+
};
|
|
57
|
+
websocket: {
|
|
58
|
+
title: string;
|
|
59
|
+
useWhen: string;
|
|
60
|
+
examples: {
|
|
61
|
+
name: string;
|
|
62
|
+
code: string;
|
|
63
|
+
notes: string[];
|
|
64
|
+
}[];
|
|
65
|
+
};
|
|
66
|
+
flows: {
|
|
67
|
+
title: string;
|
|
68
|
+
useWhen: string;
|
|
69
|
+
examples: {
|
|
70
|
+
name: string;
|
|
71
|
+
code: string;
|
|
72
|
+
notes: string[];
|
|
73
|
+
}[];
|
|
74
|
+
};
|
|
75
|
+
files: {
|
|
76
|
+
title: string;
|
|
77
|
+
useWhen: string;
|
|
78
|
+
examples: {
|
|
79
|
+
name: string;
|
|
80
|
+
code: string;
|
|
81
|
+
notes: string[];
|
|
82
|
+
}[];
|
|
83
|
+
};
|
|
84
|
+
extensions: {
|
|
85
|
+
title: string;
|
|
86
|
+
useWhen: string;
|
|
87
|
+
examples: {
|
|
88
|
+
name: string;
|
|
89
|
+
code: string;
|
|
90
|
+
notes: string[];
|
|
91
|
+
}[];
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
export declare function listExampleCategories(): {
|
|
95
|
+
key: string;
|
|
96
|
+
title: string;
|
|
97
|
+
useWhen: string;
|
|
98
|
+
}[];
|
|
99
|
+
export declare function getExamples(category: any): any;
|