mcp-creatio 0.5.0 → 0.6.0

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 (277) hide show
  1. package/README.md +14 -1
  2. package/dist/cli.js +3 -2
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config-builder.d.ts.map +1 -1
  5. package/dist/config-builder.js +13 -1
  6. package/dist/config-builder.js.map +1 -1
  7. package/dist/creatio/auth/auth.d.ts +16 -2
  8. package/dist/creatio/auth/auth.d.ts.map +1 -1
  9. package/dist/creatio/auth/auth.js +9 -0
  10. package/dist/creatio/auth/auth.js.map +1 -1
  11. package/dist/creatio/auth/index.d.ts +2 -1
  12. package/dist/creatio/auth/index.d.ts.map +1 -1
  13. package/dist/creatio/auth/index.js +4 -1
  14. package/dist/creatio/auth/index.js.map +1 -1
  15. package/dist/creatio/auth/providers/base-provider.d.ts +2 -5
  16. package/dist/creatio/auth/providers/base-provider.d.ts.map +1 -1
  17. package/dist/creatio/auth/providers/base-provider.js +0 -15
  18. package/dist/creatio/auth/providers/base-provider.js.map +1 -1
  19. package/dist/creatio/auth/providers/oauth2-code-provider.js +3 -3
  20. package/dist/creatio/client-config.d.ts +8 -0
  21. package/dist/creatio/client-config.d.ts.map +1 -1
  22. package/dist/creatio/{providers → contracts}/admin-operation-provider.d.ts.map +1 -1
  23. package/dist/creatio/contracts/admin-operation-provider.js.map +1 -0
  24. package/dist/creatio/{providers → contracts}/configuration-provider.d.ts.map +1 -1
  25. package/dist/creatio/contracts/configuration-provider.js.map +1 -0
  26. package/dist/creatio/contracts/crud-provider.d.ts +52 -0
  27. package/dist/creatio/contracts/crud-provider.d.ts.map +1 -0
  28. package/dist/creatio/contracts/crud-provider.js.map +1 -0
  29. package/dist/creatio/{providers → contracts}/feature-provider.d.ts.map +1 -1
  30. package/dist/creatio/contracts/feature-provider.js.map +1 -0
  31. package/dist/creatio/{providers → contracts}/index.d.ts +1 -0
  32. package/dist/creatio/contracts/index.d.ts.map +1 -0
  33. package/dist/creatio/{providers → contracts}/index.js +1 -0
  34. package/dist/creatio/{providers → contracts}/index.js.map +1 -1
  35. package/dist/creatio/{providers → contracts}/process-provider.d.ts.map +1 -1
  36. package/dist/creatio/contracts/process-provider.js.map +1 -0
  37. package/dist/creatio/contracts/query.d.ts +69 -0
  38. package/dist/creatio/contracts/query.d.ts.map +1 -0
  39. package/dist/creatio/contracts/query.js +10 -0
  40. package/dist/creatio/contracts/query.js.map +1 -0
  41. package/dist/creatio/{providers → contracts}/sys-settings-provider.d.ts.map +1 -1
  42. package/dist/creatio/contracts/sys-settings-provider.js.map +1 -0
  43. package/dist/creatio/{providers → contracts}/user-provider.d.ts.map +1 -1
  44. package/dist/creatio/contracts/user-provider.js.map +1 -0
  45. package/dist/creatio/engines/{admin-operation/admin-operation-engine.d.ts → admin-operation-engine.d.ts} +4 -4
  46. package/dist/creatio/engines/admin-operation-engine.d.ts.map +1 -0
  47. package/dist/creatio/engines/admin-operation-engine.js +29 -0
  48. package/dist/creatio/engines/admin-operation-engine.js.map +1 -0
  49. package/dist/creatio/engines/configuration-engine.d.ts +10 -0
  50. package/dist/creatio/engines/configuration-engine.d.ts.map +1 -0
  51. package/dist/creatio/engines/configuration-engine.js +23 -0
  52. package/dist/creatio/engines/configuration-engine.js.map +1 -0
  53. package/dist/creatio/engines/crud-engine.d.ts +17 -0
  54. package/dist/creatio/engines/crud-engine.d.ts.map +1 -0
  55. package/dist/creatio/engines/crud-engine.js +39 -0
  56. package/dist/creatio/engines/crud-engine.js.map +1 -0
  57. package/dist/creatio/engines/engine-manager.d.ts +15 -8
  58. package/dist/creatio/engines/engine-manager.d.ts.map +1 -1
  59. package/dist/creatio/engines/engine-manager.js +26 -14
  60. package/dist/creatio/engines/engine-manager.js.map +1 -1
  61. package/dist/creatio/engines/engine.d.ts +36 -0
  62. package/dist/creatio/engines/engine.d.ts.map +1 -1
  63. package/dist/creatio/engines/engine.js +43 -0
  64. package/dist/creatio/engines/engine.js.map +1 -1
  65. package/dist/creatio/engines/feature-engine.d.ts +10 -0
  66. package/dist/creatio/engines/feature-engine.d.ts.map +1 -0
  67. package/dist/creatio/engines/{feature/feature-engine.js → feature-engine.js} +5 -3
  68. package/dist/creatio/engines/feature-engine.js.map +1 -0
  69. package/dist/creatio/engines/index.d.ts +7 -7
  70. package/dist/creatio/engines/index.d.ts.map +1 -1
  71. package/dist/creatio/engines/index.js +7 -7
  72. package/dist/creatio/engines/index.js.map +1 -1
  73. package/dist/creatio/engines/process-engine.d.ts +10 -0
  74. package/dist/creatio/engines/process-engine.d.ts.map +1 -0
  75. package/dist/creatio/engines/{process/process-engine.js → process-engine.js} +5 -3
  76. package/dist/creatio/engines/process-engine.js.map +1 -0
  77. package/dist/creatio/engines/{sys-settings/sys-settings-engine.d.ts → sys-settings-engine.d.ts} +4 -4
  78. package/dist/creatio/engines/sys-settings-engine.d.ts.map +1 -0
  79. package/dist/creatio/engines/sys-settings-engine.js +29 -0
  80. package/dist/creatio/engines/sys-settings-engine.js.map +1 -0
  81. package/dist/creatio/engines/user-engine.d.ts +10 -0
  82. package/dist/creatio/engines/user-engine.d.ts.map +1 -0
  83. package/dist/creatio/engines/{user/user-engine.js → user-engine.js} +4 -2
  84. package/dist/creatio/engines/user-engine.js.map +1 -0
  85. package/dist/creatio/index.d.ts +1 -1
  86. package/dist/creatio/index.js +1 -1
  87. package/dist/creatio/provider-context.d.ts +1 -1
  88. package/dist/creatio/services/admin-operation-service-provider.d.ts +1 -1
  89. package/dist/creatio/services/admin-operation-service-provider.d.ts.map +1 -1
  90. package/dist/creatio/services/admin-operation-service-provider.js +2 -2
  91. package/dist/creatio/services/admin-operation-service-provider.js.map +1 -1
  92. package/dist/creatio/services/configuration-service-provider.d.ts +1 -1
  93. package/dist/creatio/services/configuration-service-provider.d.ts.map +1 -1
  94. package/dist/creatio/services/configuration-service-provider.js +5 -2
  95. package/dist/creatio/services/configuration-service-provider.js.map +1 -1
  96. package/dist/creatio/services/creatio-service-context.d.ts +1 -1
  97. package/dist/creatio/services/creatio-service-context.d.ts.map +1 -1
  98. package/dist/creatio/services/creatio-service-context.js +6 -3
  99. package/dist/creatio/services/creatio-service-context.js.map +1 -1
  100. package/dist/creatio/services/crud-provider-factory.d.ts +16 -0
  101. package/dist/creatio/services/crud-provider-factory.d.ts.map +1 -0
  102. package/dist/creatio/services/crud-provider-factory.js +22 -0
  103. package/dist/creatio/services/crud-provider-factory.js.map +1 -0
  104. package/dist/creatio/services/dataservice/data-service-column-values.d.ts +12 -0
  105. package/dist/creatio/services/dataservice/data-service-column-values.d.ts.map +1 -0
  106. package/dist/creatio/services/dataservice/data-service-column-values.js +39 -0
  107. package/dist/creatio/services/dataservice/data-service-column-values.js.map +1 -0
  108. package/dist/creatio/services/dataservice/data-service-crud-provider.d.ts +49 -0
  109. package/dist/creatio/services/dataservice/data-service-crud-provider.d.ts.map +1 -0
  110. package/dist/creatio/services/dataservice/data-service-crud-provider.js +157 -0
  111. package/dist/creatio/services/dataservice/data-service-crud-provider.js.map +1 -0
  112. package/dist/creatio/services/dataservice/data-service-filter-translator.d.ts +32 -0
  113. package/dist/creatio/services/dataservice/data-service-filter-translator.d.ts.map +1 -0
  114. package/dist/creatio/services/dataservice/data-service-filter-translator.js +114 -0
  115. package/dist/creatio/services/dataservice/data-service-filter-translator.js.map +1 -0
  116. package/dist/creatio/services/dataservice/data-service-query-builder.d.ts +21 -0
  117. package/dist/creatio/services/dataservice/data-service-query-builder.d.ts.map +1 -0
  118. package/dist/creatio/services/dataservice/data-service-query-builder.js +97 -0
  119. package/dist/creatio/services/dataservice/data-service-query-builder.js.map +1 -0
  120. package/dist/creatio/services/dataservice/data-service-schema.d.ts +31 -0
  121. package/dist/creatio/services/dataservice/data-service-schema.d.ts.map +1 -0
  122. package/dist/creatio/services/dataservice/data-service-schema.js +95 -0
  123. package/dist/creatio/services/dataservice/data-service-schema.js.map +1 -0
  124. package/dist/creatio/services/dataservice/data-service-transport.d.ts +21 -0
  125. package/dist/creatio/services/dataservice/data-service-transport.d.ts.map +1 -0
  126. package/dist/creatio/services/dataservice/data-service-transport.js +49 -0
  127. package/dist/creatio/services/dataservice/data-service-transport.js.map +1 -0
  128. package/dist/creatio/services/dataservice/data-service-types.d.ts +180 -0
  129. package/dist/creatio/services/dataservice/data-service-types.d.ts.map +1 -0
  130. package/dist/creatio/services/dataservice/data-service-types.js +110 -0
  131. package/dist/creatio/services/dataservice/data-service-types.js.map +1 -0
  132. package/dist/creatio/services/dataservice/data-service-value-type.d.ts +27 -0
  133. package/dist/creatio/services/dataservice/data-service-value-type.d.ts.map +1 -0
  134. package/dist/creatio/services/dataservice/data-service-value-type.js +99 -0
  135. package/dist/creatio/services/dataservice/data-service-value-type.js.map +1 -0
  136. package/dist/creatio/services/entity-name.d.ts +8 -0
  137. package/dist/creatio/services/entity-name.d.ts.map +1 -0
  138. package/dist/creatio/services/entity-name.js +17 -0
  139. package/dist/creatio/services/entity-name.js.map +1 -0
  140. package/dist/creatio/services/feature-service-provider.d.ts +1 -1
  141. package/dist/creatio/services/feature-service-provider.d.ts.map +1 -1
  142. package/dist/creatio/services/feature-service-provider.js +5 -5
  143. package/dist/creatio/services/feature-service-provider.js.map +1 -1
  144. package/dist/creatio/services/http-client.d.ts +10 -1
  145. package/dist/creatio/services/http-client.d.ts.map +1 -1
  146. package/dist/creatio/services/http-client.js +15 -3
  147. package/dist/creatio/services/http-client.js.map +1 -1
  148. package/dist/creatio/services/index.d.ts +14 -2
  149. package/dist/creatio/services/index.d.ts.map +1 -1
  150. package/dist/creatio/services/index.js +14 -2
  151. package/dist/creatio/services/index.js.map +1 -1
  152. package/dist/creatio/services/lookup-path.d.ts +18 -0
  153. package/dist/creatio/services/lookup-path.d.ts.map +1 -0
  154. package/dist/creatio/services/lookup-path.js +33 -0
  155. package/dist/creatio/services/lookup-path.js.map +1 -0
  156. package/dist/creatio/services/{metadata-store.d.ts → odata/metadata-store.d.ts} +2 -2
  157. package/dist/creatio/services/odata/metadata-store.d.ts.map +1 -0
  158. package/dist/creatio/services/{metadata-store.js → odata/metadata-store.js} +5 -4
  159. package/dist/creatio/services/odata/metadata-store.js.map +1 -0
  160. package/dist/creatio/services/{odata-crud-provider.d.ts → odata/odata-crud-provider.d.ts} +7 -7
  161. package/dist/creatio/services/odata/odata-crud-provider.d.ts.map +1 -0
  162. package/dist/creatio/services/{odata-crud-provider.js → odata/odata-crud-provider.js} +29 -67
  163. package/dist/creatio/services/odata/odata-crud-provider.js.map +1 -0
  164. package/dist/creatio/services/odata/odata-query-translator.d.ts +37 -0
  165. package/dist/creatio/services/odata/odata-query-translator.d.ts.map +1 -0
  166. package/dist/creatio/services/odata/odata-query-translator.js +160 -0
  167. package/dist/creatio/services/odata/odata-query-translator.js.map +1 -0
  168. package/dist/creatio/services/odata/odata-routes.d.ts +4 -0
  169. package/dist/creatio/services/odata/odata-routes.d.ts.map +1 -0
  170. package/dist/creatio/services/odata/odata-routes.js +9 -0
  171. package/dist/creatio/services/odata/odata-routes.js.map +1 -0
  172. package/dist/creatio/services/process-service-provider.d.ts +1 -1
  173. package/dist/creatio/services/process-service-provider.d.ts.map +1 -1
  174. package/dist/creatio/services/process-service-provider.js +2 -5
  175. package/dist/creatio/services/process-service-provider.js.map +1 -1
  176. package/dist/creatio/services/sys-settings-service-provider.d.ts +1 -1
  177. package/dist/creatio/services/sys-settings-service-provider.d.ts.map +1 -1
  178. package/dist/creatio/services/sys-settings-service-provider.js +12 -16
  179. package/dist/creatio/services/sys-settings-service-provider.js.map +1 -1
  180. package/dist/creatio/services/user-info-provider.d.ts +1 -1
  181. package/dist/index.js +3 -2
  182. package/dist/index.js.map +1 -1
  183. package/dist/log.d.ts +5 -0
  184. package/dist/log.d.ts.map +1 -1
  185. package/dist/log.js +8 -0
  186. package/dist/log.js.map +1 -1
  187. package/dist/server/http/creatio-oauth-handlers.d.ts.map +1 -1
  188. package/dist/server/http/creatio-oauth-handlers.js +21 -5
  189. package/dist/server/http/creatio-oauth-handlers.js.map +1 -1
  190. package/dist/server/http/httpServer.d.ts.map +1 -1
  191. package/dist/server/http/httpServer.js +6 -4
  192. package/dist/server/http/httpServer.js.map +1 -1
  193. package/dist/server/http/mcp-handlers.js +2 -2
  194. package/dist/server/mcp/crtmcp/crt-mcp-client.d.ts +2 -5
  195. package/dist/server/mcp/crtmcp/crt-mcp-client.d.ts.map +1 -1
  196. package/dist/server/mcp/crtmcp/crt-mcp-client.js +4 -4
  197. package/dist/server/mcp/crtmcp/crt-mcp-client.js.map +1 -1
  198. package/dist/server/mcp/filters.d.ts +7 -1
  199. package/dist/server/mcp/filters.d.ts.map +1 -1
  200. package/dist/server/mcp/filters.js +48 -90
  201. package/dist/server/mcp/filters.js.map +1 -1
  202. package/dist/server/mcp/server.d.ts +16 -1
  203. package/dist/server/mcp/server.d.ts.map +1 -1
  204. package/dist/server/mcp/server.js +179 -167
  205. package/dist/server/mcp/server.js.map +1 -1
  206. package/dist/server/mcp/tools-data.d.ts +57 -4
  207. package/dist/server/mcp/tools-data.d.ts.map +1 -1
  208. package/dist/server/mcp/tools-data.js +42 -17
  209. package/dist/server/mcp/tools-data.js.map +1 -1
  210. package/dist/sessions/index.d.ts.map +1 -0
  211. package/dist/sessions/index.js.map +1 -0
  212. package/dist/{services → sessions}/session-context.d.ts +16 -0
  213. package/dist/sessions/session-context.d.ts.map +1 -0
  214. package/dist/{services → sessions}/session-context.js +36 -1
  215. package/dist/sessions/session-context.js.map +1 -0
  216. package/dist/{services → sessions}/token-refresh-scheduler.d.ts.map +1 -1
  217. package/dist/{services → sessions}/token-refresh-scheduler.js +2 -2
  218. package/dist/{services → sessions}/token-refresh-scheduler.js.map +1 -1
  219. package/dist/utils/context.js +2 -2
  220. package/package.json +1 -1
  221. package/dist/creatio/engines/admin-operation/admin-operation-engine.d.ts.map +0 -1
  222. package/dist/creatio/engines/admin-operation/admin-operation-engine.js +0 -27
  223. package/dist/creatio/engines/admin-operation/admin-operation-engine.js.map +0 -1
  224. package/dist/creatio/engines/configuration/configuration-engine.d.ts +0 -10
  225. package/dist/creatio/engines/configuration/configuration-engine.d.ts.map +0 -1
  226. package/dist/creatio/engines/configuration/configuration-engine.js +0 -18
  227. package/dist/creatio/engines/configuration/configuration-engine.js.map +0 -1
  228. package/dist/creatio/engines/crud/crud-engine.d.ts +0 -15
  229. package/dist/creatio/engines/crud/crud-engine.d.ts.map +0 -1
  230. package/dist/creatio/engines/crud/crud-engine.js +0 -33
  231. package/dist/creatio/engines/crud/crud-engine.js.map +0 -1
  232. package/dist/creatio/engines/feature/feature-engine.d.ts +0 -10
  233. package/dist/creatio/engines/feature/feature-engine.d.ts.map +0 -1
  234. package/dist/creatio/engines/feature/feature-engine.js.map +0 -1
  235. package/dist/creatio/engines/process/process-engine.d.ts +0 -10
  236. package/dist/creatio/engines/process/process-engine.d.ts.map +0 -1
  237. package/dist/creatio/engines/process/process-engine.js.map +0 -1
  238. package/dist/creatio/engines/sys-settings/sys-settings-engine.d.ts.map +0 -1
  239. package/dist/creatio/engines/sys-settings/sys-settings-engine.js +0 -27
  240. package/dist/creatio/engines/sys-settings/sys-settings-engine.js.map +0 -1
  241. package/dist/creatio/engines/user/user-engine.d.ts +0 -10
  242. package/dist/creatio/engines/user/user-engine.d.ts.map +0 -1
  243. package/dist/creatio/engines/user/user-engine.js.map +0 -1
  244. package/dist/creatio/providers/admin-operation-provider.js.map +0 -1
  245. package/dist/creatio/providers/configuration-provider.js.map +0 -1
  246. package/dist/creatio/providers/crud-provider.d.ts +0 -42
  247. package/dist/creatio/providers/crud-provider.d.ts.map +0 -1
  248. package/dist/creatio/providers/crud-provider.js.map +0 -1
  249. package/dist/creatio/providers/feature-provider.js.map +0 -1
  250. package/dist/creatio/providers/index.d.ts.map +0 -1
  251. package/dist/creatio/providers/process-provider.js.map +0 -1
  252. package/dist/creatio/providers/sys-settings-provider.js.map +0 -1
  253. package/dist/creatio/providers/user-provider.js.map +0 -1
  254. package/dist/creatio/services/metadata-store.d.ts.map +0 -1
  255. package/dist/creatio/services/metadata-store.js.map +0 -1
  256. package/dist/creatio/services/odata-crud-provider.d.ts.map +0 -1
  257. package/dist/creatio/services/odata-crud-provider.js.map +0 -1
  258. package/dist/services/index.d.ts.map +0 -1
  259. package/dist/services/index.js.map +0 -1
  260. package/dist/services/session-context.d.ts.map +0 -1
  261. package/dist/services/session-context.js.map +0 -1
  262. /package/dist/creatio/{providers → contracts}/admin-operation-provider.d.ts +0 -0
  263. /package/dist/creatio/{providers → contracts}/admin-operation-provider.js +0 -0
  264. /package/dist/creatio/{providers → contracts}/configuration-provider.d.ts +0 -0
  265. /package/dist/creatio/{providers → contracts}/configuration-provider.js +0 -0
  266. /package/dist/creatio/{providers → contracts}/crud-provider.js +0 -0
  267. /package/dist/creatio/{providers → contracts}/feature-provider.d.ts +0 -0
  268. /package/dist/creatio/{providers → contracts}/feature-provider.js +0 -0
  269. /package/dist/creatio/{providers → contracts}/process-provider.d.ts +0 -0
  270. /package/dist/creatio/{providers → contracts}/process-provider.js +0 -0
  271. /package/dist/creatio/{providers → contracts}/sys-settings-provider.d.ts +0 -0
  272. /package/dist/creatio/{providers → contracts}/sys-settings-provider.js +0 -0
  273. /package/dist/creatio/{providers → contracts}/user-provider.d.ts +0 -0
  274. /package/dist/creatio/{providers → contracts}/user-provider.js +0 -0
  275. /package/dist/{services → sessions}/index.d.ts +0 -0
  276. /package/dist/{services → sessions}/index.js +0 -0
  277. /package/dist/{services → sessions}/token-refresh-scheduler.d.ts +0 -0
@@ -1,110 +1,68 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildFilterFromStructured = buildFilterFromStructured;
4
- function isGuid(s) {
5
- return (typeof s === 'string' &&
6
- /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.test(s));
7
- }
8
- function isIdish(field) {
9
- return /(^|\/)Id$/.test(field) || /Id$/i.test(field);
10
- }
11
- function escapeStr(val) {
12
- return val.replace(/'/g, "''");
13
- }
14
- function literalFor(field, value) {
15
- if (value == null) {
16
- return 'null';
17
- }
18
- const t = typeof value;
19
- if (t === 'number') {
20
- return String(value);
21
- }
22
- if (t === 'boolean') {
23
- return value ? 'true' : 'false';
24
- }
25
- if (t === 'string') {
26
- const v = String(value);
27
- // Bare (unquoted) GUID for any Id-typed path — the scalar key `Id`, a lookup
28
- // FK `XxxId`, or a navigation `Xxx/Id`. Other strings (incl. `Xxx/Name`) are quoted.
29
- if (isGuid(v) && isIdish(field)) {
30
- return v;
31
- }
32
- return `'${escapeStr(v)}'`;
33
- }
34
- return `'${escapeStr(JSON.stringify(value))}'`;
35
- }
36
- // Creatio OData cannot filter a lookup by its scalar FK column (`ContactId eq <guid>`
37
- // 500s "Column by path ContactId not found"); it must be filtered through the
38
- // navigation property (`Contact/Id eq <guid>`), per the official docs and verified
39
- // live. Rewrite `<Lookup>Id` -> `<Lookup>/Id` for equality against a GUID. The
40
- // primary key `Id` and already-navigated paths are left untouched.
41
- function lookupNavField(field, value) {
42
- if (isGuid(value) && field !== 'Id' && !field.includes('/') && /Id$/.test(field)) {
43
- return `${field.slice(0, -2)}/Id`;
44
- }
45
- return field;
46
- }
47
- function buildCondition(c) {
3
+ exports.buildFilterNode = buildFilterNode;
4
+ exports.parseOrderBy = parseOrderBy;
5
+ function toNode(c) {
48
6
  if (!c || !c.field) {
49
7
  return undefined;
50
8
  }
51
9
  const field = String(c.field);
52
10
  if (Array.isArray(c.in)) {
53
- const values = c.in;
54
- if (!values.length) {
55
- return undefined;
56
- }
57
- const parts = values.map((v) => {
58
- const f = lookupNavField(field, v);
59
- return `${f} eq ${literalFor(f, v)}`;
60
- });
61
- return parts.length === 1 ? parts[0] : `(${parts.join(' or ')})`;
11
+ return c.in.length ? { kind: 'in', field, values: c.in } : undefined;
62
12
  }
63
- const op = String(c.op || 'eq');
64
- const value = c.value;
65
- if (op === 'contains' || op === 'startswith' || op === 'endswith') {
66
- return `${op}(${field},${literalFor(field, value)})`;
13
+ const op = (c.op ? String(c.op) : 'eq');
14
+ // A null/absent value against eq/ne is a null-check; route it through the dedicated
15
+ // neutral ops so each backend renders it correctly (OData `field eq null`,
16
+ // DataService `IsNullFilter`).
17
+ if (c.value === null || c.value === undefined) {
18
+ if (op === 'eq') {
19
+ return { kind: 'condition', field, op: 'isNull' };
20
+ }
21
+ if (op === 'ne') {
22
+ return { kind: 'condition', field, op: 'isNotNull' };
23
+ }
67
24
  }
68
- if (value == null && (op === 'eq' || op === 'ne')) {
69
- return `${field} ${op} null`;
25
+ return { kind: 'condition', field, op, value: c.value };
26
+ }
27
+ function group(logic, conditions) {
28
+ const items = conditions.map(toNode).filter((n) => Boolean(n));
29
+ if (!items.length) {
30
+ return undefined;
70
31
  }
71
- const f = op === 'eq' || op === 'ne' ? lookupNavField(field, value) : field;
72
- return `${f} ${op} ${literalFor(f, value)}`;
32
+ return { kind: 'group', logic, items };
73
33
  }
74
- function buildFilterFromStructured(filters) {
34
+ /** Build the neutral {@link FilterNode} from the structured `filters` argument (AND of the
35
+ * `all` group with the `any` group), or undefined when there is nothing to filter on. */
36
+ function buildFilterNode(filters) {
75
37
  if (!filters || typeof filters !== 'object') {
76
38
  return undefined;
77
39
  }
78
- const andParts = [];
79
- const orParts = [];
80
- if (Array.isArray(filters.all)) {
81
- for (const c of filters.all) {
82
- const s = buildCondition(c);
83
- if (s) {
84
- andParts.push(s);
85
- }
86
- }
87
- }
88
- if (Array.isArray(filters.any)) {
89
- for (const c of filters.any) {
90
- const s = buildCondition(c);
91
- if (s) {
92
- orParts.push(s);
93
- }
94
- }
95
- }
96
- const andStr = andParts.join(' and ');
97
- const orStr = orParts.join(' or ');
98
- const parts = [];
99
- if (andStr) {
100
- parts.push(andParts.length > 1 ? `(${andStr})` : andStr);
40
+ const f = filters;
41
+ const allNode = Array.isArray(f.all) ? group('and', f.all) : undefined;
42
+ const anyNode = Array.isArray(f.any) ? group('or', f.any) : undefined;
43
+ const parts = [allNode, anyNode].filter((n) => Boolean(n));
44
+ if (!parts.length) {
45
+ return undefined;
101
46
  }
102
- if (orStr) {
103
- parts.push(orParts.length > 1 ? `(${orStr})` : orStr);
47
+ if (parts.length === 1) {
48
+ return parts[0];
104
49
  }
105
- if (!parts.length) {
50
+ return { kind: 'group', logic: 'and', items: parts };
51
+ }
52
+ /** Parse an OData-style `$orderby` clause ("Name asc, CreatedOn desc") into neutral order
53
+ * terms. Direction defaults to ascending when omitted. */
54
+ function parseOrderBy(orderBy) {
55
+ if (typeof orderBy !== 'string' || !orderBy.trim()) {
106
56
  return undefined;
107
57
  }
108
- return parts.join(' and ');
58
+ const terms = orderBy
59
+ .split(',')
60
+ .map((part) => part.trim())
61
+ .filter(Boolean)
62
+ .map((part) => {
63
+ const [field, dir] = part.split(/\s+/);
64
+ return { field: field, dir: (dir ?? '').toLowerCase() === 'desc' ? 'desc' : 'asc' };
65
+ });
66
+ return terms.length ? terms : undefined;
109
67
  }
110
68
  //# sourceMappingURL=filters.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"filters.js","sourceRoot":"","sources":["../../../src/server/mcp/filters.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"filters.js","sourceRoot":"","sources":["../../../src/server/mcp/filters.ts"],"names":[],"mappings":"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"}
@@ -24,7 +24,6 @@ export declare class Server {
24
24
  private _normalizeToToolHandler;
25
25
  private _registerAsTool;
26
26
  private _registerPrompts;
27
- private _textResult;
28
27
  /** Adapter exposing handler registration to {@link ToolPreparer}s. */
29
28
  private _toolRegistrar;
30
29
  /**
@@ -36,6 +35,22 @@ export declare class Server {
36
35
  private _prepareTools;
37
36
  /** Whether DataForge was probed as enabled at startup. */
38
37
  private _isDataForgeReady;
38
+ /** Compile the `read` tool args into a neutral {@link ReadQuery}: structured `filters`
39
+ * become a {@link FilterNode}; a raw `$filter` string and `expand` are carried as
40
+ * OData-only escape hatches. The normalized {@link ReadResult} is mapped back to the
41
+ * tool's established output shape (a bare array, or `{ total, value }` when counting). */
42
+ private _read;
43
+ /** When DataForge is enabled, prefer its richer column details and fall back to the active
44
+ * CRUD backend's schema on a per-call miss. The `source` discriminator is part of the
45
+ * public tool contract and reflects where the schema actually came from. */
46
+ private _describeEntity;
47
+ /**
48
+ * The client tool surface as data. Handlers return raw domain results; MCP content
49
+ * wrapping is applied once by {@link _normalizeToToolHandler}. Adding a tool is a new
50
+ * row here (plus its descriptor) — no new bespoke wrapping. Mutating tools are listed
51
+ * separately and only registered when not in readonly mode.
52
+ */
53
+ private _clientToolDefs;
39
54
  private _registerClientTools;
40
55
  startMcp(): Promise<McpServer>;
41
56
  stopMcp(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EACN,oBAAoB,EACpB,oBAAoB,EAEpB,MAAM,eAAe,CAAC;AA0DvB,MAAM,WAAW,YAAY;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,qBAAa,MAAM;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAChD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0B;IACvD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;IAC5D,OAAO,CAAC,IAAI,CAAC,CAAY;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,cAAc,CAAW;IAIjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAwB;IAC3D,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA2B;IACjE,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA+B;IACvE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA8B;IAE5D,IAAW,YAAY,IAAI,oBAAoB,CAE9C;gBAEW,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,YAAY;IAoB/D,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,8BAA8B;IAQtC,OAAO,CAAC,uBAAuB;IAiB/B,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,gBAAgB;IAsBxB,OAAO,CAAC,WAAW;IAWnB,sEAAsE;IACtE,OAAO,CAAC,cAAc;IAOtB;;;;;OAKG;YACW,aAAa;IAc3B,0DAA0D;IAC1D,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,oBAAoB;IAsQf,QAAQ;IAqBR,OAAO;CAWpB"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EACN,oBAAoB,EACpB,oBAAoB,EAGpB,MAAM,eAAe,CAAC;AA0DvB,MAAM,WAAW,YAAY;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;CACvB;AAWD,qBAAa,MAAM;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAChD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0B;IACvD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;IAC5D,OAAO,CAAC,IAAI,CAAC,CAAY;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,cAAc,CAAW;IAIjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAwB;IAC3D,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA2B;IACjE,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA+B;IACvE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA8B;IAE5D,IAAW,YAAY,IAAI,oBAAoB,CAE9C;gBAEW,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,YAAY;IAoB/D,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,8BAA8B;IAQtC,OAAO,CAAC,uBAAuB;IAyB/B,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,gBAAgB;IAsBxB,sEAAsE;IACtE,OAAO,CAAC,cAAc;IAOtB;;;;;OAKG;YACW,aAAa;IAc3B,0DAA0D;IAC1D,OAAO,CAAC,iBAAiB;IAIzB;;;+FAG2F;YAC7E,KAAK;IAyBnB;;iFAE6E;YAC/D,eAAe;IAY7B;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IA8IvB,OAAO,CAAC,oBAAoB;IAYf,QAAQ;IAqBR,OAAO;CAWpB"}
@@ -71,7 +71,13 @@ class Server {
71
71
  _normalizeToToolHandler(handler) {
72
72
  return async (args) => {
73
73
  const result = await handler(args);
74
- if (result && typeof result === 'object' && 'content' in result) {
74
+ // Pass through only a genuine MCP envelope (`content` is an array of blocks) — e.g.
75
+ // the published-tools proxy returns an upstream tools/call result already shaped.
76
+ // Raw domain data (incl. server payloads that happen to have a scalar/object
77
+ // `content` field) is stringified, never mistaken for a pre-wrapped result.
78
+ if (result &&
79
+ typeof result === 'object' &&
80
+ Array.isArray(result.content)) {
75
81
  return result;
76
82
  }
77
83
  return {
@@ -122,16 +128,6 @@ class Server {
122
128
  log_1.default.warn('mcp.prompts.register.failed', { error: String(err) });
123
129
  }
124
130
  }
125
- _textResult(payload) {
126
- return {
127
- content: [
128
- {
129
- type: 'text',
130
- text: typeof payload === 'string' ? payload : JSON.stringify(payload, null, 2),
131
- },
132
- ],
133
- };
134
- }
135
131
  /** Adapter exposing handler registration to {@link ToolPreparer}s. */
136
132
  _toolRegistrar() {
137
133
  return {
@@ -162,177 +158,193 @@ class Server {
162
158
  _isDataForgeReady() {
163
159
  return this._capabilities.get(this._dataForgePreparer.name) === true;
164
160
  }
165
- _registerClientTools() {
166
- const crud = this._engines.crud;
167
- const user = this._engines.user;
168
- const sysSettings = this._engines.sysSettings;
169
- this._registerHandlerWithDescriptor('get-current-user-info', tools_data_1.getCurrentUserInfoDescriptor, (0, utils_1.withValidation)(tools_data_1.getCurrentUserInfoInput, () => user.getCurrentUserInfo()));
170
- this._registerHandlerWithDescriptor('list-entities', tools_data_1.listEntitiesDescriptor, (0, utils_1.withValidation)(tools_data_1.listEntitiesInput, async () => {
171
- const sets = await crud.listEntitySets();
172
- return {
173
- content: [
174
- {
175
- type: 'text',
176
- text: JSON.stringify({ results: sets }),
177
- },
178
- ],
179
- };
180
- }));
181
- this._registerHandlerWithDescriptor('describe-entity', tools_data_1.describeEntityDescriptor, (0, utils_1.withValidation)(tools_data_1.describeEntityInput, async ({ entitySet }) => {
182
- // When DataForge is enabled, prefer its richer column details and
183
- // fall back to exact OData $metadata on a per-call miss; when it is
184
- // not enabled, go straight to OData without any remote attempt.
185
- if (this._isDataForgeReady()) {
186
- const dataForge = await this._dataForge.getColumnsOrNull(entitySet);
187
- if (dataForge !== null) {
188
- return this._textResult({ source: 'dataforge', entitySet, dataForge });
189
- }
190
- }
191
- const schema = await crud.describeEntity(entitySet);
192
- return this._textResult({ source: 'odata', entitySet, metadata: schema });
193
- }));
194
- this._registerHandlerWithDescriptor('read', tools_data_1.readDescriptor, (0, utils_1.withValidation)(tools_data_1.readInput, async ({ entity, filter, filters, select, top, expand, orderBy, skip, count }) => {
195
- const structured = (0, filters_1.buildFilterFromStructured)(filters);
196
- let finalFilter = filter || structured;
197
- if (filter && structured) {
198
- finalFilter = `(${filter}) and (${structured})`;
161
+ /** Compile the `read` tool args into a neutral {@link ReadQuery}: structured `filters`
162
+ * become a {@link FilterNode}; a raw `$filter` string and `expand` are carried as
163
+ * OData-only escape hatches. The normalized {@link ReadResult} is mapped back to the
164
+ * tool's established output shape (a bare array, or `{ total, value }` when counting). */
165
+ async _read(args) {
166
+ const { entity, filter, filters, select, top, expand, orderBy, skip, count } = args;
167
+ const odata = {};
168
+ if (filter) {
169
+ odata.rawFilter = filter;
170
+ }
171
+ if (Array.isArray(expand) && expand.length > 0) {
172
+ odata.expand = expand;
173
+ }
174
+ const node = (0, filters_1.buildFilterNode)(filters);
175
+ const order = (0, filters_1.parseOrderBy)(orderBy);
176
+ const query = {
177
+ entity,
178
+ top: top ?? DEFAULT_READ_TOP,
179
+ ...(select ? { columns: select } : {}),
180
+ ...(node ? { filter: node } : {}),
181
+ ...(order ? { order } : {}),
182
+ ...(skip !== undefined ? { skip } : {}),
183
+ ...(count !== undefined ? { count } : {}),
184
+ ...(Object.keys(odata).length ? { odata } : {}),
185
+ };
186
+ const result = await this._engines.crud.read(query);
187
+ return count ? { total: result.totalCount, value: result.items } : result.items;
188
+ }
189
+ /** When DataForge is enabled, prefer its richer column details and fall back to the active
190
+ * CRUD backend's schema on a per-call miss. The `source` discriminator is part of the
191
+ * public tool contract and reflects where the schema actually came from. */
192
+ async _describeEntity(entitySet) {
193
+ if (this._isDataForgeReady()) {
194
+ const dataForge = await this._dataForge.getColumnsOrNull(entitySet);
195
+ if (dataForge !== null) {
196
+ return { source: 'dataforge', entitySet, dataForge };
199
197
  }
200
- return crud.read({
201
- entity,
202
- filter: finalFilter ?? undefined,
203
- select,
204
- top: top ?? DEFAULT_READ_TOP,
205
- expand,
206
- orderBy,
207
- skip,
208
- count,
209
- });
210
- }));
211
- this._registerHandlerWithDescriptor('query-sys-settings', tools_data_1.querySysSettingsDescriptor, (0, utils_1.withValidation)(tools_data_1.querySysSettingsInput, async ({ sysSettingCodes }) => {
212
- const result = await sysSettings.queryValues(sysSettingCodes);
213
- return {
214
- content: [
215
- {
216
- type: 'text',
217
- text: JSON.stringify(result, null, 2),
218
- },
219
- ],
220
- };
221
- }));
222
- if (!this._readonly) {
223
- const process = this._engines.process;
224
- const feature = this._engines.feature;
225
- const adminOperation = this._engines.adminOperation;
226
- const configuration = this._engines.configuration;
227
- this._registerHandlerWithDescriptor('create', tools_data_1.createDescriptor, (0, utils_1.withValidation)(tools_data_1.createInput, async ({ entity, data }) => crud.create({ entity, data })));
228
- this._registerHandlerWithDescriptor('update', tools_data_1.updateDescriptor, (0, utils_1.withValidation)(tools_data_1.updateInput, async ({ entity, id, data }) => crud.update({ entity, id, data })));
229
- this._registerHandlerWithDescriptor('delete', tools_data_1.deleteDescriptor, (0, utils_1.withValidation)(tools_data_1.deleteInput, async ({ entity, id }) => crud.delete({ entity, id })));
230
- this._registerHandlerWithDescriptor('execute-process', tools_data_1.executeProcessDescriptor, (0, utils_1.withValidation)(tools_data_1.executeProcessInput, async ({ processName, parameters }) => {
231
- const result = await process.execute({
232
- processName,
233
- parameters: parameters || {},
234
- });
235
- return {
236
- content: [
237
- {
238
- type: 'text',
239
- text: JSON.stringify(result, null, 2),
240
- },
241
- ],
242
- };
243
- }));
244
- this._registerHandlerWithDescriptor('set-sys-settings-value', tools_data_1.setSysSettingsValueDescriptor, (0, utils_1.withValidation)(tools_data_1.setSysSettingsValueInput, async ({ sysSettingsValues }) => {
245
- const result = await sysSettings.setValues(sysSettingsValues);
246
- return {
247
- content: [
248
- {
249
- type: 'text',
250
- text: JSON.stringify(result),
251
- },
252
- ],
253
- };
254
- }));
255
- this._registerHandlerWithDescriptor('create-sys-setting', tools_data_1.createSysSettingDescriptor, (0, utils_1.withValidation)(tools_data_1.createSysSettingInput, async ({ definition, initialValue }) => {
256
- const result = await sysSettings.createSetting({ definition, initialValue });
257
- return {
258
- content: [
259
- {
260
- type: 'text',
261
- text: JSON.stringify(result, null, 2),
262
- },
263
- ],
264
- };
265
- }));
266
- this._registerHandlerWithDescriptor('update-sys-setting-definition', tools_data_1.updateSysSettingDefinitionDescriptor, (0, utils_1.withValidation)(tools_data_1.updateSysSettingDefinitionInput, async ({ id, definition }) => {
267
- const result = await sysSettings.updateDefinition({
198
+ }
199
+ const metadata = await this._engines.crud.describeEntity(entitySet);
200
+ const source = this._engines.crud.kind === 'creatio-dataservice' ? 'dataservice' : 'odata';
201
+ return { source, entitySet, metadata };
202
+ }
203
+ /**
204
+ * The client tool surface as data. Handlers return raw domain results; MCP content
205
+ * wrapping is applied once by {@link _normalizeToToolHandler}. Adding a tool is a new
206
+ * row here (plus its descriptor) — no new bespoke wrapping. Mutating tools are listed
207
+ * separately and only registered when not in readonly mode.
208
+ */
209
+ _clientToolDefs() {
210
+ const { crud, user, sysSettings, process, feature, adminOperation, configuration } = this._engines;
211
+ const core = [
212
+ {
213
+ name: 'get-current-user-info',
214
+ descriptor: tools_data_1.getCurrentUserInfoDescriptor,
215
+ input: tools_data_1.getCurrentUserInfoInput,
216
+ run: () => user.getCurrentUserInfo(),
217
+ },
218
+ {
219
+ name: 'list-entities',
220
+ descriptor: tools_data_1.listEntitiesDescriptor,
221
+ input: tools_data_1.listEntitiesInput,
222
+ run: async () => ({ results: await crud.listEntitySets() }),
223
+ },
224
+ {
225
+ name: 'describe-entity',
226
+ descriptor: tools_data_1.describeEntityDescriptor,
227
+ input: tools_data_1.describeEntityInput,
228
+ run: ({ entitySet }) => this._describeEntity(entitySet),
229
+ },
230
+ {
231
+ name: 'read',
232
+ descriptor: (0, tools_data_1.buildReadDescriptor)(crud.capabilities),
233
+ input: (0, tools_data_1.buildReadInput)(crud.capabilities),
234
+ run: (args) => this._read(args),
235
+ },
236
+ {
237
+ name: 'query-sys-settings',
238
+ descriptor: tools_data_1.querySysSettingsDescriptor,
239
+ input: tools_data_1.querySysSettingsInput,
240
+ run: ({ sysSettingCodes }) => sysSettings.queryValues(sysSettingCodes),
241
+ },
242
+ ];
243
+ const mutating = [
244
+ {
245
+ name: 'create',
246
+ descriptor: tools_data_1.createDescriptor,
247
+ input: tools_data_1.createInput,
248
+ run: ({ entity, data }) => crud.create({ entity, data }),
249
+ },
250
+ {
251
+ name: 'update',
252
+ descriptor: tools_data_1.updateDescriptor,
253
+ input: tools_data_1.updateInput,
254
+ run: ({ entity, id, data }) => crud.update({ entity, id, data }),
255
+ },
256
+ {
257
+ name: 'delete',
258
+ descriptor: tools_data_1.deleteDescriptor,
259
+ input: tools_data_1.deleteInput,
260
+ run: ({ entity, id }) => crud.delete({ entity, id }),
261
+ },
262
+ {
263
+ name: 'execute-process',
264
+ descriptor: tools_data_1.executeProcessDescriptor,
265
+ input: tools_data_1.executeProcessInput,
266
+ run: ({ processName, parameters }) => process.execute({ processName, parameters: parameters || {} }),
267
+ },
268
+ {
269
+ name: 'set-sys-settings-value',
270
+ descriptor: tools_data_1.setSysSettingsValueDescriptor,
271
+ input: tools_data_1.setSysSettingsValueInput,
272
+ run: ({ sysSettingsValues }) => sysSettings.setValues(sysSettingsValues),
273
+ },
274
+ {
275
+ name: 'create-sys-setting',
276
+ descriptor: tools_data_1.createSysSettingDescriptor,
277
+ input: tools_data_1.createSysSettingInput,
278
+ run: ({ definition, initialValue }) => sysSettings.createSetting({ definition, initialValue }),
279
+ },
280
+ {
281
+ name: 'update-sys-setting-definition',
282
+ descriptor: tools_data_1.updateSysSettingDefinitionDescriptor,
283
+ input: tools_data_1.updateSysSettingDefinitionInput,
284
+ run: ({ id, definition }) => sysSettings.updateDefinition({
268
285
  ...definition,
269
286
  id,
270
- });
271
- return {
272
- content: [
273
- {
274
- type: 'text',
275
- text: JSON.stringify(result, null, 2),
276
- },
277
- ],
278
- };
279
- }));
280
- this._registerHandlerWithDescriptor('refresh-feature-cache', tools_data_1.refreshFeatureCacheDescriptor, (0, utils_1.withValidation)(tools_data_1.refreshFeatureCacheInput, async ({ featureCode }) => {
281
- const result = await feature.clearFeaturesCache(featureCode);
282
- return {
283
- content: [
284
- {
285
- type: 'text',
286
- text: JSON.stringify(result, null, 2),
287
- },
288
- ],
289
- };
290
- }));
291
- this._registerHandlerWithDescriptor('upsert-admin-operation', tools_data_1.upsertAdminOperationDescriptor, (0, utils_1.withValidation)(tools_data_1.upsertAdminOperationInput, async ({ id, name, code, description }) => {
292
- const result = await adminOperation.upsertAdminOperation({
287
+ }),
288
+ },
289
+ {
290
+ name: 'refresh-feature-cache',
291
+ descriptor: tools_data_1.refreshFeatureCacheDescriptor,
292
+ input: tools_data_1.refreshFeatureCacheInput,
293
+ run: ({ featureCode }) => feature.clearFeaturesCache(featureCode),
294
+ },
295
+ {
296
+ name: 'upsert-admin-operation',
297
+ descriptor: tools_data_1.upsertAdminOperationDescriptor,
298
+ input: tools_data_1.upsertAdminOperationInput,
299
+ run: ({ id, name, code, description }) => adminOperation.upsertAdminOperation({
293
300
  ...(id !== undefined ? { id } : {}),
294
301
  name,
295
302
  code,
296
303
  ...(description !== undefined ? { description } : {}),
297
- });
298
- return {
299
- content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
300
- };
301
- }));
302
- this._registerHandlerWithDescriptor('delete-admin-operation', tools_data_1.deleteAdminOperationDescriptor, (0, utils_1.withValidation)(tools_data_1.deleteAdminOperationInput, async ({ ids }) => {
303
- const result = await adminOperation.deleteAdminOperation(ids);
304
- return {
305
- content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
306
- };
307
- }));
308
- this._registerHandlerWithDescriptor('set-admin-operation-grantee', tools_data_1.setAdminOperationGranteeDescriptor, (0, utils_1.withValidation)(tools_data_1.setAdminOperationGranteeInput, async ({ adminOperationId, adminUnitIds, canExecute }) => {
309
- const result = await adminOperation.setAdminOperationGrantee({
304
+ }),
305
+ },
306
+ {
307
+ name: 'delete-admin-operation',
308
+ descriptor: tools_data_1.deleteAdminOperationDescriptor,
309
+ input: tools_data_1.deleteAdminOperationInput,
310
+ run: ({ ids }) => adminOperation.deleteAdminOperation(ids),
311
+ },
312
+ {
313
+ name: 'set-admin-operation-grantee',
314
+ descriptor: tools_data_1.setAdminOperationGranteeDescriptor,
315
+ input: tools_data_1.setAdminOperationGranteeInput,
316
+ run: ({ adminOperationId, adminUnitIds, canExecute }) => adminOperation.setAdminOperationGrantee({
310
317
  adminOperationId,
311
318
  adminUnitIds,
312
319
  canExecute,
313
- });
314
- return {
315
- content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
316
- };
317
- }));
318
- this._registerHandlerWithDescriptor('delete-admin-operation-grantee', tools_data_1.deleteAdminOperationGranteeDescriptor, (0, utils_1.withValidation)(tools_data_1.deleteAdminOperationGranteeInput, async ({ ids }) => {
319
- const result = await adminOperation.deleteAdminOperationGrantee(ids);
320
- return {
321
- content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
322
- };
323
- }));
324
- this._registerHandlerWithDescriptor('call-configuration-service', tools_data_1.callConfigurationServiceDescriptor, (0, utils_1.withValidation)(tools_data_1.callConfigurationServiceInput, async ({ service, method, httpMethod, body, query }) => {
325
- const result = await configuration.call({
320
+ }),
321
+ },
322
+ {
323
+ name: 'delete-admin-operation-grantee',
324
+ descriptor: tools_data_1.deleteAdminOperationGranteeDescriptor,
325
+ input: tools_data_1.deleteAdminOperationGranteeInput,
326
+ run: ({ ids }) => adminOperation.deleteAdminOperationGrantee(ids),
327
+ },
328
+ {
329
+ name: 'call-configuration-service',
330
+ descriptor: tools_data_1.callConfigurationServiceDescriptor,
331
+ input: tools_data_1.callConfigurationServiceInput,
332
+ run: ({ service, method, httpMethod, body, query }) => configuration.call({
326
333
  service,
327
334
  method,
328
335
  httpMethod,
329
336
  ...(body !== undefined ? { body } : {}),
330
337
  ...(query !== undefined ? { query } : {}),
331
- });
332
- return {
333
- content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
334
- };
335
- }));
338
+ }),
339
+ },
340
+ ];
341
+ return { core, mutating };
342
+ }
343
+ _registerClientTools() {
344
+ const { core, mutating } = this._clientToolDefs();
345
+ const defs = this._readonly ? core : [...core, ...mutating];
346
+ for (const def of defs) {
347
+ this._registerHandlerWithDescriptor(def.name, def.descriptor, (0, utils_1.withValidation)(def.input, def.run));
336
348
  }
337
349
  }
338
350
  async startMcp() {