@enfyra/mcp-server 0.1.69 → 0.1.70

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 (244) hide show
  1. package/dist/lib/config-local-adapters.d.ts +18 -0
  2. package/dist/lib/config-local-adapters.js +270 -0
  3. package/dist/lib/config-local-adapters.js.map +1 -0
  4. package/dist/lib/config-local-contracts.d.ts +28 -0
  5. package/dist/lib/config-local-contracts.js +200 -0
  6. package/dist/lib/config-local-contracts.js.map +1 -0
  7. package/dist/lib/config-local-prompts.d.ts +10 -0
  8. package/dist/lib/config-local-prompts.js +185 -0
  9. package/dist/lib/config-local-prompts.js.map +1 -0
  10. package/dist/lib/config-local-types.d.ts +23 -0
  11. package/dist/lib/config-local-types.js +2 -0
  12. package/dist/lib/config-local-types.js.map +1 -0
  13. package/dist/lib/config-local.js +3 -649
  14. package/dist/lib/config-local.js.map +1 -1
  15. package/dist/lib/discovery-tools.d.ts +4 -0
  16. package/dist/lib/discovery-tools.js +546 -0
  17. package/dist/lib/discovery-tools.js.map +1 -0
  18. package/dist/lib/dynamic-repository-builder.d.ts +1 -1
  19. package/dist/lib/dynamic-script-context-contract.d.ts +100 -0
  20. package/dist/lib/dynamic-script-context-contract.js +163 -0
  21. package/dist/lib/dynamic-script-context-contract.js.map +1 -0
  22. package/dist/lib/enfyra-mcp-server.d.ts +3 -0
  23. package/dist/lib/enfyra-mcp-server.js +79 -0
  24. package/dist/lib/enfyra-mcp-server.js.map +1 -0
  25. package/dist/lib/enfyra-tool-logic.d.ts +7 -0
  26. package/dist/lib/enfyra-tool-logic.js +8 -0
  27. package/dist/lib/enfyra-tool-logic.js.map +1 -0
  28. package/dist/lib/enfyra-tool-types.d.ts +27 -0
  29. package/dist/lib/enfyra-tool-types.js +2 -0
  30. package/dist/lib/enfyra-tool-types.js.map +1 -0
  31. package/dist/lib/extension-api-builders.d.ts +17 -0
  32. package/dist/lib/extension-api-builders.js +235 -0
  33. package/dist/lib/extension-api-builders.js.map +1 -0
  34. package/dist/lib/extension-component-builders.d.ts +87 -0
  35. package/dist/lib/extension-component-builders.js +623 -0
  36. package/dist/lib/extension-component-builders.js.map +1 -0
  37. package/dist/lib/extension-contract-review.d.ts +26 -0
  38. package/dist/lib/extension-contract-review.js +187 -0
  39. package/dist/lib/extension-contract-review.js.map +1 -0
  40. package/dist/lib/extension-theme-contract.d.ts +63 -0
  41. package/dist/lib/extension-theme-contract.js +417 -0
  42. package/dist/lib/extension-theme-contract.js.map +1 -0
  43. package/dist/lib/identity-tools.d.ts +4 -0
  44. package/dist/lib/identity-tools.js +46 -0
  45. package/dist/lib/identity-tools.js.map +1 -0
  46. package/dist/lib/log-tools.d.ts +4 -0
  47. package/dist/lib/log-tools.js +65 -0
  48. package/dist/lib/log-tools.js.map +1 -0
  49. package/dist/lib/mcp-example-connect.d.ts +9 -0
  50. package/dist/lib/mcp-example-connect.js +442 -0
  51. package/dist/lib/mcp-example-connect.js.map +1 -0
  52. package/dist/lib/mcp-example-extensions.d.ts +9 -0
  53. package/dist/lib/mcp-example-extensions.js +729 -0
  54. package/dist/lib/mcp-example-extensions.js.map +1 -0
  55. package/dist/lib/mcp-example-files.d.ts +9 -0
  56. package/dist/lib/mcp-example-files.js +51 -0
  57. package/dist/lib/mcp-example-files.js.map +1 -0
  58. package/dist/lib/mcp-example-flows.d.ts +9 -0
  59. package/dist/lib/mcp-example-flows.js +76 -0
  60. package/dist/lib/mcp-example-flows.js.map +1 -0
  61. package/dist/lib/mcp-example-graphql.d.ts +9 -0
  62. package/dist/lib/mcp-example-graphql.js +57 -0
  63. package/dist/lib/mcp-example-graphql.js.map +1 -0
  64. package/dist/lib/mcp-example-handlers-hooks.d.ts +9 -0
  65. package/dist/lib/mcp-example-handlers-hooks.js +328 -0
  66. package/dist/lib/mcp-example-handlers-hooks.js.map +1 -0
  67. package/dist/lib/mcp-example-oauth-setup.d.ts +9 -0
  68. package/dist/lib/mcp-example-oauth-setup.js +41 -0
  69. package/dist/lib/mcp-example-oauth-setup.js.map +1 -0
  70. package/dist/lib/mcp-example-permissions-rls.d.ts +9 -0
  71. package/dist/lib/mcp-example-permissions-rls.js +210 -0
  72. package/dist/lib/mcp-example-permissions-rls.js.map +1 -0
  73. package/dist/lib/mcp-example-queries-deep.d.ts +9 -0
  74. package/dist/lib/mcp-example-queries-deep.js +220 -0
  75. package/dist/lib/mcp-example-queries-deep.js.map +1 -0
  76. package/dist/lib/mcp-example-schema-relations.d.ts +9 -0
  77. package/dist/lib/mcp-example-schema-relations.js +148 -0
  78. package/dist/lib/mcp-example-schema-relations.js.map +1 -0
  79. package/dist/lib/mcp-example-websocket.d.ts +9 -0
  80. package/dist/lib/mcp-example-websocket.js +103 -0
  81. package/dist/lib/mcp-example-websocket.js.map +1 -0
  82. package/dist/lib/mcp-examples.d.ts +5 -5
  83. package/dist/lib/mcp-examples.js +22 -2394
  84. package/dist/lib/mcp-examples.js.map +1 -1
  85. package/dist/lib/method-tools.d.ts +4 -0
  86. package/dist/lib/method-tools.js +217 -0
  87. package/dist/lib/method-tools.js.map +1 -0
  88. package/dist/lib/package-tools.d.ts +4 -0
  89. package/dist/lib/package-tools.js +98 -0
  90. package/dist/lib/package-tools.js.map +1 -0
  91. package/dist/lib/platform-data-operations.d.ts +24 -0
  92. package/dist/lib/platform-data-operations.js +71 -0
  93. package/dist/lib/platform-data-operations.js.map +1 -0
  94. package/dist/lib/platform-endpoint-workflow.d.ts +42 -0
  95. package/dist/lib/platform-endpoint-workflow.js +382 -0
  96. package/dist/lib/platform-endpoint-workflow.js.map +1 -0
  97. package/dist/lib/platform-extension-source.d.ts +487 -0
  98. package/dist/lib/platform-extension-source.js +524 -0
  99. package/dist/lib/platform-extension-source.js.map +1 -0
  100. package/dist/lib/platform-extension-tools.d.ts +1 -0
  101. package/dist/lib/platform-extension-tools.js +416 -0
  102. package/dist/lib/platform-extension-tools.js.map +1 -0
  103. package/dist/lib/platform-extension-ui.d.ts +4 -0
  104. package/dist/lib/platform-extension-ui.js +5 -0
  105. package/dist/lib/platform-extension-ui.js.map +1 -0
  106. package/dist/lib/platform-extension-workflow.d.ts +54 -0
  107. package/dist/lib/platform-extension-workflow.js +194 -0
  108. package/dist/lib/platform-extension-workflow.js.map +1 -0
  109. package/dist/lib/platform-flow-operations.d.ts +554 -0
  110. package/dist/lib/platform-flow-operations.js +317 -0
  111. package/dist/lib/platform-flow-operations.js.map +1 -0
  112. package/dist/lib/platform-flow-tools.d.ts +1 -0
  113. package/dist/lib/platform-flow-tools.js +248 -0
  114. package/dist/lib/platform-flow-tools.js.map +1 -0
  115. package/dist/lib/platform-operation-logic.d.ts +10 -0
  116. package/dist/lib/platform-operation-logic.js +11 -0
  117. package/dist/lib/platform-operation-logic.js.map +1 -0
  118. package/dist/lib/platform-operation-tools.d.ts +1 -324
  119. package/dist/lib/platform-operation-tools.js +13 -4620
  120. package/dist/lib/platform-operation-tools.js.map +1 -1
  121. package/dist/lib/platform-operation-types.d.ts +46 -0
  122. package/dist/lib/platform-operation-types.js +2 -0
  123. package/dist/lib/platform-operation-types.js.map +1 -0
  124. package/dist/lib/platform-policy-tools.d.ts +1 -0
  125. package/dist/lib/platform-policy-tools.js +248 -0
  126. package/dist/lib/platform-policy-tools.js.map +1 -0
  127. package/dist/lib/platform-resource-operations.d.ts +124 -0
  128. package/dist/lib/platform-resource-operations.js +109 -0
  129. package/dist/lib/platform-resource-operations.js.map +1 -0
  130. package/dist/lib/platform-resource-tools.d.ts +1 -0
  131. package/dist/lib/platform-resource-tools.js +70 -0
  132. package/dist/lib/platform-resource-tools.js.map +1 -0
  133. package/dist/lib/platform-route-operations.d.ts +222 -0
  134. package/dist/lib/platform-route-operations.js +290 -0
  135. package/dist/lib/platform-route-operations.js.map +1 -0
  136. package/dist/lib/platform-route-tools.d.ts +1 -0
  137. package/dist/lib/platform-route-tools.js +307 -0
  138. package/dist/lib/platform-route-tools.js.map +1 -0
  139. package/dist/lib/platform-shared-operations.d.ts +7 -0
  140. package/dist/lib/platform-shared-operations.js +4 -0
  141. package/dist/lib/platform-shared-operations.js.map +1 -0
  142. package/dist/lib/platform-websocket-tools.d.ts +1 -0
  143. package/dist/lib/platform-websocket-tools.js +70 -0
  144. package/dist/lib/platform-websocket-tools.js.map +1 -0
  145. package/dist/lib/record-tools.d.ts +4 -0
  146. package/dist/lib/record-tools.js +418 -0
  147. package/dist/lib/record-tools.js.map +1 -0
  148. package/dist/lib/required-knowledge.d.ts +1 -1
  149. package/dist/lib/required-knowledge.js +3 -2
  150. package/dist/lib/required-knowledge.js.map +1 -1
  151. package/dist/lib/route-access-tools.d.ts +4 -0
  152. package/dist/lib/route-access-tools.js +172 -0
  153. package/dist/lib/route-access-tools.js.map +1 -0
  154. package/dist/lib/route-definition-tools.d.ts +4 -0
  155. package/dist/lib/route-definition-tools.js +285 -0
  156. package/dist/lib/route-definition-tools.js.map +1 -0
  157. package/dist/lib/route-inspection-tools.d.ts +4 -0
  158. package/dist/lib/route-inspection-tools.js +319 -0
  159. package/dist/lib/route-inspection-tools.js.map +1 -0
  160. package/dist/lib/route-tools.d.ts +1 -0
  161. package/dist/lib/route-tools.js +9 -0
  162. package/dist/lib/route-tools.js.map +1 -0
  163. package/dist/lib/runtime-zone-registry.d.ts +27 -0
  164. package/dist/lib/runtime-zone-registry.js +81 -0
  165. package/dist/lib/runtime-zone-registry.js.map +1 -0
  166. package/dist/lib/runtime-zone-search.d.ts +303 -0
  167. package/dist/lib/runtime-zone-search.js +596 -0
  168. package/dist/lib/runtime-zone-search.js.map +1 -0
  169. package/dist/lib/runtime-zone-tools.d.ts +2 -307
  170. package/dist/lib/runtime-zone-tools.js +2 -674
  171. package/dist/lib/runtime-zone-tools.js.map +1 -1
  172. package/dist/lib/schema-column-tools.d.ts +3 -0
  173. package/dist/lib/schema-column-tools.js +80 -0
  174. package/dist/lib/schema-column-tools.js.map +1 -0
  175. package/dist/lib/schema-mutation-coordinator.d.ts +28 -0
  176. package/dist/lib/schema-mutation-coordinator.js +154 -0
  177. package/dist/lib/schema-mutation-coordinator.js.map +1 -0
  178. package/dist/lib/schema-relation-contracts.d.ts +39 -0
  179. package/dist/lib/schema-relation-contracts.js +160 -0
  180. package/dist/lib/schema-relation-contracts.js.map +1 -0
  181. package/dist/lib/schema-relation-tools.d.ts +3 -0
  182. package/dist/lib/schema-relation-tools.js +61 -0
  183. package/dist/lib/schema-relation-tools.js.map +1 -0
  184. package/dist/lib/schema-table-contracts.d.ts +28 -0
  185. package/dist/lib/schema-table-contracts.js +263 -0
  186. package/dist/lib/schema-table-contracts.js.map +1 -0
  187. package/dist/lib/schema-table-tools.d.ts +3 -0
  188. package/dist/lib/schema-table-tools.js +297 -0
  189. package/dist/lib/schema-table-tools.js.map +1 -0
  190. package/dist/lib/schema-tool-operations.d.ts +150 -0
  191. package/dist/lib/schema-tool-operations.js +468 -0
  192. package/dist/lib/schema-tool-operations.js.map +1 -0
  193. package/dist/lib/schema-tool-types.d.ts +38 -0
  194. package/dist/lib/schema-tool-types.js +2 -0
  195. package/dist/lib/schema-tool-types.js.map +1 -0
  196. package/dist/lib/schema-verification.d.ts +14 -0
  197. package/dist/lib/schema-verification.js +105 -0
  198. package/dist/lib/schema-verification.js.map +1 -0
  199. package/dist/lib/script-tools.d.ts +4 -0
  200. package/dist/lib/script-tools.js +127 -0
  201. package/dist/lib/script-tools.js.map +1 -0
  202. package/dist/lib/system-tools.d.ts +4 -0
  203. package/dist/lib/system-tools.js +41 -0
  204. package/dist/lib/system-tools.js.map +1 -0
  205. package/dist/lib/table-tool-logic.d.ts +5 -0
  206. package/dist/lib/table-tool-logic.js +6 -0
  207. package/dist/lib/table-tool-logic.js.map +1 -0
  208. package/dist/lib/table-tools.d.ts +1 -84
  209. package/dist/lib/table-tools.js +7 -1522
  210. package/dist/lib/table-tools.js.map +1 -1
  211. package/dist/lib/tool-metadata-operations.d.ts +27 -0
  212. package/dist/lib/tool-metadata-operations.js +93 -0
  213. package/dist/lib/tool-metadata-operations.js.map +1 -0
  214. package/dist/lib/tool-permission-profile.d.ts +37 -0
  215. package/dist/lib/tool-permission-profile.js +106 -0
  216. package/dist/lib/tool-permission-profile.js.map +1 -0
  217. package/dist/lib/tool-record-operations.d.ts +102 -0
  218. package/dist/lib/tool-record-operations.js +260 -0
  219. package/dist/lib/tool-record-operations.js.map +1 -0
  220. package/dist/lib/tool-route-inspection.d.ts +47 -0
  221. package/dist/lib/tool-route-inspection.js +168 -0
  222. package/dist/lib/tool-route-inspection.js.map +1 -0
  223. package/dist/lib/tool-routing.d.ts +3 -417
  224. package/dist/lib/tool-routing.js +3 -1038
  225. package/dist/lib/tool-routing.js.map +1 -1
  226. package/dist/lib/tool-runtime-config.d.ts +33 -0
  227. package/dist/lib/tool-runtime-config.js +237 -0
  228. package/dist/lib/tool-runtime-config.js.map +1 -0
  229. package/dist/lib/tool-script-operations.d.ts +34 -0
  230. package/dist/lib/tool-script-operations.js +153 -0
  231. package/dist/lib/tool-script-operations.js.map +1 -0
  232. package/dist/lib/workflow-definitions.d.ts +366 -0
  233. package/dist/lib/workflow-definitions.js +703 -0
  234. package/dist/lib/workflow-definitions.js.map +1 -0
  235. package/dist/lib/workflow-planner.d.ts +45 -0
  236. package/dist/lib/workflow-planner.js +338 -0
  237. package/dist/lib/workflow-planner.js.map +1 -0
  238. package/dist/lib/workflow-types.d.ts +39 -0
  239. package/dist/lib/workflow-types.js +2 -0
  240. package/dist/lib/workflow-types.js.map +1 -0
  241. package/dist/mcp-server-entry.d.ts +0 -3
  242. package/dist/mcp-server-entry.js +2 -3249
  243. package/dist/mcp-server-entry.js.map +1 -1
  244. package/package.json +1 -1
@@ -0,0 +1,546 @@
1
+ /**
2
+ * Enfyra MCP — stdio server (loaded by index.ts / dist/index.js).
3
+ */
4
+ import { z } from 'zod';
5
+ import { fetchMetadataContext, fetchMetadataTables, fetchTableCatalog, fetchTableMetadata, } from './metadata-client.js';
6
+ import { buildGraphqlUrls } from './mcp-instructions.js';
7
+ import { getExamples, listExampleCategories } from './mcp-examples.js';
8
+ import { WORKFLOW_SURFACES, discoverWorkflowRoutes } from './tool-routing.js';
9
+ import { getSupportedColumnTypesFromMetadata } from './table-tools.js';
10
+ import { buildDynamicScriptContextTypeContract } from './dynamic-script-context-contract.js';
11
+ import { acknowledgeRequiredKnowledge, buildRequiredKnowledgePayload, } from './required-knowledge.js';
12
+ import { jsonContent } from './response-format.js';
13
+ import { CAPABILITY_AREAS, FIELD_PERMISSION_CONDITION_OPERATORS, FILTER_OPERATORS, MCP_DYNAMIC_TOOLS, MCP_PROFILE, asNonEmptyStringTuple, collectPartialErrors, discoveryFetch, getMetadataDatabaseContext, getPrimaryColumn, summarizeRoutes, summarizeTable, targetInstance, unwrapData, } from './enfyra-tool-logic.js';
14
+ export function registerDiscoveryTools(server, ENFYRA_API_URL) {
15
+ // ============================================================================
16
+ // METADATA TOOLS
17
+ // ============================================================================
18
+ server.tool('get_enfyra_required_knowledge', [
19
+ 'Return required Enfyra knowledge and acknowledgement keys for MCP code-writing tools.',
20
+ 'Call this before creating or updating dynamic server code or Enfyra extension code. Read the returned contracts and pass the matching ack key into write tools.',
21
+ 'Pass scope to only load rules for the current task domain: "schema" (table/data/route/permission/guard work), "dynamic-code" (handler/hook/websocket/resolver scripts), "extension" (admin UI/menu/shell), or "flow". Omitting scope returns all rules.',
22
+ ].join(' '), {
23
+ scope: z.enum(['full', 'schema', 'dynamic-code', 'extension', 'flow']).optional().describe('Limit knowledge to one domain. Use full or omit scope to load all rules.'),
24
+ }, async ({ scope }) => {
25
+ const payload = buildRequiredKnowledgePayload(scope);
26
+ const sessionAcknowledgement = acknowledgeRequiredKnowledge(scope);
27
+ return jsonContent({ ...payload, sessionAcknowledgement });
28
+ });
29
+ server.tool('get_all_metadata', 'Get a lightweight table catalog. Use get_table_metadata or inspect_table to fetch one table schema.', {
30
+ includeFull: z.boolean().optional().default(false).describe('Fetch per-table metadata for the selected catalog entries. Default false keeps discovery lightweight.'),
31
+ search: z.string().optional().describe('Optional table-name/alias substring filter.'),
32
+ limit: z.number().optional().describe('Maximum tables returned after search. Default 30.'),
33
+ all: z.boolean().optional().default(false).describe('Return every matched table summary. Use when a complete table list is required.'),
34
+ }, async ({ includeFull, search, limit, all }) => {
35
+ if (all && limit !== undefined) {
36
+ throw new Error('get_all_metadata accepts either all=true or limit, not both.');
37
+ }
38
+ const [context, catalog] = await Promise.all([
39
+ fetchMetadataContext(ENFYRA_API_URL),
40
+ fetchTableCatalog(ENFYRA_API_URL),
41
+ ]);
42
+ const q = search?.trim().toLowerCase();
43
+ const matched = catalog.filter((table) => !q || [table.name, table.alias, table.description]
44
+ .some((value) => String(value || '').toLowerCase().includes(q)));
45
+ const outputLimit = all ? matched.length : (limit || 30);
46
+ const selected = matched.slice(0, outputLimit);
47
+ const payload = {
48
+ context,
49
+ tableCount: catalog.length,
50
+ matchedTableCount: matched.length,
51
+ returnedTableCount: selected.length,
52
+ complete: all || outputLimit >= matched.length,
53
+ hardCap: all ? null : outputLimit,
54
+ search: search || null,
55
+ tables: includeFull
56
+ ? await fetchMetadataTables(ENFYRA_API_URL, selected)
57
+ : selected.map((table) => ({
58
+ id: table.id ?? table._id,
59
+ name: table.name,
60
+ alias: table.alias ?? null,
61
+ description: table.description ?? null,
62
+ isSingleRecord: table.isSingleRecord ?? null,
63
+ detailHint: `Use get_table_metadata({ tableName: "${table.name}" }) for columns and relations.`,
64
+ })),
65
+ detailHint: includeFull
66
+ ? 'Full permission-projected metadata was fetched per selected table.'
67
+ : 'Catalog only. Call get_table_metadata({ tableName }) or inspect_table({ tableName }) for schema detail.',
68
+ };
69
+ return jsonContent(payload);
70
+ });
71
+ server.tool('get_table_metadata', 'Get concise metadata for a specific table by name', {
72
+ tableName: z.string().describe('Table name (e.g., "enfyra_user", "enfyra_route")'),
73
+ includeFull: z.boolean().optional().default(false).describe('Return full raw table metadata. Default false to keep MCP context small.'),
74
+ }, async ({ tableName, includeFull }) => {
75
+ const table = await fetchTableMetadata(ENFYRA_API_URL, tableName);
76
+ const payload = includeFull
77
+ ? { data: table, ...await fetchMetadataContext(ENFYRA_API_URL) }
78
+ : {
79
+ table: summarizeTable(table),
80
+ queryHint: `Use query_table({ tableName: "${tableName}", fields: [...] }) for records. query_table without fields returns only the primary key.`,
81
+ };
82
+ return jsonContent(payload);
83
+ });
84
+ server.tool('get_enfyra_examples', [
85
+ 'Return concrete Enfyra examples by category.',
86
+ 'Use this before generating schemas, queries, handlers/hooks, third-app connections, OAuth, Socket.IO, flows, files, or extensions so implementation details follow proven patterns.',
87
+ ].join(' '), {
88
+ category: z.enum(asNonEmptyStringTuple(listExampleCategories().map((item) => item.key), 'Example categories')).optional().describe('Example category key. Omit to list categories.'),
89
+ }, async ({ category }) => {
90
+ const result = getExamples(category);
91
+ return jsonContent(result);
92
+ });
93
+ server.tool('discover_enfyra_workflows', [
94
+ 'Progressive-disclosure router for the Enfyra MCP tool surface.',
95
+ 'Call this when the task intent is clear but the right Enfyra tool path is not.',
96
+ 'Returns matched workflows, first tools, required acknowledgement keys, verification tools, and avoidTools negative-routing boundaries.',
97
+ ].join(' '), {
98
+ intent: z.string().optional().describe('Plain-language task goal, e.g. "add a menu chip when support tickets arrive".'),
99
+ surface: z.enum(WORKFLOW_SURFACES).optional().describe('Known surface when the caller can classify the task. Omit to infer from intent.'),
100
+ risk: z.string().optional().default('unknown').describe('Highest expected operation risk. Preferred values: read, write, destructive, debug, unknown. Natural terms such as low, medium, or high are accepted and normalized.'),
101
+ detail: z.enum(['summary', 'plan', 'full']).optional().default('summary').describe('summary lists candidate workflows; plan adds tool sequence and avoidTools; full also includes matching keywords.'),
102
+ limit: z.number().int().positive().max(10).optional().default(5).describe('Maximum workflows to return.'),
103
+ }, async (input) => jsonContent(discoverWorkflowRoutes(input, MCP_PROFILE, MCP_DYNAMIC_TOOLS)));
104
+ server.tool('discover_enfyra_system', [
105
+ 'Call this first when you need to understand the live Enfyra instance.',
106
+ 'Returns a concise capability map from live metadata/routes/method rows, including schema management, REST route behavior, GraphQL enablement, and relation handling.',
107
+ 'Do not use this only to confirm the API base; use get_enfyra_api_context for that cheaper target check.',
108
+ 'Run broad discovery tools sequentially; do not call multiple broad discovery tools in parallel.',
109
+ ].join(' '), {}, async () => {
110
+ const metadata = await discoveryFetch('/metadata');
111
+ const tableCatalogResult = await discoveryFetch('/enfyra_table?fields=id,name,alias,description,isSingleRecord&limit=0&sort=name');
112
+ const routesResult = await discoveryFetch('/enfyra_route?fields=path,mainTable.name,availableMethods.*,publicMethods.*&limit=1000');
113
+ const methodsResult = await discoveryFetch('/enfyra_method?limit=100');
114
+ const columnMetadata = await discoveryFetch('/metadata/enfyra_column', { fallbackData: null });
115
+ const relationMetadata = await discoveryFetch('/metadata/enfyra_relation', { fallbackData: null });
116
+ const tableMetadata = await discoveryFetch('/metadata/enfyra_table', { fallbackData: null });
117
+ const graphqlMetadata = await discoveryFetch('/metadata/enfyra_graphql', { fallbackData: null });
118
+ const tables = unwrapData(tableCatalogResult);
119
+ const tableNames = tables.map((table) => table?.name).filter(Boolean).sort();
120
+ const routes = summarizeRoutes(routesResult);
121
+ const routeTables = new Set(routes.map((route) => route.mainTable).filter(Boolean));
122
+ const noRouteTables = tableNames.filter((name) => !routeTables.has(name));
123
+ const relationTable = relationMetadata?.data || null;
124
+ const tableDefinition = tableMetadata?.data || null;
125
+ const gqlDefinition = graphqlMetadata?.data || null;
126
+ const routeTableList = [...routeTables].sort();
127
+ const noRouteTableList = noRouteTables.sort();
128
+ const sample = (items, max = 40) => ({
129
+ total: items.length,
130
+ returned: Math.min(items.length, max),
131
+ items: items.slice(0, max),
132
+ truncated: items.length > max,
133
+ });
134
+ const payload = {
135
+ targetInstance: targetInstance(),
136
+ apiBase: ENFYRA_API_URL.replace(/\/$/, ''),
137
+ partialErrors: collectPartialErrors({ metadata, tableCatalogResult, routesResult, methodsResult, columnMetadata, relationMetadata, tableMetadata, graphqlMetadata }),
138
+ counts: {
139
+ tables: tableNames.length,
140
+ routes: routes.length,
141
+ methods: methodsResult?.data?.length || 0,
142
+ },
143
+ methods: (methodsResult?.data || []).map((method) => ({ id: method.id || method._id, name: method.name })),
144
+ capabilityAreas: CAPABILITY_AREAS.map((item) => ({
145
+ ...item,
146
+ presentTables: item.tables.filter((table) => tableNames.includes(table)),
147
+ routeBackedTables: item.tables.filter((table) => routeTables.has(table)),
148
+ noRouteTables: item.tables.filter((table) => tableNames.includes(table) && !routeTables.has(table)),
149
+ })),
150
+ rest: {
151
+ routePattern: 'Dynamic REST routes expose GET/POST at /<route-path> and PATCH/DELETE at /<route-path>/:id; there is no GET /<route-path>/:id.',
152
+ publicAccess: 'publicMethods controls anonymous REST access per route/method; otherwise Bearer JWT + routePermissions apply.',
153
+ routeTables: sample(routeTableList),
154
+ noRouteTables: sample(noRouteTableList),
155
+ canonicalCrudTools: 'query_table reads route-backed tables. create_records/update_records/delete_records are the only generic write tools; pass native arrays even for one item. They preflight arrays and run sequentially.',
156
+ customRouteWorkflow: 'For a new endpoint use create_route without mainTableId, then create_handler/create_pre_hook/create_post_hook. Do not create a table just to get a path.',
157
+ routeSamples: sample(routes, 25),
158
+ detailHint: 'Use get_all_routes({ search, limit }) or inspect_route({ path }) for route details. Use inspect_table({ tableName }) for table detail.',
159
+ },
160
+ schemaManagement: {
161
+ createTable: 'POST /enfyra_table supports isSingleRecord at create time. MCP create_tables accepts a native array, creates tables/columns sequentially, then creates requested relations after all tables in the batch exist. It does not accept alias at create time; table name drives the default route/schema behavior.',
162
+ updateTable: 'PATCH /enfyra_table/:id is the canonical path for table property changes and column/relation schema changes.',
163
+ columns: 'enfyra_column has no REST route; use create_tables/create_columns/update_columns/delete_columns. Use liveColumnTypes below; do not invent SQL dialect names.',
164
+ liveColumnTypes: getSupportedColumnTypesFromMetadata(columnMetadata),
165
+ columnTypeGuidance: 'Use varchar for short strings, text/richtext for long prose, float for price/amount/rating/decimal-like values unless decimal is listed, simple-json for structured objects/arrays only when listed, and relations instead of *_id columns for links.',
166
+ relations: routeTables.has('enfyra_relation')
167
+ ? 'enfyra_relation has a REST route for reads/metadata, but canonical schema migration is create_relations/delete_relations or enfyra_table PATCH with the full relations array. Relation onDelete accepts CASCADE, SET NULL, or RESTRICT.'
168
+ : 'Use create_relations/delete_relations or enfyra_table PATCH with the full relations array. Relation onDelete accepts CASCADE, SET NULL, or RESTRICT.',
169
+ relationCascadeFkContract: 'Do not ask for or send physical FK/junction column names in relation create/update payloads. Enfyra derives fk/junction columns from relation propertyName/table metadata and hides FK columns from app schema/forms. Use targetTable, type, propertyName, inversePropertyName or mappedBy, isNullable, onDelete. Add inversePropertyName only when a concrete response, UI, deep query, aggregate sort/count, or parent-to-child traversal will use the reverse field.',
170
+ tableDefinitionRelations: (tableDefinition?.relations || []).map((rel) => rel.propertyName),
171
+ relationDefinitionRelations: (relationTable?.relations || []).map((rel) => rel.propertyName),
172
+ },
173
+ adminTesting: {
174
+ runAdminTest: 'run_admin_test wraps POST /admin/test/run for flow_step, websocket_event, and websocket_connection scripts.',
175
+ testFlowStep: 'test_flow_step also wraps POST /admin/test/run with kind=flow_step.',
176
+ triggerFlow: 'trigger_flow resolves a saved enabled flow, then wraps POST /admin/flow/trigger/:id. Use test_flow_step for disabled flows.',
177
+ },
178
+ graphql: {
179
+ endpoint: `${ENFYRA_API_URL.replace(/\/$/, '')}/graphql`,
180
+ schemaEndpoint: `${ENFYRA_API_URL.replace(/\/$/, '')}/graphql-schema`,
181
+ enablement: 'A table appears in GraphQL when enfyra_graphql has an enabled row for that table. REST route availableMethods does not enable GraphQL.',
182
+ auth: 'GraphQL table data requires Authorization: Bearer <accessToken>; REST publicMethods do not make GraphQL table data anonymous. Anonymous root/schema probes may still return 200.',
183
+ management: routeTables.has('enfyra_graphql')
184
+ ? 'Use update_tables graphqlEnabled or create_records/update_records on enfyra_graphql, then reload_graphql if needed.'
185
+ : 'Use update_tables graphqlEnabled, then reload_graphql if needed.',
186
+ gqlDefinitionColumns: (gqlDefinition?.columns || []).map((column) => column.name),
187
+ },
188
+ tableSamples: sample(tableNames, 40),
189
+ };
190
+ return jsonContent(payload);
191
+ });
192
+ server.tool('discover_runtime_context', [
193
+ 'Discover live runtime context that affects how an LLM should use Enfyra.',
194
+ 'Reports exact database type, the derived primary-key convention, route/cache/admin surfaces, and active metadata-backed runtime areas. Run broad discovery tools sequentially; do not call multiple broad discovery tools in parallel.',
195
+ ].join(' '), {}, async () => {
196
+ const metadata = await discoveryFetch('/metadata');
197
+ const tableCatalogResult = await discoveryFetch('/enfyra_table?fields=id,name,alias,description,isSingleRecord&limit=0&sort=name');
198
+ const routesResult = await discoveryFetch('/enfyra_route?fields=path,mainTable.name,availableMethods.*,publicMethods.*,isEnabled&limit=1000');
199
+ const methodsResult = await discoveryFetch('/enfyra_method?limit=100');
200
+ const gqlResult = await discoveryFetch('/enfyra_graphql?limit=1000');
201
+ const flowsResult = await discoveryFetch('/enfyra_flow?limit=1000');
202
+ const websocketResult = await discoveryFetch('/enfyra_websocket?limit=1000');
203
+ const storageResult = await discoveryFetch('/enfyra_storage_config?limit=1000');
204
+ const settingsResult = await discoveryFetch('/enfyra_setting?limit=1000');
205
+ const meResult = await discoveryFetch('/me', { fallbackData: null });
206
+ const tables = unwrapData(tableCatalogResult);
207
+ const routes = summarizeRoutes(routesResult);
208
+ const routeTables = new Set(routes.map((route) => route.mainTable).filter(Boolean));
209
+ const adminRoutes = routes.filter((route) => route.path?.startsWith('/admin'));
210
+ const publicRoutes = routes.filter((route) => route.publicMethods?.length);
211
+ const sample = (items, max = 25) => ({
212
+ total: items.length,
213
+ returned: Math.min(items.length, max),
214
+ items: items.slice(0, max),
215
+ truncated: items.length > max,
216
+ });
217
+ const payload = {
218
+ targetInstance: targetInstance(),
219
+ apiBase: ENFYRA_API_URL.replace(/\/$/, ''),
220
+ partialErrors: collectPartialErrors({
221
+ metadata,
222
+ tableCatalogResult,
223
+ routesResult,
224
+ methodsResult,
225
+ gqlResult,
226
+ flowsResult,
227
+ websocketResult,
228
+ storageResult,
229
+ settingsResult,
230
+ meResult,
231
+ }),
232
+ authenticatedUser: Array.isArray(meResult?.data) ? meResult.data[0] || null : meResult?.data || null,
233
+ database: getMetadataDatabaseContext(metadata),
234
+ counts: {
235
+ tables: tables.length,
236
+ routes: routes.length,
237
+ routeBackedTables: routeTables.size,
238
+ noRouteTables: tables.filter((table) => !routeTables.has(table.name)).length,
239
+ methods: methodsResult?.data?.length || 0,
240
+ graphqlDefinitions: gqlResult?.data?.length || 0,
241
+ enabledGraphqlDefinitions: (gqlResult?.data || []).filter((row) => row.isEnabled !== false).length,
242
+ flows: flowsResult?.data?.length || 0,
243
+ enabledFlows: (flowsResult?.data || []).filter((row) => row.isEnabled !== false).length,
244
+ websocketGateways: websocketResult?.data?.length || 0,
245
+ enabledWebsocketGateways: (websocketResult?.data || []).filter((row) => row.isEnabled !== false).length,
246
+ storageConfigs: storageResult?.data?.length || 0,
247
+ settings: settingsResult?.data?.length || 0,
248
+ },
249
+ methods: (methodsResult?.data || []).map((method) => ({ id: method.id || method._id, name: method.name })),
250
+ routeRuntime: {
251
+ routePattern: 'GET/POST /<route-path>; PATCH/DELETE /<route-path>/:id; no dynamic GET /<route-path>/:id.',
252
+ adminRoutes: sample(adminRoutes.map((route) => route.path).sort()),
253
+ publicRoutes: sample(publicRoutes.map((route) => ({
254
+ path: route.path,
255
+ mainTable: route.mainTable,
256
+ publicMethods: route.publicMethods,
257
+ }))),
258
+ },
259
+ cacheAndCluster: {
260
+ metadataMutationReloads: 'Metadata-backed mutations emit cache invalidation; admin reload endpoints exist for metadata/routes/graphql/guards/all.',
261
+ runtimeCacheContract: 'REDIS_RUNTIME_CACHE=true stores runtime definition snapshots in Redis so instances with the same NODE_NAME read the same runtime cache namespace.',
262
+ userCacheContract: '$cache/@CACHE uses managed user cache under NODE_NAME:user_cache:* with REDIS_USER_CACHE_LIMIT_MB default 30 MB; quota eviction only removes user cache keys, not runtime cache, BullMQ, Socket.IO, telemetry, or lock keys.',
263
+ multiInstanceContract: 'Backend is cluster-aware through cache invalidation, Redis runtime cache, Redis user cache, and BullMQ paths, but this MCP can only observe metadata/API state, not every node health.',
264
+ flowWorkerContract: 'Flow jobs require the backend flow worker to be initialized after HTTP listen and websocket gateway init; trigger_flow only confirms enqueue/result from admin endpoint.',
265
+ },
266
+ runtimeGaps: [
267
+ metadata?.dbType || metadata?.data?.dbType ? null : 'Exact database type was unavailable from GET /metadata.',
268
+ 'Redis/BullMQ/socket adapter health is not exposed by current MCP-visible API.',
269
+ 'MCP can test flow steps and websocket scripts through admin test endpoints, but not prove every production queue/client path without a real end-to-end client.',
270
+ ].filter(Boolean),
271
+ };
272
+ return jsonContent(payload);
273
+ });
274
+ server.tool('discover_query_capabilities', [
275
+ 'Discover Enfyra query/filter/deep-fetch capabilities for the live instance.',
276
+ 'Prefer passing tableName. Without tableName this returns only generic query rules. Run broad discovery tools sequentially; do not call multiple broad discovery tools in parallel.',
277
+ ].join(' '), {
278
+ tableName: z.string().optional().describe('Optional table name to summarize query fields and relation/deep capabilities.'),
279
+ }, async ({ tableName }) => {
280
+ const metadata = tableName
281
+ ? await discoveryFetch(`/metadata/${encodeURIComponent(tableName)}`)
282
+ : null;
283
+ const routesResult = tableName
284
+ ? await discoveryFetch('/enfyra_route?fields=path,mainTable.name,availableMethods.*,publicMethods.*,isEnabled&limit=1000')
285
+ : { data: [] };
286
+ const tableFromMetadata = tableName && !metadata?.error
287
+ ? metadata?.data?.table || metadata?.data || metadata?.table || metadata
288
+ : null;
289
+ const tables = tableName
290
+ ? (tableFromMetadata ? [tableFromMetadata] : [])
291
+ : [];
292
+ const routes = summarizeRoutes(routesResult);
293
+ const table = tableName ? tables.find((item) => item.name === tableName) : null;
294
+ const primaryKey = table ? getPrimaryColumn(table)?.name || null : null;
295
+ const tableRoutes = tableName
296
+ ? routes.filter((route) => route.mainTable === tableName)
297
+ : [];
298
+ const payload = {
299
+ targetInstance: targetInstance(),
300
+ partialErrors: collectPartialErrors({ metadata, routesResult }),
301
+ operators: {
302
+ filter: FILTER_OPERATORS,
303
+ fieldPermissionConditions: FIELD_PERMISSION_CONDITION_OPERATORS,
304
+ fieldPermissionConditionUnsupported: ['_contains', '_starts_with', '_ends_with', '_between'],
305
+ },
306
+ queryParams: {
307
+ fields: 'Comma-separated scalar/relation fields. Relations use relation propertyName, not physical FK column names.',
308
+ filter: 'JSON object using operators above. Relation filters use nested relation propertyName objects.',
309
+ sort: 'Local field or -field. For direct one-to-many/many-to-many parent ordering, use _count(relation), _max(relation.field), or _min(relation.field); raw dotted to-many sort is invalid.',
310
+ page: '1-based page.',
311
+ limit: 'Page size.',
312
+ meta: 'Request metadata/counts where supported.',
313
+ deep: 'Nested relation fetch object keyed by relation propertyName.',
314
+ },
315
+ countPattern: `For counts, query only fields=${primaryKey || '<primary-key>'} with limit=1 and request meta. Use meta=totalCount without a filter, or meta=filterCount when a filter is supplied. MCP count_records resolves the live table primary key and wraps this pattern.`,
316
+ security: 'Filters, sorts, counts, and aggregate values can leak information even when a field is not selected. In generated public/user-facing APIs, do not filter, sort, count, or aggregate unpublished fields or private relations unless the endpoint intentionally exposes that fact.',
317
+ deep: {
318
+ shape: '{ [relationName]: { fields?, filter?, sort?, limit?, page?, deep? } }',
319
+ mcpFieldProjection: 'query_table auto-adds missing top-level deep relation names to fields unless fields are in exclude mode, so the nested relation can appear in the response.',
320
+ rules: [
321
+ 'Unknown relation keys are invalid.',
322
+ 'Unknown deep entry keys are invalid.',
323
+ 'limit on many-to-one/one-to-one relations is invalid.',
324
+ 'Dotted sort through one-to-many/many-to-many is invalid.',
325
+ 'Deep sort orders rows inside the related collection only; use root aggregate sort helpers when parent rows must be ordered by child values.',
326
+ 'Nested deep is recursively validated.',
327
+ 'Field permissions may rewrite filters/sorts and sanitize post-query results.',
328
+ ],
329
+ },
330
+ backendNotes: {
331
+ primaryKey: tableName
332
+ ? 'Use this table metadata primary column when available.'
333
+ : 'SQL commonly uses id; Mongo uses _id. Use table metadata primary column when available.',
334
+ relationNames: 'API relation operations use relation propertyName, not physical FK column names.',
335
+ relationCascadeFkContract: 'When creating relations through create_tables/create_relations/enfyra_table PATCH, never provide fkCol/fkColumn/foreignKeyColumn/sourceColumn/targetColumn/junction*Column. These are physical implementation details derived by Enfyra and hidden from app schema/forms. Add inversePropertyName only for a concrete reverse traversal such as parent deep child lists, response fields, UI sections, or aggregate sort/count.',
336
+ graphql: 'GraphQL query args also accept filter/sort/page/limit. Table data requires Bearer auth and table enablement via enfyra_graphql; anonymous root/schema probes may still return 200.',
337
+ },
338
+ table: tableName
339
+ ? {
340
+ exists: !!table,
341
+ metadata: summarizeTable(table),
342
+ routes: tableRoutes,
343
+ examples: table
344
+ ? {
345
+ list: `GET /${tableRoutes[0]?.path?.replace(/^\//, '') || table.name}?limit=10`,
346
+ oneByPkFilter: { [primaryKey]: { _eq: '<id>' } },
347
+ relationDeep: (table.relations || [])[0]
348
+ ? { [(table.relations || [])[0].propertyName]: { fields: ['id'], limit: 5 } }
349
+ : null,
350
+ relationFilter: (table.relations || [])[0]
351
+ ? { [(table.relations || [])[0].propertyName]: { [primaryKey]: { _eq: '<related-id>' } } }
352
+ : null,
353
+ }
354
+ : null,
355
+ }
356
+ : null,
357
+ discoveryRule: 'When building a query, inspect table metadata first, then use relation propertyName and primary column from that metadata.',
358
+ };
359
+ return jsonContent(payload);
360
+ });
361
+ server.tool('discover_script_contexts', [
362
+ 'Discover runtime script contexts and macro availability for handlers, hooks, flows, websocket scripts, GraphQL, packages, and extensions.',
363
+ 'The runtimeTypes section is the authoritative script-visible ESV contract. Use it instead of generating defensive type or callable guards around documented context values and bridge methods.',
364
+ 'Use before writing dynamic JavaScript logic so the model does not mix context variables across surfaces. This tool is static and safe to call alone; avoid running it in parallel with other broad discovery calls.',
365
+ ].join(' '), {}, async () => {
366
+ const payload = {
367
+ targetInstance: targetInstance(),
368
+ transformer: {
369
+ rule: 'Dynamic server scripts are transformed before sandbox execution. Macros expand to $ctx paths; comments are not transformed.',
370
+ preferredSyntax: 'Prefer template macros in generated Enfyra scripts. Use macros such as @BODY/@QUERY/@PARAMS/@USER/@REQ/@RES/@REPOS/@CACHE/@HELPERS/@FETCH/@STORAGE/@UPLOADED_FILE/@SOCKET/@TRIGGER/@DATA/@ERROR/@STATUS/@ENV/@PKGS/@LOGS/@SHARE/@API/@THROW* instead of raw $ctx access whenever a macro exists. Use raw $ctx only for fields without a macro.',
371
+ coreMacros: {
372
+ '@CACHE': '$ctx.$cache',
373
+ '@REPOS': '$ctx.$repos',
374
+ '@HELPERS': '$ctx.$helpers',
375
+ '@STORAGE': '$ctx.$storage',
376
+ '@FETCH': '$ctx.$helpers.$fetch',
377
+ '@LOGS': '$ctx.$logs',
378
+ '@BODY': '$ctx.$body',
379
+ '@ENV': '$ctx.$env',
380
+ '@DATA': '$ctx.$data',
381
+ '@PARAMS': '$ctx.$params',
382
+ '@QUERY': '$ctx.$query',
383
+ '@USER': '$ctx.$user',
384
+ '@REQ': '$ctx.$req',
385
+ '@RES': '$ctx.$res',
386
+ '@SHARE': '$ctx.$share',
387
+ '@API': '$ctx.$api',
388
+ '@UPLOADED_FILE': '$ctx.$uploadedFile',
389
+ '@PKGS': '$ctx.$pkgs',
390
+ '@SOCKET': '$ctx.$socket',
391
+ '@TRIGGER': '$ctx.$trigger',
392
+ '@FLOW': '$ctx.$flow',
393
+ '@FLOW_PAYLOAD': '$ctx.$flow.$payload',
394
+ '@FLOW_LAST': '$ctx.$flow.$last',
395
+ '@FLOW_META': '$ctx.$flow.$meta',
396
+ '@THROW400': "$ctx.$throw['400']",
397
+ '@THROW401': "$ctx.$throw['401']",
398
+ '@THROW403': "$ctx.$throw['403']",
399
+ '@THROW404': "$ctx.$throw['404']",
400
+ '@THROW409': "$ctx.$throw['409']",
401
+ '@THROW422': "$ctx.$throw['422']",
402
+ '@THROW429': "$ctx.$throw['429']",
403
+ '@THROW500': "$ctx.$throw['500']",
404
+ '@THROW503': "$ctx.$throw['503']",
405
+ '@THROW': '$ctx.$throw',
406
+ '@STATUS': '$ctx.$statusCode',
407
+ '@ERROR': '$ctx.$error',
408
+ },
409
+ logging: '@LOGS is a callable function. Use @LOGS(message, details?) such as @LOGS("Approval requested", { requestId }); do not use @LOGS.info, @LOGS.warn, @LOGS.error, or @LOGS.debug.',
410
+ socket: {
411
+ contract: '@SOCKET has no generic emit() method.',
412
+ boundWebsocketMethods: ['reply(event, data)', 'join(room)', 'leave(room)', 'emitToCurrentRoom(room, event, data)', 'broadcastToRoom(room, event, data)', 'disconnect()'],
413
+ globalMethods: ['emitToGateway(path, event, data)', 'emitToRoom(path, room, event, data)', 'emitToUser(userId, event, data)', 'broadcast(event, data)', 'roomSize(room)'],
414
+ },
415
+ flowMacros: {
416
+ '@FLOW': '$ctx.$flow',
417
+ '@FLOW_PAYLOAD': '$ctx.$flow.$payload',
418
+ '@FLOW_LAST': '$ctx.$flow.$last',
419
+ '@FLOW_META': '$ctx.$flow.$meta',
420
+ '#table_name': '$ctx.$repos.table_name',
421
+ },
422
+ cache: {
423
+ contract: '@CACHE and $ctx.$cache use managed user cache. Use logical keys only; Enfyra stores Redis-backed user cache under NODE_NAME:user_cache:* and Redis Admin Key Editor uses the same storage path.',
424
+ quota: 'REDIS_USER_CACHE_LIMIT_MB defaults to 30 MB. If exceeded, Enfyra evicts least-recently-used user-cache keys only; system Redis keys are not counted or evicted.',
425
+ keyRule: 'Do not include NODE_NAME, user_cache:, or Redis namespace prefixes in scripts. Prefer TTL-based set(key, value, ttlMs); setNoExpire may still be evicted by the user-cache soft allocation.',
426
+ },
427
+ throws: '@THROW maps to $ctx.$throw. Numeric helpers are raw HTTP message helpers: @THROW400(message), @THROW404(message), @THROW409(message), @THROW422(message, detailsObject?), @THROW500(message). Numeric helper details must be an object/array, e.g. @THROW404("Project not found", { id }); do not use @THROW404("Project", id) as a semantic shortcut. Use @THROW.http(status, message, details?) for dynamic status codes. Use @THROW.notFound(resource, id?) and @THROW.duplicate(resource, field, value) only when you intentionally want Enfyra-formatted semantic messages.',
428
+ helpers: {
429
+ core: '$ctx.$helpers includes $bcrypt.hash/compare, autoSlug(text), $fetch, $sleep(ms) capped by the runtime, and $crypto. HTTP and GraphQL contexts also expose $jwt through $ctx.$helpers. Every helper method crosses the async executor bridge: await its result before property access, interpolation, concatenation, or persistence.',
430
+ fetch: '@FETCH maps to $ctx.$helpers.$fetch for outbound HTTP calls from server scripts. Keep secrets in encrypted fields instead of embedding them in sourceCode.',
431
+ crypto: '$ctx.$helpers.$crypto exposes bounded runtime crypto helpers: randomUUID(), randomBytes(size, encoding), sha256(value, encoding), hmacSha256(value, secret, encoding), and generateSshKeyPair(comment). Await every call, including helpers whose host implementation is synchronous, for example const id = await @HELPERS.$crypto.randomUUID(). Use generateSshKeyPair for SSH key material. Do not use legacy $ctx.$helpers.$ssh.',
432
+ files: '$ctx.$storage.$upload and $ctx.$storage.$update accept file: @UPLOADED_FILE for request uploads and stream from the server temp file path. $ctx.$storage.$registerFile creates a enfyra_file record for an object that already exists in storage without uploading bytes. Use buffer only for small generated/transformed files; do not use @UPLOADED_FILE.buffer.',
433
+ },
434
+ env: '$ctx.$env exposes a sanitized process env snapshot with exact sensitive keys removed: DB_URI, DB_REPLICA_URIS, REDIS_URI, SECRET_KEY, and ADMIN_PASSWORD. Store app secrets in unpublished isEncrypted fields instead of reading them from $env.',
435
+ },
436
+ runtimeTypes: buildDynamicScriptContextTypeContract(),
437
+ contexts: {
438
+ preHook: {
439
+ runs: 'Before handler.',
440
+ data: ['@BODY', '@QUERY', '@PARAMS', '@USER', '@REQ', '@REPOS', '@CACHE', '@HELPERS', '@FETCH', '@STORAGE', '@THROW*', '@SOCKET global emit helpers/roomSize'],
441
+ queryContract: '@QUERY.filter is initialized as an object. When adding RLS/scope filters in pre-hooks, merge directly with _and; do not add defensive type checks around @QUERY.filter.',
442
+ projectionContract: 'For canonical table reads, preserve client-controlled query shape. Do not override @QUERY.fields, @QUERY.deep, @QUERY.sort, @QUERY.limit, @QUERY.page, @QUERY.meta, @QUERY.aggregate, or debugMode. RLS should only merge security constraints into @QUERY.filter.',
443
+ rlsPattern: 'For relation-scoped reads, mutate @QUERY.filter instead of returning data. Example: const incomingFilter = @QUERY.filter; const scope = { memberships: { member: { id: { _eq: @USER.id } } } }; @QUERY.filter = Object.keys(incomingFilter).length ? { _and: [incomingFilter, scope] } : scope;',
444
+ returnBehavior: 'Returning a non-undefined value skips handler and becomes response data.',
445
+ },
446
+ handler: {
447
+ runs: 'Main route logic, or canonical CRUD if no handler overrides.',
448
+ data: ['@BODY', '@QUERY', '@PARAMS', '@USER', '@REQ', '@RES when response streaming is available', '@UPLOADED_FILE for multipart request file metadata', '@REPOS.main secure route main table repo', '#table_name / @REPOS.<table> explicit table repo with trusted projection discipline', '@CACHE', '@HELPERS', '@FETCH', '@STORAGE', '@PKGS', '@SOCKET global emit helpers/roomSize', '@TRIGGER'],
449
+ queryContract: 'When a handler wraps a canonical table read, pass through client fields/deep/sort/page/limit/meta/aggregate/debugMode unless the route is a clearly custom summary or workflow endpoint.',
450
+ returnBehavior: 'Return value becomes response body unless post-hook changes it.',
451
+ },
452
+ postHook: {
453
+ runs: 'After handler, including error path.',
454
+ data: ['@DATA', '@STATUS', '@ERROR', '@BODY', '@QUERY', '@PARAMS', '@USER', '@REQ', '@CACHE', '@HELPERS', '@FETCH', '@STORAGE', '@SHARE', '@API'],
455
+ returnBehavior: 'Mutate @DATA/$ctx.$data or return a non-undefined replacement response.',
456
+ },
457
+ flowStep: {
458
+ runs: 'Inside flow execution or admin flow step test.',
459
+ data: ['@BODY payload', '@USER if provided', '@FLOW_PAYLOAD', '@FLOW_LAST', '@FLOW', '@FLOW_META', '#table_name', '@CACHE', '@HELPERS', '@FETCH', '@STORAGE', '@SOCKET global emit helpers/roomSize', '@TRIGGER'],
460
+ resultBehavior: 'Step return value is injected into @FLOW.<step.key> and @FLOW_LAST.',
461
+ branching: 'Condition steps use JavaScript truthy/falsy result; child branch is true/false.',
462
+ },
463
+ websocketConnection: {
464
+ runs: 'Socket.IO connection handler.',
465
+ data: ['@BODY connection info', '@DATA connection info', '@REQ websocket request metadata', '@API request metadata', '@USER if authenticated', '@HELPERS', '@FETCH', '@SOCKET reply/join/leave/disconnect/emit helpers/roomSize'],
466
+ },
467
+ websocketEvent: {
468
+ runs: 'Socket.IO event handler.',
469
+ data: ['@BODY event payload', '@DATA event payload', '@REQ websocket request metadata', '@API request metadata', '@USER if authenticated', '@HELPERS', '@FETCH', '@SOCKET reply/join/leave/disconnect/emit helpers/roomSize'],
470
+ resultBehavior: 'Client ack receives queued state first; handler result is emitted asynchronously as ws:result/ws:error with requestId.',
471
+ },
472
+ oauthUserProvisioning: {
473
+ runs: 'Before a new OAuth identity creates its enfyra_user row.',
474
+ data: ['@REPOS.main scoped to enfyra_user', '@HELPERS', '@FETCH', '@STORAGE', '@CACHE'],
475
+ resultBehavior: 'Return a plain object of additional user fields. Provider identity fields are merged afterward and take precedence. The script has no authenticated @USER and should not return a user response.',
476
+ },
477
+ graphqlResolver: {
478
+ runs: 'Generated GraphQL resolver delegates to dynamic repo/query services.',
479
+ data: ['GraphQL request context', 'Bearer auth user', 'dynamic repositories'],
480
+ caveat: 'REST publicMethods do not make GraphQL table data anonymous.',
481
+ },
482
+ extensionVueSfc: {
483
+ runs: 'Frontend extension code, not server sandbox.',
484
+ data: ['Vue/Nuxt composables', 'Enfyra composables', 'auto-resolved UI components'],
485
+ caveat: 'No import statements; save as enfyra_extension Vue SFC record.',
486
+ },
487
+ },
488
+ helpers: {
489
+ repos: {
490
+ scopes: '$repos.main is the secure repository for the route main table and preserves normal route query behavior. For explicit user-facing table access, use #secure.table_name or @REPOS.secure.table_name so field permissions remain enforced. Reserve #table_name or @REPOS.table_name for trusted internal operations that intentionally bypass field permissions.',
491
+ security: 'Trusted repos can bypass normal exposure boundaries, including unpublished columns and private relations. If trusted access is necessary, always request explicit fields, enforce route access plus owner/tenant/member checks, and project/sanitize the result before returning it.',
492
+ sensitiveQuerySurface: 'Filters, sort helpers, counts, and aggregate values on unpublished fields or private relations can leak information even when the value is not selected. Do not expose aggregate, _max, _min, _count, or predicate-oracle behavior over hidden fields in generated user-facing endpoints.',
493
+ mutationReturnShape: '$repos.<table>.create({ data }) and $repos.<table>.update({ id, data }) return a collection-shaped result: { data: [...], count? }. data is always an array for create/update, even for one created/updated record. If a script needs the single record object, it must read result.data[0] or result.data?.[0] ?? null.',
494
+ preferredExample: 'const result = await @REPOS.main.create({ data: @BODY }); const record = result.data?.[0] ?? null; return record;',
495
+ wrongSingleRecordAccess: 'Do not use result.data.id, do not return result.data when one object is expected, and do not assume create/update returns the bare row object.',
496
+ countPattern: 'To count records in custom code, do not fetch full rows. Use const result = await @REPOS.main.find({ fields: "id", limit: 1, meta: filter ? "filterCount" : "totalCount", ...(filter ? { filter } : {}) }); then read result.meta.filterCount or result.meta.totalCount.',
497
+ relationProjectionPattern: 'For repository find({ deep }) in scripts, include relation property names in top-level fields or the parent row will not expose row.<relation>. Example: await #orders.find({ fields: ["id", "customer"], deep: { customer: { fields: ["id", "email"] } }, limit: 1 }). query_table auto-adds this for MCP reads; dynamic repos do not.',
498
+ relationFilterPattern: 'Filter relations by relation propertyName, not physical FK names. Use { incident: { id: { _eq: incident.id } } }, not { incidentId: { _eq: incident.id } }.',
499
+ },
500
+ socketInHttpOrFlow: 'HTTP/flow context can emitToUser/emitToRoom/emitToGateway/broadcast and roomSize, but cannot reply/join/leave/disconnect/emitToCurrentRoom/broadcastToRoom because there is no bound socket. emitToRoom requires an explicit gateway path: emitToRoom(path, room, event, data). roomSize(room) counts sockets in that room across registered gateways.',
501
+ packages: 'Server packages installed through install_package are exposed as $ctx.$pkgs.packageName in server scripts.',
502
+ files: 'Upload helpers are on $storage; raw create_records on enfyra_file is not equivalent to multipart upload/storage rollback. For multipart request files, pass file: @UPLOADED_FILE to @STORAGE.$upload/@STORAGE.$update so Enfyra streams from disk-backed temp storage. For progress, clients send x-enfyra-upload-id on authenticated multipart requests and listen for $system:upload:progress; $upload and blob-replacing $update do not accept onProgress. Use @STORAGE.$registerFile only when the object already exists in storage and the script should create the enfyra_file record without uploading bytes. Use buffer only for small generated files.',
503
+ },
504
+ adminTesting: {
505
+ flowStep: 'Use test_flow_step or run_admin_test(kind=flow_step).',
506
+ websocket: 'Use run_admin_test(kind=websocket_event|websocket_connection).',
507
+ },
508
+ };
509
+ return jsonContent(payload);
510
+ });
511
+ // ============================================================================
512
+ // QUERY TOOLS
513
+ // ============================================================================
514
+ server.tool('get_enfyra_api_context', [
515
+ 'Returns the resolved API base URL for this MCP session (env ENFYRA_API_URL).',
516
+ 'Use this as the cheap first target sanity check before broad discovery or mutations.',
517
+ 'Use when the user asks which HTTP endpoint or full URL applies: combine enfyraApiUrl with paths from server instructions (GET/POST /{table}, PATCH/DELETE /{table}/{id}, no GET /{table}/{id}).',
518
+ 'Auth: publicMethods on a route can allow a method without Bearer; otherwise JWT + routePermissions — see server instructions.',
519
+ 'If path might differ from table name, use get_all_routes before asserting a URL.',
520
+ 'Same mapping as MCP tool → HTTP: query_table=GET /table?..., create_records=sequential POST /table, update_records=sequential PATCH /table/id, delete_records=sequential DELETE /table/id.',
521
+ 'GraphQL: see graphqlHttpUrl / graphqlSchemaUrl in response; enable per table via enfyra_graphql/update_tables graphqlEnabled and send Bearer auth for table data queries. Anonymous root/schema probes may still return 200.',
522
+ ].join(' '), {}, async () => {
523
+ const base = ENFYRA_API_URL.replace(/\/$/, '');
524
+ const gql = buildGraphqlUrls(ENFYRA_API_URL);
525
+ const payload = {
526
+ targetInstance: targetInstance(),
527
+ enfyraApiUrl: base,
528
+ graphqlHttpUrl: gql.graphqlHttpUrl,
529
+ graphqlSchemaUrl: gql.graphqlSchemaUrl,
530
+ examples: {
531
+ listOrCreate: `${base}/<table_name>`,
532
+ updateOrDelete: `${base}/<table_name>/<id>`,
533
+ oneRowById: `${base}/<table_name>?filter={"<primaryKeyFromMetadata>":{"_eq":"<id>"}}&limit=1`,
534
+ },
535
+ auth: {
536
+ publicMethods: 'If the HTTP method is public for that route, no Bearer required; else Bearer JWT and routePermissions apply.',
537
+ graphql: 'GraphQL table data requires Bearer auth; route publicMethods do not make GraphQL table data anonymous. Anonymous root/schema probes may still return 200.',
538
+ mcp: 'This server uses admin credentials from env for tools (fetchAPI).',
539
+ },
540
+ pathResolution: 'Confirm route path with get_all_routes or metadata — path may not equal table name.',
541
+ note: 'Full tool→HTTP mapping is in MCP server instructions (shown to the model at connect).',
542
+ };
543
+ return jsonContent(payload);
544
+ });
545
+ }
546
+ //# sourceMappingURL=discovery-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery-tools.js","sourceRoot":"","sources":["../../src/lib/discovery-tools.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ export declare function buildDynamicRepositoryUsage(input: {
7
7
  idSource?: 'params' | 'body';
8
8
  }): {
9
9
  access: "secure_main" | "secure_explicit" | "trusted_explicit";
10
- operation: "delete" | "create" | "update" | "list" | "find_one";
10
+ operation: "delete" | "list" | "find_one" | "create" | "update";
11
11
  tableName: string;
12
12
  repository: string;
13
13
  fieldPermissionsEnforced: boolean;