@enfyra/mcp-server 0.1.69 → 0.1.71

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 (248) hide show
  1. package/README.md +1 -1
  2. package/dist/lib/config-local-adapters.d.ts +18 -0
  3. package/dist/lib/config-local-adapters.js +271 -0
  4. package/dist/lib/config-local-adapters.js.map +1 -0
  5. package/dist/lib/config-local-contracts.d.ts +28 -0
  6. package/dist/lib/config-local-contracts.js +200 -0
  7. package/dist/lib/config-local-contracts.js.map +1 -0
  8. package/dist/lib/config-local-prompts.d.ts +10 -0
  9. package/dist/lib/config-local-prompts.js +185 -0
  10. package/dist/lib/config-local-prompts.js.map +1 -0
  11. package/dist/lib/config-local-types.d.ts +23 -0
  12. package/dist/lib/config-local-types.js +2 -0
  13. package/dist/lib/config-local-types.js.map +1 -0
  14. package/dist/lib/config-local.js +3 -649
  15. package/dist/lib/config-local.js.map +1 -1
  16. package/dist/lib/discovery-tools.d.ts +4 -0
  17. package/dist/lib/discovery-tools.js +546 -0
  18. package/dist/lib/discovery-tools.js.map +1 -0
  19. package/dist/lib/dynamic-repository-builder.d.ts +1 -1
  20. package/dist/lib/dynamic-script-context-contract.d.ts +100 -0
  21. package/dist/lib/dynamic-script-context-contract.js +163 -0
  22. package/dist/lib/dynamic-script-context-contract.js.map +1 -0
  23. package/dist/lib/enfyra-mcp-server.d.ts +3 -0
  24. package/dist/lib/enfyra-mcp-server.js +79 -0
  25. package/dist/lib/enfyra-mcp-server.js.map +1 -0
  26. package/dist/lib/enfyra-tool-logic.d.ts +7 -0
  27. package/dist/lib/enfyra-tool-logic.js +8 -0
  28. package/dist/lib/enfyra-tool-logic.js.map +1 -0
  29. package/dist/lib/enfyra-tool-types.d.ts +27 -0
  30. package/dist/lib/enfyra-tool-types.js +2 -0
  31. package/dist/lib/enfyra-tool-types.js.map +1 -0
  32. package/dist/lib/extension-api-builders.d.ts +17 -0
  33. package/dist/lib/extension-api-builders.js +235 -0
  34. package/dist/lib/extension-api-builders.js.map +1 -0
  35. package/dist/lib/extension-component-builders.d.ts +87 -0
  36. package/dist/lib/extension-component-builders.js +623 -0
  37. package/dist/lib/extension-component-builders.js.map +1 -0
  38. package/dist/lib/extension-contract-review.d.ts +26 -0
  39. package/dist/lib/extension-contract-review.js +187 -0
  40. package/dist/lib/extension-contract-review.js.map +1 -0
  41. package/dist/lib/extension-theme-contract.d.ts +63 -0
  42. package/dist/lib/extension-theme-contract.js +417 -0
  43. package/dist/lib/extension-theme-contract.js.map +1 -0
  44. package/dist/lib/identity-tools.d.ts +4 -0
  45. package/dist/lib/identity-tools.js +46 -0
  46. package/dist/lib/identity-tools.js.map +1 -0
  47. package/dist/lib/log-tools.d.ts +4 -0
  48. package/dist/lib/log-tools.js +65 -0
  49. package/dist/lib/log-tools.js.map +1 -0
  50. package/dist/lib/mcp-example-connect.d.ts +9 -0
  51. package/dist/lib/mcp-example-connect.js +442 -0
  52. package/dist/lib/mcp-example-connect.js.map +1 -0
  53. package/dist/lib/mcp-example-extensions.d.ts +9 -0
  54. package/dist/lib/mcp-example-extensions.js +729 -0
  55. package/dist/lib/mcp-example-extensions.js.map +1 -0
  56. package/dist/lib/mcp-example-files.d.ts +9 -0
  57. package/dist/lib/mcp-example-files.js +51 -0
  58. package/dist/lib/mcp-example-files.js.map +1 -0
  59. package/dist/lib/mcp-example-flows.d.ts +9 -0
  60. package/dist/lib/mcp-example-flows.js +76 -0
  61. package/dist/lib/mcp-example-flows.js.map +1 -0
  62. package/dist/lib/mcp-example-graphql.d.ts +9 -0
  63. package/dist/lib/mcp-example-graphql.js +57 -0
  64. package/dist/lib/mcp-example-graphql.js.map +1 -0
  65. package/dist/lib/mcp-example-handlers-hooks.d.ts +9 -0
  66. package/dist/lib/mcp-example-handlers-hooks.js +328 -0
  67. package/dist/lib/mcp-example-handlers-hooks.js.map +1 -0
  68. package/dist/lib/mcp-example-oauth-setup.d.ts +9 -0
  69. package/dist/lib/mcp-example-oauth-setup.js +41 -0
  70. package/dist/lib/mcp-example-oauth-setup.js.map +1 -0
  71. package/dist/lib/mcp-example-permissions-rls.d.ts +9 -0
  72. package/dist/lib/mcp-example-permissions-rls.js +210 -0
  73. package/dist/lib/mcp-example-permissions-rls.js.map +1 -0
  74. package/dist/lib/mcp-example-queries-deep.d.ts +9 -0
  75. package/dist/lib/mcp-example-queries-deep.js +220 -0
  76. package/dist/lib/mcp-example-queries-deep.js.map +1 -0
  77. package/dist/lib/mcp-example-schema-relations.d.ts +9 -0
  78. package/dist/lib/mcp-example-schema-relations.js +148 -0
  79. package/dist/lib/mcp-example-schema-relations.js.map +1 -0
  80. package/dist/lib/mcp-example-websocket.d.ts +9 -0
  81. package/dist/lib/mcp-example-websocket.js +103 -0
  82. package/dist/lib/mcp-example-websocket.js.map +1 -0
  83. package/dist/lib/mcp-examples.d.ts +5 -5
  84. package/dist/lib/mcp-examples.js +22 -2394
  85. package/dist/lib/mcp-examples.js.map +1 -1
  86. package/dist/lib/method-tools.d.ts +4 -0
  87. package/dist/lib/method-tools.js +217 -0
  88. package/dist/lib/method-tools.js.map +1 -0
  89. package/dist/lib/package-tools.d.ts +4 -0
  90. package/dist/lib/package-tools.js +98 -0
  91. package/dist/lib/package-tools.js.map +1 -0
  92. package/dist/lib/platform-data-operations.d.ts +24 -0
  93. package/dist/lib/platform-data-operations.js +71 -0
  94. package/dist/lib/platform-data-operations.js.map +1 -0
  95. package/dist/lib/platform-endpoint-workflow.d.ts +42 -0
  96. package/dist/lib/platform-endpoint-workflow.js +382 -0
  97. package/dist/lib/platform-endpoint-workflow.js.map +1 -0
  98. package/dist/lib/platform-extension-source.d.ts +487 -0
  99. package/dist/lib/platform-extension-source.js +524 -0
  100. package/dist/lib/platform-extension-source.js.map +1 -0
  101. package/dist/lib/platform-extension-tools.d.ts +1 -0
  102. package/dist/lib/platform-extension-tools.js +416 -0
  103. package/dist/lib/platform-extension-tools.js.map +1 -0
  104. package/dist/lib/platform-extension-ui.d.ts +4 -0
  105. package/dist/lib/platform-extension-ui.js +5 -0
  106. package/dist/lib/platform-extension-ui.js.map +1 -0
  107. package/dist/lib/platform-extension-workflow.d.ts +54 -0
  108. package/dist/lib/platform-extension-workflow.js +194 -0
  109. package/dist/lib/platform-extension-workflow.js.map +1 -0
  110. package/dist/lib/platform-flow-operations.d.ts +554 -0
  111. package/dist/lib/platform-flow-operations.js +317 -0
  112. package/dist/lib/platform-flow-operations.js.map +1 -0
  113. package/dist/lib/platform-flow-tools.d.ts +1 -0
  114. package/dist/lib/platform-flow-tools.js +248 -0
  115. package/dist/lib/platform-flow-tools.js.map +1 -0
  116. package/dist/lib/platform-operation-logic.d.ts +10 -0
  117. package/dist/lib/platform-operation-logic.js +11 -0
  118. package/dist/lib/platform-operation-logic.js.map +1 -0
  119. package/dist/lib/platform-operation-tools.d.ts +1 -324
  120. package/dist/lib/platform-operation-tools.js +13 -4620
  121. package/dist/lib/platform-operation-tools.js.map +1 -1
  122. package/dist/lib/platform-operation-types.d.ts +46 -0
  123. package/dist/lib/platform-operation-types.js +2 -0
  124. package/dist/lib/platform-operation-types.js.map +1 -0
  125. package/dist/lib/platform-policy-tools.d.ts +1 -0
  126. package/dist/lib/platform-policy-tools.js +248 -0
  127. package/dist/lib/platform-policy-tools.js.map +1 -0
  128. package/dist/lib/platform-resource-operations.d.ts +124 -0
  129. package/dist/lib/platform-resource-operations.js +109 -0
  130. package/dist/lib/platform-resource-operations.js.map +1 -0
  131. package/dist/lib/platform-resource-tools.d.ts +1 -0
  132. package/dist/lib/platform-resource-tools.js +70 -0
  133. package/dist/lib/platform-resource-tools.js.map +1 -0
  134. package/dist/lib/platform-route-operations.d.ts +222 -0
  135. package/dist/lib/platform-route-operations.js +290 -0
  136. package/dist/lib/platform-route-operations.js.map +1 -0
  137. package/dist/lib/platform-route-tools.d.ts +1 -0
  138. package/dist/lib/platform-route-tools.js +307 -0
  139. package/dist/lib/platform-route-tools.js.map +1 -0
  140. package/dist/lib/platform-shared-operations.d.ts +7 -0
  141. package/dist/lib/platform-shared-operations.js +4 -0
  142. package/dist/lib/platform-shared-operations.js.map +1 -0
  143. package/dist/lib/platform-websocket-tools.d.ts +1 -0
  144. package/dist/lib/platform-websocket-tools.js +70 -0
  145. package/dist/lib/platform-websocket-tools.js.map +1 -0
  146. package/dist/lib/record-tools.d.ts +4 -0
  147. package/dist/lib/record-tools.js +418 -0
  148. package/dist/lib/record-tools.js.map +1 -0
  149. package/dist/lib/required-knowledge.d.ts +1 -1
  150. package/dist/lib/required-knowledge.js +3 -2
  151. package/dist/lib/required-knowledge.js.map +1 -1
  152. package/dist/lib/route-access-tools.d.ts +4 -0
  153. package/dist/lib/route-access-tools.js +172 -0
  154. package/dist/lib/route-access-tools.js.map +1 -0
  155. package/dist/lib/route-definition-tools.d.ts +4 -0
  156. package/dist/lib/route-definition-tools.js +285 -0
  157. package/dist/lib/route-definition-tools.js.map +1 -0
  158. package/dist/lib/route-inspection-tools.d.ts +4 -0
  159. package/dist/lib/route-inspection-tools.js +319 -0
  160. package/dist/lib/route-inspection-tools.js.map +1 -0
  161. package/dist/lib/route-tools.d.ts +1 -0
  162. package/dist/lib/route-tools.js +9 -0
  163. package/dist/lib/route-tools.js.map +1 -0
  164. package/dist/lib/runtime-zone-registry.d.ts +27 -0
  165. package/dist/lib/runtime-zone-registry.js +81 -0
  166. package/dist/lib/runtime-zone-registry.js.map +1 -0
  167. package/dist/lib/runtime-zone-search.d.ts +303 -0
  168. package/dist/lib/runtime-zone-search.js +596 -0
  169. package/dist/lib/runtime-zone-search.js.map +1 -0
  170. package/dist/lib/runtime-zone-tools.d.ts +2 -307
  171. package/dist/lib/runtime-zone-tools.js +2 -674
  172. package/dist/lib/runtime-zone-tools.js.map +1 -1
  173. package/dist/lib/schema-column-tools.d.ts +3 -0
  174. package/dist/lib/schema-column-tools.js +80 -0
  175. package/dist/lib/schema-column-tools.js.map +1 -0
  176. package/dist/lib/schema-mutation-coordinator.d.ts +28 -0
  177. package/dist/lib/schema-mutation-coordinator.js +154 -0
  178. package/dist/lib/schema-mutation-coordinator.js.map +1 -0
  179. package/dist/lib/schema-relation-contracts.d.ts +39 -0
  180. package/dist/lib/schema-relation-contracts.js +160 -0
  181. package/dist/lib/schema-relation-contracts.js.map +1 -0
  182. package/dist/lib/schema-relation-tools.d.ts +3 -0
  183. package/dist/lib/schema-relation-tools.js +61 -0
  184. package/dist/lib/schema-relation-tools.js.map +1 -0
  185. package/dist/lib/schema-table-contracts.d.ts +28 -0
  186. package/dist/lib/schema-table-contracts.js +263 -0
  187. package/dist/lib/schema-table-contracts.js.map +1 -0
  188. package/dist/lib/schema-table-tools.d.ts +3 -0
  189. package/dist/lib/schema-table-tools.js +297 -0
  190. package/dist/lib/schema-table-tools.js.map +1 -0
  191. package/dist/lib/schema-tool-operations.d.ts +150 -0
  192. package/dist/lib/schema-tool-operations.js +468 -0
  193. package/dist/lib/schema-tool-operations.js.map +1 -0
  194. package/dist/lib/schema-tool-types.d.ts +38 -0
  195. package/dist/lib/schema-tool-types.js +2 -0
  196. package/dist/lib/schema-tool-types.js.map +1 -0
  197. package/dist/lib/schema-verification.d.ts +14 -0
  198. package/dist/lib/schema-verification.js +105 -0
  199. package/dist/lib/schema-verification.js.map +1 -0
  200. package/dist/lib/script-tools.d.ts +4 -0
  201. package/dist/lib/script-tools.js +127 -0
  202. package/dist/lib/script-tools.js.map +1 -0
  203. package/dist/lib/system-tools.d.ts +4 -0
  204. package/dist/lib/system-tools.js +41 -0
  205. package/dist/lib/system-tools.js.map +1 -0
  206. package/dist/lib/table-tool-logic.d.ts +5 -0
  207. package/dist/lib/table-tool-logic.js +6 -0
  208. package/dist/lib/table-tool-logic.js.map +1 -0
  209. package/dist/lib/table-tools.d.ts +1 -84
  210. package/dist/lib/table-tools.js +7 -1522
  211. package/dist/lib/table-tools.js.map +1 -1
  212. package/dist/lib/tool-catalog.d.ts +2 -1
  213. package/dist/lib/tool-catalog.js +23 -2
  214. package/dist/lib/tool-catalog.js.map +1 -1
  215. package/dist/lib/tool-metadata-operations.d.ts +27 -0
  216. package/dist/lib/tool-metadata-operations.js +93 -0
  217. package/dist/lib/tool-metadata-operations.js.map +1 -0
  218. package/dist/lib/tool-permission-profile.d.ts +37 -0
  219. package/dist/lib/tool-permission-profile.js +106 -0
  220. package/dist/lib/tool-permission-profile.js.map +1 -0
  221. package/dist/lib/tool-record-operations.d.ts +102 -0
  222. package/dist/lib/tool-record-operations.js +260 -0
  223. package/dist/lib/tool-record-operations.js.map +1 -0
  224. package/dist/lib/tool-route-inspection.d.ts +47 -0
  225. package/dist/lib/tool-route-inspection.js +168 -0
  226. package/dist/lib/tool-route-inspection.js.map +1 -0
  227. package/dist/lib/tool-routing.d.ts +3 -417
  228. package/dist/lib/tool-routing.js +3 -1038
  229. package/dist/lib/tool-routing.js.map +1 -1
  230. package/dist/lib/tool-runtime-config.d.ts +33 -0
  231. package/dist/lib/tool-runtime-config.js +237 -0
  232. package/dist/lib/tool-runtime-config.js.map +1 -0
  233. package/dist/lib/tool-script-operations.d.ts +34 -0
  234. package/dist/lib/tool-script-operations.js +153 -0
  235. package/dist/lib/tool-script-operations.js.map +1 -0
  236. package/dist/lib/workflow-definitions.d.ts +366 -0
  237. package/dist/lib/workflow-definitions.js +703 -0
  238. package/dist/lib/workflow-definitions.js.map +1 -0
  239. package/dist/lib/workflow-planner.d.ts +45 -0
  240. package/dist/lib/workflow-planner.js +338 -0
  241. package/dist/lib/workflow-planner.js.map +1 -0
  242. package/dist/lib/workflow-types.d.ts +39 -0
  243. package/dist/lib/workflow-types.js +2 -0
  244. package/dist/lib/workflow-types.js.map +1 -0
  245. package/dist/mcp-server-entry.d.ts +0 -3
  246. package/dist/mcp-server-entry.js +2 -3249
  247. package/dist/mcp-server-entry.js.map +1 -1
  248. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-example-extensions.js","sourceRoot":"","sources":["../../src/lib/mcp-example-extensions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare const filesExamples: {
2
+ title: string;
3
+ useWhen: string;
4
+ examples: {
5
+ name: string;
6
+ code: string;
7
+ notes: string[];
8
+ }[];
9
+ };
@@ -0,0 +1,51 @@
1
+ export const filesExamples = {
2
+ title: 'Files, folders, upload metadata, and assets',
3
+ useWhen: 'Use when handling uploads or returning uploaded files.',
4
+ examples: [
5
+ {
6
+ name: 'Upload a file from browser',
7
+ code: `const form = new FormData()
8
+ form.append("file", file)
9
+ form.append("folder", folderId)
10
+ form.append("title", "Invoice")
11
+
12
+ const uploadId = crypto.randomUUID()
13
+ const uploaded = await fetch("/enfyra/enfyra_file", {
14
+ method: "POST",
15
+ credentials: "include",
16
+ headers: { "x-enfyra-upload-id": uploadId },
17
+ body: form
18
+ }).then((res) => res.json())`,
19
+ notes: [
20
+ 'Do not set Content-Type manually for FormData.',
21
+ 'Browser apps use the app-origin /enfyra/enfyra_file proxy path; the Enfyra server endpoint is /enfyra_file.',
22
+ 'x-enfyra-upload-id correlates $system:upload:progress events for this upload.',
23
+ 'Use file routes/helpers instead of writing binary data into normal tables.',
24
+ ],
25
+ },
26
+ {
27
+ name: 'Use uploaded file in handler',
28
+ code: `const file = @UPLOADED_FILE
29
+ if (!file) @THROW400("File is required")
30
+
31
+ const saved = await @STORAGE.$upload({
32
+ file,
33
+ storageConfig: @BODY.storageConfig,
34
+ folder: @BODY.folder,
35
+ title: @BODY.title,
36
+ description: @BODY.description
37
+ })
38
+
39
+ return saved`,
40
+ notes: [
41
+ 'Use file-specific context only in upload-capable routes.',
42
+ 'For request uploads, pass file: @UPLOADED_FILE to @STORAGE.$upload/@STORAGE.$update so Enfyra streams from the temp file path.',
43
+ 'For upload progress, the client should send x-enfyra-upload-id and listen for the authenticated $system:upload:progress event.',
44
+ 'Use @STORAGE.$registerFile when an external process already uploaded the object and the script only needs to create the enfyra_file record.',
45
+ 'Do not read @UPLOADED_FILE.path into a Buffer and do not generate examples using @UPLOADED_FILE.buffer.',
46
+ 'Use buffer only for small generated or transformed files, such as image thumbnails.',
47
+ ],
48
+ },
49
+ ],
50
+ };
51
+ //# sourceMappingURL=mcp-example-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-example-files.js","sourceRoot":"","sources":["../../src/lib/mcp-example-files.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;IACzB,KAAK,EAAE,6CAA6C;IACpD,OAAO,EAAE,wDAAwD;IACjE,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,4BAA4B;YAClC,IAAI,EAAE;;;;;;;;;;;6BAWe;YACrB,KAAK,EAAE;gBACL,gDAAgD;gBAChD,6GAA6G;gBAC7G,+EAA+E;gBAC/E,4EAA4E;aAC7E;SACF;QACD;YACE,IAAI,EAAE,8BAA8B;YACpC,IAAI,EAAE;;;;;;;;;;;aAWD;YACL,KAAK,EAAE;gBACL,0DAA0D;gBAC1D,gIAAgI;gBAChI,gIAAgI;gBAChI,6IAA6I;gBAC7I,yGAAyG;gBACzG,qFAAqF;aACtF;SACF;KACF;CACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare const flowsExamples: {
2
+ title: string;
3
+ useWhen: string;
4
+ examples: {
5
+ name: string;
6
+ code: string;
7
+ notes: string[];
8
+ }[];
9
+ };
@@ -0,0 +1,76 @@
1
+ export const flowsExamples = {
2
+ title: 'Flows and step scripts',
3
+ useWhen: 'Use when automating background work or chaining steps.',
4
+ examples: [
5
+ {
6
+ name: 'Manual flow trigger from a post-hook',
7
+ code: `if (!@ERROR && @DATA?.data?.[0]) {
8
+ await @TRIGGER("send-welcome-email", {
9
+ userId: @DATA.data[0].id,
10
+ email: @DATA.data[0].email
11
+ })
12
+ }`,
13
+ notes: [
14
+ 'Use flows for workflow semantics, retries, and history.',
15
+ 'Do not use a flow just to persist a normal chat message.',
16
+ ],
17
+ },
18
+ {
19
+ name: 'Flow condition step',
20
+ code: `const order = @FLOW_PAYLOAD.order
21
+ return order && order.total > 1000`,
22
+ notes: [
23
+ 'Condition steps use JavaScript truthy/falsy.',
24
+ 'Children run according to branch true/false.',
25
+ ],
26
+ },
27
+ {
28
+ name: 'Split a provisioning workflow into focused steps',
29
+ code: `[
30
+ { "key": "load_project", "stepOrder": 10, "type": "query" },
31
+ { "key": "reserve_capacity", "stepOrder": 20, "type": "script" },
32
+ { "key": "create_database_user", "stepOrder": 30, "type": "http" },
33
+ { "key": "apply_database_guardrails", "stepOrder": 40, "type": "script" },
34
+ { "key": "start_container", "stepOrder": 50, "type": "http" },
35
+ { "key": "check_health", "stepOrder": 60, "type": "http" },
36
+ { "key": "finalize_project", "stepOrder": 70, "type": "update" },
37
+ { "key": "write_audit_log", "stepOrder": 80, "type": "log" }
38
+ ]`,
39
+ notes: [
40
+ 'Prefer flow_workflow for creating/updating a flow plus steps; it plans fixed step types before saving.',
41
+ 'Use plan_flow_steps only as a lightweight dry-run when the flow itself is not being changed.',
42
+ 'Each step should return only ids, booleans, status keys, or small counters that later steps need.',
43
+ 'When refactoring an existing flow, add or extract adjacent focused enfyra_flow_step rows instead of making an oversized sourceCode block longer.',
44
+ ],
45
+ },
46
+ {
47
+ name: 'Flow query step config',
48
+ code: `{
49
+ "table": "enfyra_user",
50
+ "filter": { "email": { "_contains": "@example.com" } },
51
+ "limit": 50
52
+ }`,
53
+ notes: [
54
+ 'Step configs are JSON; script steps use code strings.',
55
+ 'Use public-safe URLs for HTTP steps.',
56
+ ],
57
+ },
58
+ {
59
+ name: 'Flow create/update/delete step configs',
60
+ code: `// ensure_create_flow_step
61
+ { "table": "todo", "data": { "title": "Review", "status": "open" } }
62
+
63
+ // ensure_update_flow_step
64
+ { "table": "todo", "id": "fixed-todo-id", "data": { "status": "done" } }
65
+
66
+ // ensure_delete_flow_step
67
+ { "table": "todo", "id": "fixed-todo-id" }`,
68
+ notes: [
69
+ 'Use fixed CRUD flow step tools only for static config; ESV does not interpolate @FLOW_PAYLOAD, @FLOW_LAST, or @FLOW inside fixed-step config.',
70
+ 'Use one focused script step when a record id or body comes from runtime flow values, when a step coordinates multiple records, computes complex data, or calls packages.',
71
+ 'Inside a script step, write captured logs with @LOGS(message, details?), not @LOGS.info().',
72
+ ],
73
+ },
74
+ ],
75
+ };
76
+ //# sourceMappingURL=mcp-example-flows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-example-flows.js","sourceRoot":"","sources":["../../src/lib/mcp-example-flows.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;IACzB,KAAK,EAAE,wBAAwB;IAC/B,OAAO,EAAE,wDAAwD;IACjE,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,sCAAsC;YAC5C,IAAI,EAAE;;;;;EAKZ;YACM,KAAK,EAAE;gBACL,yDAAyD;gBACzD,0DAA0D;aAC3D;SACF;QACD;YACE,IAAI,EAAE,qBAAqB;YAC3B,IAAI,EAAE;mCACqB;YAC3B,KAAK,EAAE;gBACL,8CAA8C;gBAC9C,8CAA8C;aAC/C;SACF;QACD;YACE,IAAI,EAAE,kDAAkD;YACxD,IAAI,EAAE;;;;;;;;;EASZ;YACM,KAAK,EAAE;gBACL,wGAAwG;gBACxG,8FAA8F;gBAC9F,mGAAmG;gBACnG,kJAAkJ;aACnJ;SACF;QACD;YACE,IAAI,EAAE,wBAAwB;YAC9B,IAAI,EAAE;;;;EAIZ;YACM,KAAK,EAAE;gBACL,uDAAuD;gBACvD,sCAAsC;aACvC;SACF;QACD;YACE,IAAI,EAAE,wCAAwC;YAC9C,IAAI,EAAE;;;;;;;2CAO6B;YACnC,KAAK,EAAE;gBACL,+IAA+I;gBAC/I,0KAA0K;gBAC1K,4FAA4F;aAC7F;SACF;KACF;CACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare const graphqlExamples: {
2
+ title: string;
3
+ useWhen: string;
4
+ examples: {
5
+ name: string;
6
+ code: string;
7
+ notes: string[];
8
+ }[];
9
+ };
@@ -0,0 +1,57 @@
1
+ export const graphqlExamples = {
2
+ title: 'GraphQL table exposure, queries, mutations, and verification',
3
+ useWhen: 'Use when enabling generated GraphQL for a table or executing a GraphQL operation through Enfyra.',
4
+ examples: [
5
+ {
6
+ name: 'Enable a table and verify its generated query',
7
+ code: `inspect_table({ tableName: "project" })
8
+
9
+ set_table_graphql({
10
+ tableName: "project",
11
+ isEnabled: true,
12
+ globalRulesAckKey: "<globalRulesAckKey from get_enfyra_required_knowledge>"
13
+ })
14
+
15
+ test_graphql({
16
+ operationName: "VerifyProjects",
17
+ query: \`query VerifyProjects {
18
+ project(limit: 1) {
19
+ data { id name }
20
+ meta { totalCount }
21
+ }
22
+ }\`
23
+ })`,
24
+ notes: [
25
+ 'GraphQL root query names match enabled Enfyra table names and return data plus meta.',
26
+ 'Only select fields confirmed by inspect_table or the live GraphQL schema; unpublished fields are not generated.',
27
+ 'GraphQL table operations require Bearer authentication even when the REST route has publicMethods.',
28
+ 'enfyra_graphql stores exposure metadata. Resolvers are generated by Enfyra and do not have editable sourceCode.',
29
+ ],
30
+ },
31
+ {
32
+ name: 'Execute a generated GraphQL mutation with variables',
33
+ code: `test_graphql({
34
+ operationName: "CreateTodo",
35
+ query: \`mutation CreateTodo($input: todoInput!) {
36
+ create_todo(input: $input) {
37
+ id
38
+ title
39
+ status
40
+ }
41
+ }\`,
42
+ variables: {
43
+ input: {
44
+ title: "Review GraphQL contract",
45
+ status: "open"
46
+ }
47
+ }
48
+ })`,
49
+ notes: [
50
+ 'Generated mutation names are create_<table>, update_<table>, and delete_<table>.',
51
+ 'Inspect the live schema before choosing input fields because required fields and scalar types come from current table metadata.',
52
+ 'test_graphql returns GraphQL errors as structured data; do not treat HTTP 200 alone as success.',
53
+ ],
54
+ },
55
+ ],
56
+ };
57
+ //# sourceMappingURL=mcp-example-graphql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-example-graphql.js","sourceRoot":"","sources":["../../src/lib/mcp-example-graphql.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG;IAC3B,KAAK,EAAE,8DAA8D;IACrE,OAAO,EAAE,kGAAkG;IAC3G,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,+CAA+C;YACrD,IAAI,EAAE;;;;;;;;;;;;;;;;GAgBX;YACK,KAAK,EAAE;gBACL,sFAAsF;gBACtF,iHAAiH;gBACjH,oGAAoG;gBACpG,iHAAiH;aAClH;SACF;QACD;YACE,IAAI,EAAE,qDAAqD;YAC3D,IAAI,EAAE;;;;;;;;;;;;;;;GAeX;YACK,KAAK,EAAE;gBACL,kFAAkF;gBAClF,iIAAiI;gBACjI,iGAAiG;aAClG;SACF;KACF;CACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare const handlersHooksExamples: {
2
+ title: string;
3
+ useWhen: string;
4
+ examples: {
5
+ name: string;
6
+ code: string;
7
+ notes: string[];
8
+ }[];
9
+ };
@@ -0,0 +1,328 @@
1
+ export const handlersHooksExamples = {
2
+ title: 'Custom handlers, pre-hooks, post-hooks, and script macros',
3
+ useWhen: 'Use when writing Enfyra dynamic JavaScript for REST behavior.',
4
+ examples: [
5
+ {
6
+ name: 'Create a route handler with current script fields',
7
+ code: `create_handler({
8
+ routeId: "<route_id>",
9
+ method: "POST",
10
+ scriptLanguage: "javascript",
11
+ globalRulesAckKey: "<globalRulesAckKey from get_enfyra_required_knowledge>",
12
+ knowledgeAckKey: "<dynamicCodeAckKey from get_enfyra_required_knowledge>",
13
+ sourceCode: \`const email = @BODY.email
14
+ if (!email) @THROW400("Email is required")
15
+
16
+ return { ok: true, email }\`
17
+ })`,
18
+ notes: [
19
+ 'Use sourceCode, not logic. The server generates compiledCode.',
20
+ 'Call get_enfyra_required_knowledge before saving dynamic code, pass globalRulesAckKey as globalRulesAckKey, and pass dynamicCodeAckKey as knowledgeAckKey.',
21
+ 'Use method for one handler, or methods only when the same sourceCode should be saved for multiple methods.',
22
+ 'Do not pass name to enfyra_route_handler; one handler is identified by route + method.',
23
+ ],
24
+ },
25
+ {
26
+ name: 'Third-party create endpoint with server-owned identity',
27
+ code: `api_endpoint_workflow({
28
+ path: "/integrations/orders",
29
+ method: "POST",
30
+ anonymousAccess: "private",
31
+ roleName: "user",
32
+ applyAll: true,
33
+ globalRulesAckKey: "<globalRulesAckKey from get_enfyra_required_knowledge>",
34
+ knowledgeAckKey: "<dynamicCodeAckKey from get_enfyra_required_knowledge>",
35
+ sourceCode: \`const title = @BODY.title
36
+ if (!title) @THROW400("title is required")
37
+
38
+ const result = await #secure.orders.create({
39
+ data: {
40
+ ...@BODY,
41
+ owner: @USER.id
42
+ },
43
+ fields: ["id", "title", "owner"]
44
+ })
45
+
46
+ const order = result.data?.[0] ?? null
47
+ if (!order) @THROW500("Order was not returned after create")
48
+ return {
49
+ id: order.id,
50
+ title: order.title,
51
+ owner: order.owner?.id || order.owner
52
+ }\`
53
+ })`,
54
+ notes: [
55
+ 'Custom routes have no main table, so explicit user-facing access uses #secure.orders rather than @REPOS.main.',
56
+ 'data: @BODY is valid TypeORM-style repository usage. Put ...@BODY first and server-owned fields afterward so caller input cannot override them.',
57
+ 'Custom handlers do not inherit canonical column-rule/Zod middleware; validate the endpoint-specific business payload in the handler.',
58
+ 'Replace orders, owner, fields, role, and path only after inspecting live metadata and the intended external contract.',
59
+ ],
60
+ },
61
+ {
62
+ name: 'Third-party scoped update endpoint',
63
+ code: `const found = await #secure.orders.find({
64
+ filter: {
65
+ _and: [
66
+ { id: { _eq: @PARAMS.id } },
67
+ { owner: { id: { _eq: @USER.id } } }
68
+ ]
69
+ },
70
+ fields: ["id", "title", "owner"],
71
+ limit: 1
72
+ })
73
+
74
+ const order = found.data?.[0]
75
+ if (!order) @THROW404("Order not found")
76
+
77
+ const result = await #secure.orders.update({
78
+ id: order.id,
79
+ data: {
80
+ ...@BODY,
81
+ owner: @USER.id
82
+ },
83
+ fields: ["id", "title", "owner"]
84
+ })
85
+
86
+ const updated = result.data?.[0] ?? null
87
+ return updated
88
+ ? { id: updated.id, title: updated.title, owner: updated.owner?.id || updated.owner }
89
+ : null`,
90
+ notes: [
91
+ 'The scoped lookup proves the current row belongs to the caller before mutation; route permission and secure repository selection do not prove ownership.',
92
+ 'The update keeps owner server-controlled instead of allowing @BODY to reassign it.',
93
+ 'If ownership can change concurrently, make it immutable or use the transaction/business invariant appropriate to the application.',
94
+ ],
95
+ },
96
+ {
97
+ name: 'Third-party action updates a non-updatable server field',
98
+ code: `const found = await #secure.orders.find({
99
+ filter: {
100
+ _and: [
101
+ { id: { _eq: @PARAMS.id } },
102
+ { owner: { id: { _eq: @USER.id } } }
103
+ ]
104
+ },
105
+ fields: ["id", "status", "owner"],
106
+ limit: 1
107
+ })
108
+
109
+ const order = found.data?.[0]
110
+ if (!order) @THROW404("Order not found")
111
+ if (order.status !== "pending") @THROW409("Order is not pending")
112
+
113
+ const result = await #orders.update({
114
+ id: order.id,
115
+ data: { status: "cancelled" },
116
+ fields: ["id", "status"]
117
+ })
118
+
119
+ const updated = result.data?.[0] ?? null
120
+ return updated ? { id: updated.id, status: updated.status } : null`,
121
+ notes: [
122
+ 'The secure lookup proves caller scope before the privileged mutation.',
123
+ 'The trusted write is intentional because status is server-owned and non-updatable through normal CRUD. It writes an exact literal object, never raw @BODY.',
124
+ 'Do not change status.isUpdatable to make this action work; that would broaden canonical CRUD for eApp and every other consumer.',
125
+ 'Return an explicit response shape and never the raw trusted row.',
126
+ ],
127
+ },
128
+ {
129
+ name: 'Custom register handler',
130
+ code: `const email = @BODY.email
131
+ const password = @BODY.password
132
+
133
+ if (!email || !password) @THROW400("Email and password are required")
134
+
135
+ const existing = await #enfyra_user.find({
136
+ filter: { email: { _eq: email } },
137
+ limit: 1
138
+ })
139
+ if (existing.data[0]) @THROW409("Email is already registered")
140
+
141
+ const result = await #enfyra_user.create({
142
+ data: {
143
+ email,
144
+ password: await @HELPERS.$bcrypt.hash(password)
145
+ }
146
+ })
147
+
148
+ const user = result.data?.[0] ?? null
149
+ if (!user) @THROW500("User was not returned after create")
150
+ return { id: user.id, email: user.email }`,
151
+ notes: [
152
+ 'create/update return { data: [...] }, not a bare row.',
153
+ 'The trusted user repository is intentional for registration internals. Shape the response explicitly and never return the raw trusted row.',
154
+ 'Use numeric @THROW helpers for raw HTTP messages. If you pass details, pass an object/array such as @THROW404("Request not found", { requestId }). Use @THROW.notFound(resource, id?) or @THROW.duplicate(resource, field, value) only when you want Enfyra-formatted semantic messages.',
155
+ 'Prefer macros over raw $ctx when a macro exists.',
156
+ ],
157
+ },
158
+ {
159
+ name: 'Workflow handler with relation read and side effects',
160
+ code: `const requestId = @BODY.requestId
161
+ if (!requestId) @THROW400("requestId is required")
162
+
163
+ const found = await #secure.app_requests.find({
164
+ filter: { id: { _eq: requestId } },
165
+ fields: ["id", "title", "status", "requester"],
166
+ deep: {
167
+ requester: { fields: ["id", "email"] }
168
+ },
169
+ limit: 1
170
+ })
171
+
172
+ const request = found.data?.[0]
173
+ if (!request) @THROW404("Request not found")
174
+ if (request.status !== "pending") @THROW409("Request is not pending")
175
+
176
+ await #secure.app_requests.update({
177
+ id: request.id,
178
+ data: { status: "approved" }
179
+ })
180
+
181
+ await #app_audit_log.create({
182
+ data: {
183
+ action: "request_approved",
184
+ request: request.id,
185
+ actor: @USER?.id || undefined
186
+ }
187
+ })
188
+
189
+ await #app_notifications.create({
190
+ data: {
191
+ kind: "request_approved",
192
+ recipient: request.requester?.id || request.requester,
193
+ request: request.id,
194
+ isRead: false
195
+ }
196
+ })
197
+
198
+ return { ok: true, id: request.id, status: "approved" }`,
199
+ notes: [
200
+ 'This is a shape example, not a table template: replace app_requests/app_audit_log/app_notifications and relation names with live metadata.',
201
+ 'In dynamic scripts, top-level fields controls which parent properties appear. When using deep requester, also include requester in top-level fields.',
202
+ 'Inside deep.requester.fields, choose fields from the related requester row.',
203
+ 'Use #secure.table for user-facing reads and writes so field permissions stay enabled. The audit/notification writes above are trusted internal side effects and must return only the shaped response.',
204
+ 'Create/update return { data: [...] }; use result.data?.[0] when the script needs the saved object.',
205
+ ],
206
+ },
207
+ {
208
+ name: 'Find one record by id in a handler',
209
+ code: `const reportId = @BODY.reportId
210
+ if (!reportId) @THROW400("reportId is required")
211
+
212
+ const found = await #secure.app_reports.find({
213
+ filter: { id: { _eq: reportId } },
214
+ fields: ["id", "status", "owner"],
215
+ limit: 1
216
+ })
217
+
218
+ const report = found.data?.[0]
219
+ if (!report) @THROW404("Report not found", { reportId })
220
+
221
+ return {
222
+ id: report.id,
223
+ status: report.status
224
+ }`,
225
+ notes: [
226
+ 'Use #secure.table_name with explicit fields and limit:1 for user-facing dynamic-script lookups.',
227
+ 'Use id filters when they work in the live runtime, but do not keep retrying @REPOS.<table>.find id filter shapes if a runtime reports undefined SQL bindings.',
228
+ 'If primary-key filtering fails in a runtime, pivot to a unique business field, the route main-table context, or a bounded query that you can verify, then update the contract/example for that runtime.',
229
+ 'Never return raw trusted repository rows; shape the response explicitly.',
230
+ ],
231
+ },
232
+ {
233
+ name: 'Canonical route pre-hook RLS filter merge',
234
+ code: `const incoming = @QUERY.filter || {}
235
+ const scope = {
236
+ memberships: {
237
+ member: { id: { _eq: @USER.id } }
238
+ }
239
+ }
240
+
241
+ @QUERY.filter = Object.keys(incoming).length
242
+ ? { _and: [incoming, scope] }
243
+ : scope`,
244
+ notes: [
245
+ '@QUERY.filter is initialized as an object for REST pre-hooks.',
246
+ 'Mutate @QUERY.filter before canonical CRUD runs.',
247
+ 'This policy affects every consumer of the canonical route, including eApp. Use a separate custom endpoint handler when the scope is third-party-only.',
248
+ 'Do not override @QUERY.fields, @QUERY.deep, @QUERY.sort, @QUERY.limit, @QUERY.page, @QUERY.meta, @QUERY.aggregate, or debugMode in RLS; keep projection and pagination client-owned.',
249
+ ],
250
+ },
251
+ {
252
+ name: 'Encrypted field table definition',
253
+ code: `create_tables({
254
+ globalRulesAckKey: "<globalRulesAckKey from get_enfyra_required_knowledge>",
255
+ items: [
256
+ {
257
+ name: "integrations",
258
+ columns: [
259
+ { name: "name", type: "varchar", isNullable: false },
260
+ {
261
+ name: "api_token",
262
+ type: "varchar",
263
+ isNullable: false,
264
+ isPublished: false,
265
+ isEncrypted: true
266
+ }
267
+ ]
268
+ }
269
+ ]
270
+ })`,
271
+ notes: [
272
+ 'Use isEncrypted=true for values that must be encrypted at rest.',
273
+ 'Scripts and REST callers read and write plaintext values; Enfyra encrypts on write and decrypts after select.',
274
+ 'Set isPublished=false for secret fields that should not be exposed by default.',
275
+ 'isEncrypted does not imply immutability; add isUpdatable=false separately only when the value must not change.',
276
+ 'Do not generate manual $encrypt hooks or accept caller-supplied enc:v1: ciphertext for normal app data.',
277
+ 'Encrypted fields cannot be filtered or sorted.',
278
+ ],
279
+ },
280
+ {
281
+ name: 'Pre-hook strips protected body fields silently',
282
+ code: `create_pre_hook({
283
+ routeId: "<enfyra_user_patch_route_id>",
284
+ name: "strip_email_verification_fields",
285
+ methods: ["PATCH"],
286
+ priority: -10,
287
+ globalRulesAckKey: "<globalRulesAckKey from get_enfyra_required_knowledge>",
288
+ knowledgeAckKey: "<dynamicCodeAckKey from get_enfyra_required_knowledge>",
289
+ code: \`delete @BODY.emailVerifiedAt
290
+ delete @BODY.emailVerificationStatus
291
+ delete @BODY.emailVerificationSentAt\`
292
+ })`,
293
+ notes: [
294
+ 'Use this pattern when clients may send protected user fields through /me or enfyra_user PATCH.',
295
+ 'Strip fields instead of throwing when the product wants a permissive client contract with server-owned fields.',
296
+ 'Use native macros such as @BODY instead of raw $ctx when a macro exists.',
297
+ ],
298
+ },
299
+ {
300
+ name: 'Post-hook response shaping',
301
+ code: `create_post_hook({
302
+ routeId: "<route_id>",
303
+ name: "shape_display_title",
304
+ methods: ["GET"],
305
+ priority: 0,
306
+ globalRulesAckKey: "<globalRulesAckKey from get_enfyra_required_knowledge>",
307
+ knowledgeAckKey: "<dynamicCodeAckKey from get_enfyra_required_knowledge>",
308
+ code: \`if (@ERROR) {
309
+ @LOGS("Request failed", @ERROR.message)
310
+ return
311
+ }
312
+
313
+ const row = Array.isArray(@DATA?.data) ? @DATA.data[0] : @DATA
314
+ if (row) {
315
+ row.displayTitle = row.title || row.email || String(row.id)
316
+ }
317
+
318
+ return @DATA\`
319
+ })`,
320
+ notes: [
321
+ 'MCP create_post_hook accepts code as the tool argument, then persists sourceCode/scriptLanguage to Enfyra.',
322
+ 'Post-hooks run after success and error paths.',
323
+ 'Return non-undefined only when replacing the response body.',
324
+ ],
325
+ },
326
+ ],
327
+ };
328
+ //# sourceMappingURL=mcp-example-handlers-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-example-handlers-hooks.js","sourceRoot":"","sources":["../../src/lib/mcp-example-handlers-hooks.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACjC,KAAK,EAAE,2DAA2D;IAClE,OAAO,EAAE,+DAA+D;IACxE,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,mDAAmD;YACzD,IAAI,EAAE;;;;;;;;;;GAUX;YACK,KAAK,EAAE;gBACL,+DAA+D;gBAC/D,4JAA4J;gBAC5J,4GAA4G;gBAC5G,wFAAwF;aACzF;SACF;QACD;YACE,IAAI,EAAE,wDAAwD;YAC9D,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BX;YACK,KAAK,EAAE;gBACL,+GAA+G;gBAC/G,iJAAiJ;gBACjJ,sIAAsI;gBACtI,uHAAuH;aACxH;SACF;QACD;YACE,IAAI,EAAE,oCAAoC;YAC1C,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;SA0BL;YACD,KAAK,EAAE;gBACL,0JAA0J;gBAC1J,oFAAoF;gBACpF,mIAAmI;aACpI;SACF;QACD;YACE,IAAI,EAAE,yDAAyD;YAC/D,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;mEAsBqD;YAC3D,KAAK,EAAE;gBACL,uEAAuE;gBACvE,4JAA4J;gBAC5J,iIAAiI;gBACjI,kEAAkE;aACnE;SACF;QACD;YACE,IAAI,EAAE,yBAAyB;YAC/B,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;0CAoB4B;YAClC,KAAK,EAAE;gBACL,uDAAuD;gBACvD,4IAA4I;gBAC5I,0RAA0R;gBAC1R,kDAAkD;aACnD;SACF;QACD;YACE,IAAI,EAAE,sDAAsD;YAC5D,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wDAsC0C;YAChD,KAAK,EAAE;gBACL,4IAA4I;gBAC5I,sJAAsJ;gBACtJ,6EAA6E;gBAC7E,uMAAuM;gBACvM,oGAAoG;aACrG;SACF;QACD;YACE,IAAI,EAAE,oCAAoC;YAC1C,IAAI,EAAE;;;;;;;;;;;;;;;EAeZ;YACM,KAAK,EAAE;gBACL,iGAAiG;gBACjG,+JAA+J;gBAC/J,yMAAyM;gBACzM,0EAA0E;aAC3E;SACF;QACD;YACE,IAAI,EAAE,2CAA2C;YACjD,IAAI,EAAE;;;;;;;;;UASJ;YACF,KAAK,EAAE;gBACL,+DAA+D;gBAC/D,kDAAkD;gBAClD,uJAAuJ;gBACvJ,sLAAsL;aACvL;SACF;QACD;YACE,IAAI,EAAE,kCAAkC;YACxC,IAAI,EAAE;;;;;;;;;;;;;;;;;GAiBX;YACK,KAAK,EAAE;gBACL,iEAAiE;gBACjE,+GAA+G;gBAC/G,gFAAgF;gBAChF,gHAAgH;gBAChH,yGAAyG;gBACzG,gDAAgD;aACjD;SACF;QACD;YACE,IAAI,EAAE,gDAAgD;YACtD,IAAI,EAAE;;;;;;;;;;GAUX;YACK,KAAK,EAAE;gBACL,gGAAgG;gBAChG,gHAAgH;gBAChH,0EAA0E;aAC3E;SACF;QACD;YACE,IAAI,EAAE,4BAA4B;YAClC,IAAI,EAAE;;;;;;;;;;;;;;;;;;GAkBX;YACK,KAAK,EAAE;gBACL,4GAA4G;gBAC5G,+CAA+C;gBAC/C,6DAA6D;aAC9D;SACF;KACF;CACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare const oauthSetupExamples: {
2
+ title: string;
3
+ useWhen: string;
4
+ examples: {
5
+ name: string;
6
+ code: string;
7
+ notes: string[];
8
+ }[];
9
+ };
@@ -0,0 +1,41 @@
1
+ export const oauthSetupExamples = {
2
+ title: 'OAuth provider setup',
3
+ useWhen: 'Use only after the third app follows the connect contract and the user is ready to supply Google, Facebook, or GitHub client credentials.',
4
+ examples: [
5
+ {
6
+ name: 'Configure the provider and hand off its callback',
7
+ code: `setup_oauth_provider({
8
+ provider: "google",
9
+ clientId: "<user-supplied-client-id>",
10
+ clientSecret: "<user-supplied-client-secret>",
11
+ appConnectionVerified: true,
12
+ globalRulesAckKey: "<globalRulesAckKey>",
13
+ })`,
14
+ notes: [
15
+ 'Connect the third app before asking for provider credentials. Load category=connect, inspect its framework, and verify the proxy, OAuth start action, cookieBridgePrefix, and /me flow first.',
16
+ 'After the connection is verified, stop and ask the user to supply provider, clientId, and clientSecret. Never read or reuse stored credential values, never infer credentials, and never ask the user for a callback URI.',
17
+ 'Do not present callbackUri or ask the user to configure the provider console before setup_oauth_provider returns its receipt. If credentials are missing, ask only for clientId and clientSecret and stop.',
18
+ 'appConnectionVerified=true is required and may be sent only after that app connection check.',
19
+ 'setup_oauth_provider derives callbackUri from the connected Enfyra API target, upserts enfyra_oauth_config, enables autoSetCookies, verifies runtime activation, and returns no credentials.',
20
+ 'The receipt has setupComplete=false. Present providerConsole.value exactly as returned, ask the user to add it to providerConsole.field, then stop and wait for confirmation.',
21
+ 'After confirmation, use the OAuth button in the already connected app and verify /me before reporting setup success.',
22
+ ],
23
+ },
24
+ {
25
+ name: 'Provider console handoff',
26
+ code: `// Use the successful setup_oauth_provider receipt.
27
+ const callback = result.callbackUri
28
+
29
+ // Google: Authorized redirect URIs
30
+ // Facebook: Valid OAuth Redirect URIs
31
+ // GitHub: Authorization callback URL`,
32
+ notes: [
33
+ 'The provider callback is an Enfyra API URL, not the third-app return page.',
34
+ 'If runtimeProviderActive is false, resolve verification before sending the user to the provider console.',
35
+ 'Neither /auth/providers nor an existing linked OAuth account proves the provider console callback or current credentials work; complete a real browser login after confirmation.',
36
+ 'Never echo clientId or clientSecret in the handoff.',
37
+ ],
38
+ },
39
+ ],
40
+ };
41
+ //# sourceMappingURL=mcp-example-oauth-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-example-oauth-setup.js","sourceRoot":"","sources":["../../src/lib/mcp-example-oauth-setup.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAC9B,KAAK,EAAE,sBAAsB;IAC7B,OAAO,EAAE,2IAA2I;IACpJ,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,kDAAkD;YACxD,IAAI,EAAE;;;;;;GAMX;YACK,KAAK,EAAE;gBACL,+LAA+L;gBAC/L,2NAA2N;gBAC3N,4MAA4M;gBAC5M,8FAA8F;gBAC9F,8LAA8L;gBAC9L,+KAA+K;gBAC/K,sHAAsH;aACvH;SACF;QACD;YACE,IAAI,EAAE,0BAA0B;YAChC,IAAI,EAAE;;;;;sCAKwB;YAC9B,KAAK,EAAE;gBACL,4EAA4E;gBAC5E,0GAA0G;gBAC1G,kLAAkL;gBAClL,qDAAqD;aACtD;SACF;KACF;CACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare const permissionsRlsExamples: {
2
+ title: string;
3
+ useWhen: string;
4
+ examples: {
5
+ name: string;
6
+ code: string;
7
+ notes: string[];
8
+ }[];
9
+ };