@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.
Files changed (71) hide show
  1. package/README.md +14 -1
  2. package/dist/index.d.ts +5 -0
  3. package/{src/index.mjs → dist/index.js} +8 -10
  4. package/dist/index.js.map +1 -0
  5. package/dist/lib/auth.d.ts +34 -0
  6. package/dist/lib/auth.js +161 -0
  7. package/dist/lib/auth.js.map +1 -0
  8. package/dist/lib/config-local.d.ts +1 -0
  9. package/dist/lib/config-local.js +719 -0
  10. package/dist/lib/config-local.js.map +1 -0
  11. package/dist/lib/extension-search-tools.d.ts +59 -0
  12. package/dist/lib/extension-search-tools.js +483 -0
  13. package/dist/lib/extension-search-tools.js.map +1 -0
  14. package/dist/lib/fetch.d.ts +28 -0
  15. package/dist/lib/fetch.js +106 -0
  16. package/dist/lib/fetch.js.map +1 -0
  17. package/dist/lib/mcp-examples.d.ts +99 -0
  18. package/dist/lib/mcp-examples.js +2285 -0
  19. package/dist/lib/mcp-examples.js.map +1 -0
  20. package/dist/lib/mcp-instructions.d.ts +11 -0
  21. package/dist/lib/mcp-instructions.js +78 -0
  22. package/dist/lib/mcp-instructions.js.map +1 -0
  23. package/dist/lib/mutation-guards.d.ts +33 -0
  24. package/dist/lib/mutation-guards.js +106 -0
  25. package/dist/lib/mutation-guards.js.map +1 -0
  26. package/dist/lib/platform-operation-tools.d.ts +12 -0
  27. package/dist/lib/platform-operation-tools.js +2304 -0
  28. package/dist/lib/platform-operation-tools.js.map +1 -0
  29. package/dist/lib/required-knowledge.d.ts +32 -0
  30. package/dist/lib/required-knowledge.js +181 -0
  31. package/dist/lib/required-knowledge.js.map +1 -0
  32. package/dist/lib/response-format.d.ts +7 -0
  33. package/dist/lib/response-format.js +179 -0
  34. package/dist/lib/response-format.js.map +1 -0
  35. package/dist/lib/route-guards.d.ts +1 -0
  36. package/dist/lib/route-guards.js +19 -0
  37. package/dist/lib/route-guards.js.map +1 -0
  38. package/dist/lib/route-permission-tools.d.ts +91 -0
  39. package/dist/lib/route-permission-tools.js +151 -0
  40. package/dist/lib/route-permission-tools.js.map +1 -0
  41. package/dist/lib/source-artifacts.d.ts +27 -0
  42. package/dist/lib/source-artifacts.js +82 -0
  43. package/dist/lib/source-artifacts.js.map +1 -0
  44. package/dist/lib/table-tools.d.ts +62 -0
  45. package/dist/lib/table-tools.js +774 -0
  46. package/dist/lib/table-tools.js.map +1 -0
  47. package/dist/lib/tool-routing.d.ts +297 -0
  48. package/dist/lib/tool-routing.js +585 -0
  49. package/dist/lib/tool-routing.js.map +1 -0
  50. package/dist/lib/types.d.ts +17 -0
  51. package/dist/lib/types.js +2 -0
  52. package/dist/lib/types.js.map +1 -0
  53. package/dist/mcp-server-entry.d.ts +4 -0
  54. package/dist/mcp-server-entry.js +2787 -0
  55. package/dist/mcp-server-entry.js.map +1 -0
  56. package/package.json +17 -10
  57. package/src/lib/auth.js +0 -179
  58. package/src/lib/config-local.mjs +0 -718
  59. package/src/lib/fetch.js +0 -111
  60. package/src/lib/mcp-examples.js +0 -2289
  61. package/src/lib/mcp-instructions.js +0 -80
  62. package/src/lib/mutation-guards.js +0 -118
  63. package/src/lib/platform-operation-tools.js +0 -2616
  64. package/src/lib/required-knowledge.js +0 -188
  65. package/src/lib/response-format.js +0 -187
  66. package/src/lib/route-guards.js +0 -24
  67. package/src/lib/route-permission-tools.js +0 -160
  68. package/src/lib/source-artifacts.js +0 -82
  69. package/src/lib/table-tools.js +0 -907
  70. package/src/lib/tool-routing.js +0 -589
  71. 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;