@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,210 @@
1
+ export const permissionsRlsExamples = {
2
+ title: 'Route permissions, guards, field permissions, column rules, and RLS',
3
+ useWhen: 'Use when securing routes or shaping what fields a user can read/write.',
4
+ examples: [
5
+ {
6
+ name: 'Audit and grant authenticated route access',
7
+ code: `audit_route_access({
8
+ path: "/orders",
9
+ roleName: "user",
10
+ methods: ["GET", "POST"]
11
+ })
12
+
13
+ ensure_route_access({
14
+ path: "/orders",
15
+ roleName: "user",
16
+ methods: ["GET", "POST"],
17
+ description: "Authenticated users can list and create their own orders.",
18
+ globalRulesAckKey: "<globalRulesAckKey from get_enfyra_required_knowledge>"
19
+ })`,
20
+ notes: [
21
+ 'Start with the security boundary: choose public/private methods, role or user route access, owner/tenant scope, and field exposure before writing handler or UI logic.',
22
+ 'Use route permissions for authenticated access. The tool resolves role and method ids, validates the route available methods, merges existing methods, and reloads routes.',
23
+ 'Handlers or pre-hooks must still enforce owner or tenant scope; route permission only lets the request pass RoleGuard.',
24
+ 'Use publicMethods only for anonymous public access.',
25
+ ],
26
+ },
27
+ {
28
+ name: 'Make a read-only route public',
29
+ code: `public_route_methods({
30
+ path: "/articles",
31
+ methods: ["GET"],
32
+ globalRulesAckKey: "<globalRulesAckKey from get_enfyra_required_knowledge>"
33
+ })`,
34
+ notes: [
35
+ 'Use public_route_methods instead of raw enfyra_route updates; the tool resolves method ids and validates that GET is available.',
36
+ 'publicMethods controls anonymous route access. Route permissions are not for public access.',
37
+ 'Route permissions apply when the method is not public.',
38
+ ],
39
+ },
40
+ {
41
+ name: 'Rate limit anonymous requests by IP',
42
+ code: `ensure_route_rate_limit({
43
+ path: "/newsletter_signup",
44
+ methods: ["POST"],
45
+ scope: "ip",
46
+ maxRequests: 10,
47
+ perSeconds: 60,
48
+ description: "Limit anonymous signup attempts by client IP.",
49
+ globalRulesAckKey: "<globalRulesAckKey from get_enfyra_required_knowledge>"
50
+ })
51
+
52
+ inspect_route({ path: "/newsletter_signup" })
53
+
54
+ test_rest_endpoint({
55
+ method: "POST",
56
+ path: "/newsletter_signup",
57
+ body: { email: "test@example.com" }
58
+ })`,
59
+ notes: [
60
+ 'Use ensure_route_rate_limit for request throttling so the built-in guard engine enforces the limit.',
61
+ 'Use scope "ip" for anonymous/public route protection because no user is available yet.',
62
+ 'Inspect and test after creation so the final behavior is verified through the actual REST route.',
63
+ ],
64
+ },
65
+ {
66
+ name: 'Rate limit authenticated users',
67
+ code: `ensure_route_rate_limit({
68
+ path: "/projects",
69
+ methods: ["POST"],
70
+ scope: "user",
71
+ maxRequests: 3,
72
+ perSeconds: 3600,
73
+ description: "Authenticated users can create at most 3 projects per hour.",
74
+ globalRulesAckKey: "<globalRulesAckKey from get_enfyra_required_knowledge>"
75
+ })`,
76
+ notes: [
77
+ 'User-scoped limits automatically use post_auth because the server only has user id after auth and RoleGuard.',
78
+ 'This does not grant access; users still need route permissions or a public method to reach the route.',
79
+ 'Use ensure_guard only for advanced guard trees such as IP allowlists/blacklists or composed AND/OR guard rules.',
80
+ ],
81
+ },
82
+ {
83
+ name: 'Restrict an admin-only route to office IPs',
84
+ code: `ensure_guard({
85
+ name: "Admin reports office allowlist",
86
+ path: "/admin/reports",
87
+ methods: ["GET", "POST"],
88
+ position: "pre_auth",
89
+ isEnabled: false,
90
+ description: "Only office network IPs can reach admin reports.",
91
+ globalRulesAckKey: "<globalRulesAckKey from get_enfyra_required_knowledge>",
92
+ rules: JSON.stringify([
93
+ {
94
+ type: "ip_whitelist",
95
+ config: { ips: ["203.0.113.10", "198.51.100.0/24"] }
96
+ }
97
+ ])
98
+ })`,
99
+ notes: [
100
+ 'Create risky allowlists disabled first, then inspect the saved guard before enabling it.',
101
+ 'IP list configs use ips; exact IPv4 addresses and IPv4 CIDR ranges are supported.',
102
+ 'An allowlist is an additional gate, not a replacement for route permissions.',
103
+ ],
104
+ },
105
+ {
106
+ name: 'Column rule for email format',
107
+ code: `ensure_column_rule({
108
+ tableName: "enfyra_user",
109
+ columnName: "email",
110
+ ruleType: "format",
111
+ value: JSON.stringify({ v: "email" }),
112
+ message: "Please enter a valid email address",
113
+ globalRulesAckKey: "<globalRulesAckKey from get_enfyra_required_knowledge>"
114
+ })`,
115
+ notes: [
116
+ 'Column rules validate canonical POST/PATCH body payloads.',
117
+ 'The rule value payload uses the { v: ... } shape; do not pass ruleConfig.',
118
+ 'Use column rules before writing custom validation code when the rule is simple.',
119
+ ],
120
+ },
121
+ {
122
+ name: 'Field permission condition',
123
+ code: `ensure_field_permission({
124
+ tableName: "project",
125
+ columnName: "internal_notes",
126
+ action: "read",
127
+ effect: "allow",
128
+ roleName: "user",
129
+ condition: JSON.stringify({
130
+ owner: { id: { _eq: "@USER.id" } }
131
+ }),
132
+ globalRulesAckKey: "<globalRulesAckKey from get_enfyra_required_knowledge>"
133
+ })`,
134
+ notes: [
135
+ 'Field permissions are for field-level access.',
136
+ 'Use route/pre-hook filters for row-level access.',
137
+ ],
138
+ },
139
+ {
140
+ name: 'Admin menu and extension permission gates',
141
+ code: `<template>
142
+ <section class="space-y-4">
143
+ <PermissionGate :condition="canReadReports">
144
+ <template #default>
145
+ <div class="flex items-center justify-between gap-3">
146
+ <h2 class="text-lg font-semibold">Reports</h2>
147
+
148
+ <PermissionGate :condition="canCreateReport">
149
+ <UButton icon="i-lucide-plus" label="Create report" @click="openCreate = true" />
150
+ </PermissionGate>
151
+ </div>
152
+
153
+ <div v-for="report in reports" :key="report.id" class="rounded-lg border p-4">
154
+ <NuxtLink :to="\`/reports/\${report.id}\`" class="font-medium">
155
+ {{ report.title }}
156
+ </NuxtLink>
157
+
158
+ <div class="mt-3 flex gap-2">
159
+ <PermissionGate :condition="canUpdateReport">
160
+ <UButton icon="i-lucide-pencil" variant="outline" label="Edit" @click="openEdit(report)" />
161
+ </PermissionGate>
162
+
163
+ <PermissionGate :condition="canDeleteReport">
164
+ <UButton icon="i-lucide-trash-2" color="error" variant="outline" label="Delete" @click="openDelete(report)" />
165
+ </PermissionGate>
166
+ </div>
167
+ </div>
168
+ </template>
169
+
170
+ <template #fallback>
171
+ <EmptyState title="No access" description="You do not have permission to view reports." />
172
+ </template>
173
+ </PermissionGate>
174
+ </section>
175
+ </template>
176
+
177
+ <script setup>
178
+ const { checkPermissionCondition } = usePermissions()
179
+
180
+ const canReadReports = computed(() => checkPermissionCondition({
181
+ or: [
182
+ { route: '/reports', methods: ['GET'] },
183
+ { route: '/report', methods: ['GET'] }
184
+ ]
185
+ }))
186
+
187
+ const canCreateReport = computed(() => checkPermissionCondition({
188
+ or: [{ route: '/report', methods: ['POST'] }]
189
+ }))
190
+
191
+ const canUpdateReport = computed(() => checkPermissionCondition({
192
+ or: [{ route: '/report', methods: ['PATCH'] }]
193
+ }))
194
+
195
+ const canDeleteReport = computed(() => checkPermissionCondition({
196
+ or: [{ route: '/report', methods: ['DELETE'] }]
197
+ }))
198
+ </script>`,
199
+ notes: [
200
+ 'This is menu/extension visibility, not row-level RLS.',
201
+ 'Set enfyra_menu.permission on every sensitive admin menu. Example for /reports: { or: [{ route: "/reports", methods: ["GET"] }, { route: "/report", methods: ["GET"] }] }.',
202
+ 'Admin pages are sensitive. Use permission gates by default, not as an optional polish step.',
203
+ 'Menus should only be visible when the user has at least GET permission for the page route or backing data route.',
204
+ 'Inside the extension, gate each action by its own route/method: GET for page visibility, POST for create/flow-trigger buttons, PATCH for normal record edits, DELETE for native delete routes.',
205
+ 'Server route permissions remain mandatory; UI gates are for clear operator UX and least-privilege surfaces.',
206
+ ],
207
+ },
208
+ ],
209
+ };
210
+ //# sourceMappingURL=mcp-example-permissions-rls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-example-permissions-rls.js","sourceRoot":"","sources":["../../src/lib/mcp-example-permissions-rls.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG;IAClC,KAAK,EAAE,qEAAqE;IAC5E,OAAO,EAAE,wEAAwE;IACjF,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,4CAA4C;YAClD,IAAI,EAAE;;;;;;;;;;;;GAYX;YACK,KAAK,EAAE;gBACL,wKAAwK;gBACxK,4KAA4K;gBAC5K,wHAAwH;gBACxH,qDAAqD;aACtD;SACF;QACD;YACE,IAAI,EAAE,+BAA+B;YACrC,IAAI,EAAE;;;;GAIX;YACK,KAAK,EAAE;gBACL,iIAAiI;gBACjI,6FAA6F;gBAC7F,wDAAwD;aACzD;SACF;QACD;YACE,IAAI,EAAE,qCAAqC;YAC3C,IAAI,EAAE;;;;;;;;;;;;;;;;GAgBX;YACK,KAAK,EAAE;gBACL,qGAAqG;gBACrG,wFAAwF;gBACxF,kGAAkG;aACnG;SACF;QACD;YACE,IAAI,EAAE,gCAAgC;YACtC,IAAI,EAAE;;;;;;;;GAQX;YACK,KAAK,EAAE;gBACL,8GAA8G;gBAC9G,uGAAuG;gBACvG,iHAAiH;aAClH;SACF;QACD;YACE,IAAI,EAAE,4CAA4C;YAClD,IAAI,EAAE;;;;;;;;;;;;;;GAcX;YACK,KAAK,EAAE;gBACL,0FAA0F;gBAC1F,mFAAmF;gBACnF,8EAA8E;aAC/E;SACF;QACD;YACE,IAAI,EAAE,8BAA8B;YACpC,IAAI,EAAE;;;;;;;GAOX;YACK,KAAK,EAAE;gBACL,2DAA2D;gBAC3D,2EAA2E;gBAC3E,iFAAiF;aAClF;SACF;QACD;YACE,IAAI,EAAE,4BAA4B;YAClC,IAAI,EAAE;;;;;;;;;;GAUX;YACK,KAAK,EAAE;gBACL,+CAA+C;gBAC/C,kDAAkD;aACnD;SACF;QACD;YACE,IAAI,EAAE,2CAA2C;YACjD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAyDJ;YACF,KAAK,EAAE;gBACL,uDAAuD;gBACvD,4KAA4K;gBAC5K,6FAA6F;gBAC7F,kHAAkH;gBAClH,gMAAgM;gBAChM,6GAA6G;aAC9G;SACF;KACF;CACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare const queriesDeepExamples: {
2
+ title: string;
3
+ useWhen: string;
4
+ examples: {
5
+ name: string;
6
+ code: string;
7
+ notes: string[];
8
+ }[];
9
+ };
@@ -0,0 +1,220 @@
1
+ export const queriesDeepExamples = {
2
+ title: 'REST queries, filters, meta counts, and deep relation fetches',
3
+ useWhen: 'Use when fetching records, filtering by relations, loading nested relation data in the same request, or counting efficiently.',
4
+ examples: [
5
+ {
6
+ name: 'Minimal MCP query then explicit detail query',
7
+ code: `query_table({
8
+ tableName: "enfyra_user",
9
+ fields: ["id", "email"],
10
+ filter: { email: { _contains: "@example.com" } },
11
+ limit: 10
12
+ })`,
13
+ notes: [
14
+ 'Always pass fields when you need more than ids; query_table without fields intentionally returns only the primary key.',
15
+ 'Use inspect_table first when you do not know valid column names or relation propertyName values.',
16
+ 'Use count_records when only the count is needed.',
17
+ 'When the user asks for all matching rows, pass all: true instead of choosing an arbitrary page size such as 30 or 50.',
18
+ ],
19
+ },
20
+ {
21
+ name: 'List current user conversations through RLS',
22
+ code: `query_table({
23
+ tableName: "chat_conversation",
24
+ fields: ["id", "kind", "title", "lastMessage.id", "lastMessage.text", "lastMessage.createdAt"],
25
+ all: true
26
+ })`,
27
+ notes: [
28
+ 'Use a conversation read pre-hook/RLS boundary so the route only returns conversations visible to @USER.',
29
+ 'lastMessage is a relation to chat_message; do not duplicate preview fields on chat_conversation.',
30
+ 'all: true tells MCP to send REST limit=0 and load all matching conversation rows.',
31
+ 'This is a small bounded user inbox example. For larger inventories, prefer pagination even when RLS scopes the records.',
32
+ 'Do not fetch messages for every conversation on initial list load; load messages after selecting a conversation.',
33
+ ],
34
+ },
35
+ {
36
+ name: 'Fetch one record by id',
37
+ code: `find_one_record({
38
+ tableName: "post",
39
+ id: "123",
40
+ fields: ["id", "title", "createdAt"]
41
+ })
42
+
43
+ // REST equivalent after inspecting metadata primary key:
44
+ GET /enfyra/post?filter={"<primaryKeyFromMetadata>":{"_eq":123}}&limit=1`,
45
+ notes: [
46
+ 'There is no dynamic GET /<table>/<id> route.',
47
+ 'Prefer MCP find_one_record because it resolves the primary key from live metadata.',
48
+ 'If writing raw REST, inspect metadata first and use the real primary key field; do not assume id on every backend.',
49
+ ],
50
+ },
51
+ {
52
+ name: 'Count without loading all rows',
53
+ code: `query_table({
54
+ tableName: "chat_message_read",
55
+ fields: ["id"],
56
+ limit: 1,
57
+ meta: "filterCount",
58
+ filter: {
59
+ member: { id: { _eq: "<currentUserId>" } },
60
+ isRead: { _eq: false }
61
+ }
62
+ })`,
63
+ notes: [
64
+ 'Use meta=totalCount with no filter and meta=filterCount with a filter.',
65
+ 'MCP count_records wraps this pattern for simple counts.',
66
+ 'Do not fetch all rows only to count them.',
67
+ ],
68
+ },
69
+ {
70
+ name: 'Relation fields without deep',
71
+ code: `query_table({
72
+ tableName: "order",
73
+ fields: [
74
+ "id",
75
+ "total",
76
+ "customer.id",
77
+ "customer.email",
78
+ "customer.displayName"
79
+ ],
80
+ limit: 20
81
+ })`,
82
+ notes: [
83
+ 'Use fields with dotted relation paths when you only need scalar fields from related records.',
84
+ 'This is enough for simple many-to-one or one-to-one relation display such as owner.email, customer.name, or lastMessage.text.',
85
+ 'Treat order/customer as placeholders; the transferable idea is "show parent rows with a few scalar relation fields".',
86
+ 'Do not add deep when fields alone can express the relation data you need.',
87
+ ],
88
+ },
89
+ {
90
+ name: 'Exclude large generated fields',
91
+ code: `query_table({
92
+ tableName: "enfyra_route_handler",
93
+ fields: ["-compiledCode"],
94
+ limit: 20
95
+ })
96
+
97
+ query_table({
98
+ tableName: "post",
99
+ fields: ["id", "-author.avatar"],
100
+ deep: {
101
+ comments: {
102
+ fields: "-compiledCode,-author.avatar",
103
+ limit: 10,
104
+ deep: {
105
+ author: { fields: "-avatar" }
106
+ }
107
+ }
108
+ }
109
+ })`,
110
+ notes: [
111
+ 'Use fields=-compiledCode when reading script-backed records; sourceCode is the editable contract and compiledCode is generated by the server.',
112
+ 'Any -field token switches that fields scope to exclude mode, so fields=id,-compiledCode returns all readable fields except compiledCode.',
113
+ 'Dotted exclusions and deep relation fields use the same exclude-mode rule.',
114
+ 'Excluded fields and relations must exist in metadata; typos should fail instead of silently returning large or sensitive fields.',
115
+ ],
116
+ },
117
+ {
118
+ name: 'Deep relation query options',
119
+ code: `query_table({
120
+ tableName: "order",
121
+ fields: ["id", "total"],
122
+ deep: {
123
+ items: {
124
+ fields: "id,quantity,product",
125
+ sort: "-createdAt",
126
+ limit: 20,
127
+ deep: {
128
+ product: { fields: "id,name,price" }
129
+ }
130
+ }
131
+ }
132
+ })`,
133
+ notes: [
134
+ 'Use deep when relation loading needs query options such as filter, sort, limit, page, or nested deep.',
135
+ 'Deep is mainly useful for controlled child collections or nested relation fetches, not for basic related-field display.',
136
+ 'Do not use deep just to filter by a relation id; use a normal relation filter instead.',
137
+ 'Do not use deep for counts; use count_records or meta=filterCount/totalCount.',
138
+ 'Do not deep-load large child collections without an explicit limit/page. For heavy screens, fetch the parent list first, then load the selected child collection separately with pagination.',
139
+ 'Use query_table deep for normal MCP reads; use test_rest_endpoint only when you need a custom raw URL or route behavior test.',
140
+ 'deep keys must be relation property names.',
141
+ 'Allowed deep options are fields, filter, sort, limit, page, and deep.',
142
+ 'Use fields, never _fields, inside deep relation options.',
143
+ 'Do not invent deep keys like members unless members is a relation on that table.',
144
+ ],
145
+ },
146
+ {
147
+ name: 'Sort parent rows by child relation aggregates',
148
+ code: `query_table({
149
+ tableName: "cloud_support_tickets",
150
+ fields: [
151
+ "id",
152
+ "subject",
153
+ "status",
154
+ "project.id",
155
+ "project.name"
156
+ ],
157
+ sort: "-_max(messages.createdAt),-createdAt",
158
+ limit: 25,
159
+ deep: JSON.stringify({
160
+ messages: {
161
+ fields: "id,authorKind,body,createdAt",
162
+ sort: "-createdAt",
163
+ limit: 3
164
+ }
165
+ })
166
+ })
167
+
168
+ // Other parent aggregate sorts:
169
+ // sort=-_count(messages)
170
+ // sort=_min(messages.createdAt)`,
171
+ notes: [
172
+ 'Use _max(relation.field) for latest-child ordering, _min(relation.field) for earliest-child ordering, and _count(relation) for child-count ordering.',
173
+ 'Aggregate sort helpers only work on direct one-to-many or many-to-many list relations.',
174
+ 'Support tickets and messages are illustrative. Apply this when a parent list must be ordered by child recency or child volume.',
175
+ 'The aggregate field must be a real published, non-encrypted scalar field on the related table for user-facing APIs.',
176
+ 'Do not use _max, _min, or _count on private relations or unpublished fields unless the endpoint intentionally exposes that fact.',
177
+ 'Do not use raw sort=-messages.createdAt for parent ordering; it is ambiguous and rejected.',
178
+ 'deep.messages.sort only orders the loaded message rows inside each ticket, so keep parent sort and child pagination as separate concerns.',
179
+ ],
180
+ },
181
+ {
182
+ name: 'Encrypted fields are not lookup fields',
183
+ code: `// Bad: api_token is isEncrypted=true, so filter/sort cannot use it.
184
+ GET /enfyra/integrations?filter={"api_token":{"_eq":"plaintext-token"}}
185
+
186
+ // Good: store a separate non-secret lookup hash if lookup is needed.
187
+ create_columns({
188
+ globalRulesAckKey: "<globalRulesAckKey from get_enfyra_required_knowledge>",
189
+ items: [
190
+ {
191
+ tableId: "<integrations_table_id>",
192
+ name: "api_token_lookup_sha256",
193
+ type: "varchar",
194
+ isNullable: false,
195
+ isPublished: false
196
+ }
197
+ ]
198
+ })
199
+
200
+ // In the create/update handler or pre-hook, hash plaintext before it is encrypted.
201
+ if (@BODY.api_token) {
202
+ @BODY.api_token_lookup_sha256 = await @HELPERS.$crypto.sha256(@BODY.api_token)
203
+ }
204
+
205
+ // Lookup by the hash, never by the encrypted field.
206
+ const lookup = await @HELPERS.$crypto.sha256(@BODY.api_token)
207
+ const found = await #integrations.find({
208
+ filter: { api_token_lookup_sha256: { _eq: lookup } },
209
+ limit: 1
210
+ })`,
211
+ notes: [
212
+ 'isEncrypted values are encrypted at rest and decrypted after select.',
213
+ 'Do not filter, sort, or deep-filter by encrypted fields.',
214
+ 'Use a separate deterministic non-secret hash/lookup column when the product needs secret-derived lookup.',
215
+ 'Do not ask clients to submit enc:v1: ciphertext.',
216
+ ],
217
+ },
218
+ ],
219
+ };
220
+ //# sourceMappingURL=mcp-example-queries-deep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-example-queries-deep.js","sourceRoot":"","sources":["../../src/lib/mcp-example-queries-deep.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG;IAC/B,KAAK,EAAE,+DAA+D;IACtE,OAAO,EAAE,+HAA+H;IACxI,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,8CAA8C;YACpD,IAAI,EAAE;;;;;GAKX;YACK,KAAK,EAAE;gBACL,wHAAwH;gBACxH,kGAAkG;gBAClG,kDAAkD;gBAClD,uHAAuH;aACxH;SACF;QACD;YACE,IAAI,EAAE,6CAA6C;YACnD,IAAI,EAAE;;;;GAIX;YACK,KAAK,EAAE;gBACL,yGAAyG;gBACzG,kGAAkG;gBAClG,mFAAmF;gBACnF,yHAAyH;gBACzH,kHAAkH;aACnH;SACF;QACD;YACE,IAAI,EAAE,wBAAwB;YAC9B,IAAI,EAAE;;;;;;;yEAO2D;YACjE,KAAK,EAAE;gBACL,8CAA8C;gBAC9C,oFAAoF;gBACpF,oHAAoH;aACrH;SACF;QACD;YACE,IAAI,EAAE,gCAAgC;YACtC,IAAI,EAAE;;;;;;;;;GASX;YACK,KAAK,EAAE;gBACL,wEAAwE;gBACxE,yDAAyD;gBACzD,2CAA2C;aAC5C;SACF;QACD;YACE,IAAI,EAAE,8BAA8B;YACpC,IAAI,EAAE;;;;;;;;;;GAUX;YACK,KAAK,EAAE;gBACL,8FAA8F;gBAC9F,+HAA+H;gBAC/H,sHAAsH;gBACtH,2EAA2E;aAC5E;SACF;QACD;YACE,IAAI,EAAE,gCAAgC;YACtC,IAAI,EAAE;;;;;;;;;;;;;;;;;;GAkBX;YACK,KAAK,EAAE;gBACL,+IAA+I;gBAC/I,0IAA0I;gBAC1I,4EAA4E;gBAC5E,kIAAkI;aACnI;SACF;QACD;YACE,IAAI,EAAE,6BAA6B;YACnC,IAAI,EAAE;;;;;;;;;;;;;GAaX;YACK,KAAK,EAAE;gBACL,uGAAuG;gBACvG,yHAAyH;gBACzH,wFAAwF;gBACxF,+EAA+E;gBAC/E,8LAA8L;gBAC9L,+HAA+H;gBAC/H,4CAA4C;gBAC5C,uEAAuE;gBACvE,0DAA0D;gBAC1D,kFAAkF;aACnF;SACF;QACD;YACE,IAAI,EAAE,+CAA+C;YACrD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;iCAsBmB;YACzB,KAAK,EAAE;gBACL,sJAAsJ;gBACtJ,wFAAwF;gBACxF,gIAAgI;gBAChI,qHAAqH;gBACrH,kIAAkI;gBAClI,4FAA4F;gBAC5F,2IAA2I;aAC5I;SACF;QACD;YACE,IAAI,EAAE,wCAAwC;YAC9C,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BX;YACK,KAAK,EAAE;gBACL,sEAAsE;gBACtE,0DAA0D;gBAC1D,0GAA0G;gBAC1G,kDAAkD;aACnD;SACF;KACF;CACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare const schemaRelationsExamples: {
2
+ title: string;
3
+ useWhen: string;
4
+ examples: {
5
+ name: string;
6
+ code: string;
7
+ notes: string[];
8
+ }[];
9
+ };
@@ -0,0 +1,148 @@
1
+ export const schemaRelationsExamples = {
2
+ title: 'Tables, columns, relations, cascade, and indexes',
3
+ useWhen: 'Use when creating or changing persisted data models.',
4
+ examples: [
5
+ {
6
+ name: 'Bulk schema creation with one-item-or-many arrays',
7
+ code: `// 0. First call get_schema_design_context and get_enfyra_required_knowledge.
8
+ // 1. create_tables is always native-array-shaped. One table = one item.
9
+ create_tables({
10
+ globalRulesAckKey: "<globalRulesAckKey>",
11
+ items: [
12
+ {
13
+ name: "app_lookup",
14
+ columns: [
15
+ { name: "name", type: "varchar", isNullable: false },
16
+ { name: "slug", type: "varchar", isNullable: false },
17
+ { name: "description", type: "text", isNullable: true }
18
+ ],
19
+ uniques: [["slug"]]
20
+ },
21
+ {
22
+ name: "app_primary_record",
23
+ columns: [
24
+ { name: "title", type: "varchar", isNullable: false },
25
+ { name: "summary", type: "text", isNullable: true },
26
+ { name: "amount", type: "float", isNullable: false, defaultValue: "0" },
27
+ { name: "status", type: "varchar", isNullable: false, defaultValue: "draft" },
28
+ { name: "metadata", type: "simple-json", isNullable: true }
29
+ ],
30
+ relations: [
31
+ { propertyName: "lookup", type: "many-to-one", targetTable: "app_lookup", isNullable: true, onDelete: "SET NULL" },
32
+ { propertyName: "owner", type: "many-to-one", targetTable: "enfyra_user", isNullable: false, onDelete: "CASCADE" }
33
+ ],
34
+ indexes: [["status", "createdAt"], ["lookup", "status"]]
35
+ },
36
+ {
37
+ name: "app_participation",
38
+ columns: [
39
+ { name: "status", type: "varchar", isNullable: false, defaultValue: "active" },
40
+ { name: "score", type: "float", isNullable: false, defaultValue: "0" }
41
+ ],
42
+ relations: [
43
+ { propertyName: "record", type: "many-to-one", targetTable: "app_primary_record", isNullable: false, onDelete: "CASCADE" },
44
+ { propertyName: "actor", type: "many-to-one", targetTable: "enfyra_user", isNullable: false, onDelete: "CASCADE" }
45
+ ],
46
+ uniques: [["record", "actor"]],
47
+ indexes: [["status", "createdAt"]]
48
+ }
49
+ ]
50
+ })
51
+
52
+ // 2. create_records is also native-array-shaped. One row = one item.
53
+ create_records({
54
+ tableName: "app_primary_record",
55
+ globalRulesAckKey: "<globalRulesAckKey>",
56
+ records: [
57
+ {
58
+ title: "<display title>",
59
+ amount: 29.99,
60
+ status: "active",
61
+ lookup: "<app_lookup_id>",
62
+ owner: "<enfyra_user_id>"
63
+ }
64
+ ]
65
+ })`,
66
+ notes: [
67
+ 'All mutation tools are plural envelopes. Pass native arrays, with one item in the array for a single mutation.',
68
+ 'create_tables creates tables/columns first, then creates requested relations after all batch tables exist, so target table ordering is handled by the tool.',
69
+ 'Do not declare id, _id, createdAt, or updatedAt columns; Enfyra manages them automatically.',
70
+ 'When a unique/index group uses relation propertyName values, declare those relations in the same table item or add the constraint later with update_tables after the relations exist.',
71
+ 'Use live column types from get_schema_design_context. Prefer float for decimal-like money/ratings unless live metadata explicitly supports decimal.',
72
+ 'Do not create lookupId, owner_id, actorId, or recordIds scalar fields for normalized relationships. Use relations and write relation propertyName values.',
73
+ 'A unique pair such as record+actor already creates the indexed unique lookup; keep those fields out of indexes.',
74
+ ],
75
+ },
76
+ {
77
+ name: 'Bulk add columns and relations after initial schema',
78
+ code: `create_columns({
79
+ globalRulesAckKey: "<globalRulesAckKey>",
80
+ items: [
81
+ {
82
+ tableId: "<enfyra_user_table_id>",
83
+ name: "emailVerifiedAt",
84
+ type: "datetime",
85
+ isNullable: true,
86
+ isPublished: true
87
+ },
88
+ {
89
+ tableId: "<integration_secret_table_id>",
90
+ name: "value",
91
+ type: "text",
92
+ isNullable: false,
93
+ isPublished: false,
94
+ isEncrypted: true
95
+ }
96
+ ]
97
+ })
98
+
99
+ create_relations({
100
+ globalRulesAckKey: "<globalRulesAckKey>",
101
+ items: [
102
+ {
103
+ sourceTableId: "chat_conversation",
104
+ targetTableId: "chat_message",
105
+ propertyName: "lastMessage",
106
+ type: "many-to-one",
107
+ isNullable: true,
108
+ onDelete: "SET NULL"
109
+ }
110
+ ]
111
+ })`,
112
+ notes: [
113
+ 'create_columns/create_relations run items sequentially through the schema queue.',
114
+ 'Use relation property names only. Never provide fkCol, sourceColumn, targetColumn, or junction column names.',
115
+ 'Use inversePropertyName only when a concrete parent detail/deep/count/sort use case needs the reverse traversal.',
116
+ 'Use isEncrypted=true for encryption at rest. Add isUpdatable=false separately only when the field should be immutable.',
117
+ ],
118
+ },
119
+ {
120
+ name: 'Bulk update and destructive preview',
121
+ code: `update_tables({
122
+ globalRulesAckKey: "<globalRulesAckKey>",
123
+ items: [
124
+ { tableId: "<table_id>", graphqlEnabled: true },
125
+ { tableId: "<settings_table_id>", isSingleRecord: true }
126
+ ]
127
+ })
128
+
129
+ // Destructive tools preview first.
130
+ delete_columns({
131
+ items: [{ tableId: "<table_id>", columnId: "<column_id>" }]
132
+ })
133
+
134
+ // Apply only after explicit user approval.
135
+ delete_columns({
136
+ globalRulesAckKey: "<globalRulesAckKey>",
137
+ confirm: true,
138
+ items: [{ tableId: "<table_id>", columnId: "<column_id>" }]
139
+ })`,
140
+ notes: [
141
+ 'update_tables/update_columns/update_records reject ambiguous duplicate ids where applicable and run sequentially.',
142
+ 'delete_tables/delete_columns/delete_relations/delete_records return previews unless confirm=true.',
143
+ 'Schema tools serialize internally; do not parallelize schema mutation tool calls.',
144
+ ],
145
+ },
146
+ ],
147
+ };
148
+ //# sourceMappingURL=mcp-example-schema-relations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-example-schema-relations.js","sourceRoot":"","sources":["../../src/lib/mcp-example-schema-relations.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACnC,KAAK,EAAE,kDAAkD;IACzD,OAAO,EAAE,sDAAsD;IAC/D,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,mDAAmD;YACzD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DX;YACK,KAAK,EAAE;gBACL,gHAAgH;gBAChH,6JAA6J;gBAC7J,6FAA6F;gBAC7F,uLAAuL;gBACvL,qJAAqJ;gBACrJ,2JAA2J;gBAC3J,iHAAiH;aAClH;SACF;QACD;YACE,IAAI,EAAE,qDAAqD;YAC3D,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCX;YACK,KAAK,EAAE;gBACL,kFAAkF;gBAClF,8GAA8G;gBAC9G,kHAAkH;gBAClH,wHAAwH;aACzH;SACF;QACD;YACE,IAAI,EAAE,qCAAqC;YAC3C,IAAI,EAAE;;;;;;;;;;;;;;;;;;GAkBX;YACK,KAAK,EAAE;gBACL,mHAAmH;gBACnH,mGAAmG;gBACnG,mFAAmF;aACpF;SACF;KACF;CACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare const websocketExamples: {
2
+ title: string;
3
+ useWhen: string;
4
+ examples: {
5
+ name: string;
6
+ code: string;
7
+ notes: string[];
8
+ }[];
9
+ };