@chriscamp/sf-data-cloud-mcp 0.1.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 (174) hide show
  1. package/README.md +158 -0
  2. package/dist/auth/auth-manager.d.ts +18 -0
  3. package/dist/auth/auth-manager.d.ts.map +1 -0
  4. package/dist/auth/auth-manager.js +64 -0
  5. package/dist/auth/auth-manager.js.map +1 -0
  6. package/dist/index.d.ts +3 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +160 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/smart/field-resolver.d.ts +17 -0
  11. package/dist/smart/field-resolver.d.ts.map +1 -0
  12. package/dist/smart/field-resolver.js +40 -0
  13. package/dist/smart/field-resolver.js.map +1 -0
  14. package/dist/smart/sql-translator.d.ts +6 -0
  15. package/dist/smart/sql-translator.d.ts.map +1 -0
  16. package/dist/smart/sql-translator.js +60 -0
  17. package/dist/smart/sql-translator.js.map +1 -0
  18. package/dist/smart/type-mapper.d.ts +3 -0
  19. package/dist/smart/type-mapper.d.ts.map +1 -0
  20. package/dist/smart/type-mapper.js +31 -0
  21. package/dist/smart/type-mapper.js.map +1 -0
  22. package/dist/tools/action/list-data-actions.d.ts +8 -0
  23. package/dist/tools/action/list-data-actions.d.ts.map +1 -0
  24. package/dist/tools/action/list-data-actions.js +10 -0
  25. package/dist/tools/action/list-data-actions.js.map +1 -0
  26. package/dist/tools/activation/create-activation.d.ts +10 -0
  27. package/dist/tools/activation/create-activation.d.ts.map +1 -0
  28. package/dist/tools/activation/create-activation.js +14 -0
  29. package/dist/tools/activation/create-activation.js.map +1 -0
  30. package/dist/tools/activation/list-activation-targets.d.ts +8 -0
  31. package/dist/tools/activation/list-activation-targets.d.ts.map +1 -0
  32. package/dist/tools/activation/list-activation-targets.js +10 -0
  33. package/dist/tools/activation/list-activation-targets.js.map +1 -0
  34. package/dist/tools/activation/list-activations.d.ts +8 -0
  35. package/dist/tools/activation/list-activations.d.ts.map +1 -0
  36. package/dist/tools/activation/list-activations.js +10 -0
  37. package/dist/tools/activation/list-activations.js.map +1 -0
  38. package/dist/tools/ci/create-calculated-insight.d.ts +11 -0
  39. package/dist/tools/ci/create-calculated-insight.d.ts.map +1 -0
  40. package/dist/tools/ci/create-calculated-insight.js +57 -0
  41. package/dist/tools/ci/create-calculated-insight.js.map +1 -0
  42. package/dist/tools/ci/delete-calculated-insight.d.ts +11 -0
  43. package/dist/tools/ci/delete-calculated-insight.d.ts.map +1 -0
  44. package/dist/tools/ci/delete-calculated-insight.js +15 -0
  45. package/dist/tools/ci/delete-calculated-insight.js.map +1 -0
  46. package/dist/tools/ci/get-calculated-insight-status.d.ts +10 -0
  47. package/dist/tools/ci/get-calculated-insight-status.d.ts.map +1 -0
  48. package/dist/tools/ci/get-calculated-insight-status.js +21 -0
  49. package/dist/tools/ci/get-calculated-insight-status.js.map +1 -0
  50. package/dist/tools/ci/list-calculated-insights.d.ts +10 -0
  51. package/dist/tools/ci/list-calculated-insights.d.ts.map +1 -0
  52. package/dist/tools/ci/list-calculated-insights.js +18 -0
  53. package/dist/tools/ci/list-calculated-insights.js.map +1 -0
  54. package/dist/tools/ci/run-calculated-insight.d.ts +11 -0
  55. package/dist/tools/ci/run-calculated-insight.d.ts.map +1 -0
  56. package/dist/tools/ci/run-calculated-insight.js +14 -0
  57. package/dist/tools/ci/run-calculated-insight.js.map +1 -0
  58. package/dist/tools/credits/estimate-flex-credits.d.ts +18 -0
  59. package/dist/tools/credits/estimate-flex-credits.d.ts.map +1 -0
  60. package/dist/tools/credits/estimate-flex-credits.js +56 -0
  61. package/dist/tools/credits/estimate-flex-credits.js.map +1 -0
  62. package/dist/tools/dmo/create-dmo-from-dlo.d.ts +15 -0
  63. package/dist/tools/dmo/create-dmo-from-dlo.d.ts.map +1 -0
  64. package/dist/tools/dmo/create-dmo-from-dlo.js +78 -0
  65. package/dist/tools/dmo/create-dmo-from-dlo.js.map +1 -0
  66. package/dist/tools/dmo/create-dmo-mapping.d.ts +11 -0
  67. package/dist/tools/dmo/create-dmo-mapping.d.ts.map +1 -0
  68. package/dist/tools/dmo/create-dmo-mapping.js +14 -0
  69. package/dist/tools/dmo/create-dmo-mapping.js.map +1 -0
  70. package/dist/tools/dmo/create-dmo.d.ts +11 -0
  71. package/dist/tools/dmo/create-dmo.d.ts.map +1 -0
  72. package/dist/tools/dmo/create-dmo.js +14 -0
  73. package/dist/tools/dmo/create-dmo.js.map +1 -0
  74. package/dist/tools/dmo/delete-dmo.d.ts +11 -0
  75. package/dist/tools/dmo/delete-dmo.d.ts.map +1 -0
  76. package/dist/tools/dmo/delete-dmo.js +15 -0
  77. package/dist/tools/dmo/delete-dmo.js.map +1 -0
  78. package/dist/tools/dmo/describe-dmo.d.ts +23 -0
  79. package/dist/tools/dmo/describe-dmo.d.ts.map +1 -0
  80. package/dist/tools/dmo/describe-dmo.js +10 -0
  81. package/dist/tools/dmo/describe-dmo.js.map +1 -0
  82. package/dist/tools/dmo/list-dmo-mappings.d.ts +11 -0
  83. package/dist/tools/dmo/list-dmo-mappings.d.ts.map +1 -0
  84. package/dist/tools/dmo/list-dmo-mappings.js +11 -0
  85. package/dist/tools/dmo/list-dmo-mappings.js.map +1 -0
  86. package/dist/tools/dmo/list-dmos.d.ts +17 -0
  87. package/dist/tools/dmo/list-dmos.d.ts.map +1 -0
  88. package/dist/tools/dmo/list-dmos.js +10 -0
  89. package/dist/tools/dmo/list-dmos.js.map +1 -0
  90. package/dist/tools/health/doctor.d.ts +18 -0
  91. package/dist/tools/health/doctor.d.ts.map +1 -0
  92. package/dist/tools/health/doctor.js +25 -0
  93. package/dist/tools/health/doctor.js.map +1 -0
  94. package/dist/tools/identity/describe-identity-resolution.d.ts +9 -0
  95. package/dist/tools/identity/describe-identity-resolution.d.ts.map +1 -0
  96. package/dist/tools/identity/describe-identity-resolution.js +10 -0
  97. package/dist/tools/identity/describe-identity-resolution.js.map +1 -0
  98. package/dist/tools/identity/list-identity-resolutions.d.ts +8 -0
  99. package/dist/tools/identity/list-identity-resolutions.d.ts.map +1 -0
  100. package/dist/tools/identity/list-identity-resolutions.js +10 -0
  101. package/dist/tools/identity/list-identity-resolutions.js.map +1 -0
  102. package/dist/tools/profile/query-profile.d.ts +10 -0
  103. package/dist/tools/profile/query-profile.d.ts.map +1 -0
  104. package/dist/tools/profile/query-profile.js +14 -0
  105. package/dist/tools/profile/query-profile.js.map +1 -0
  106. package/dist/tools/query/describe-table.d.ts +10 -0
  107. package/dist/tools/query/describe-table.d.ts.map +1 -0
  108. package/dist/tools/query/describe-table.js +10 -0
  109. package/dist/tools/query/describe-table.js.map +1 -0
  110. package/dist/tools/query/query-sql.d.ts +10 -0
  111. package/dist/tools/query/query-sql.d.ts.map +1 -0
  112. package/dist/tools/query/query-sql.js +10 -0
  113. package/dist/tools/query/query-sql.js.map +1 -0
  114. package/dist/tools/query/search-hybrid.d.ts +12 -0
  115. package/dist/tools/query/search-hybrid.d.ts.map +1 -0
  116. package/dist/tools/query/search-hybrid.js +12 -0
  117. package/dist/tools/query/search-hybrid.js.map +1 -0
  118. package/dist/tools/query/search-vector.d.ts +12 -0
  119. package/dist/tools/query/search-vector.d.ts.map +1 -0
  120. package/dist/tools/query/search-vector.js +12 -0
  121. package/dist/tools/query/search-vector.js.map +1 -0
  122. package/dist/tools/segment/describe-segment.d.ts +9 -0
  123. package/dist/tools/segment/describe-segment.d.ts.map +1 -0
  124. package/dist/tools/segment/describe-segment.js +10 -0
  125. package/dist/tools/segment/describe-segment.js.map +1 -0
  126. package/dist/tools/segment/list-segments.d.ts +8 -0
  127. package/dist/tools/segment/list-segments.d.ts.map +1 -0
  128. package/dist/tools/segment/list-segments.js +10 -0
  129. package/dist/tools/segment/list-segments.js.map +1 -0
  130. package/dist/tools/segment/publish-segment.d.ts +10 -0
  131. package/dist/tools/segment/publish-segment.d.ts.map +1 -0
  132. package/dist/tools/segment/publish-segment.js +14 -0
  133. package/dist/tools/segment/publish-segment.js.map +1 -0
  134. package/dist/tools/smart/resolve-field-names.d.ts +10 -0
  135. package/dist/tools/smart/resolve-field-names.d.ts.map +1 -0
  136. package/dist/tools/smart/resolve-field-names.js +18 -0
  137. package/dist/tools/smart/resolve-field-names.js.map +1 -0
  138. package/dist/tools/stream/create-data-stream.d.ts +10 -0
  139. package/dist/tools/stream/create-data-stream.d.ts.map +1 -0
  140. package/dist/tools/stream/create-data-stream.js +14 -0
  141. package/dist/tools/stream/create-data-stream.js.map +1 -0
  142. package/dist/tools/stream/describe-data-stream.d.ts +9 -0
  143. package/dist/tools/stream/describe-data-stream.d.ts.map +1 -0
  144. package/dist/tools/stream/describe-data-stream.js +10 -0
  145. package/dist/tools/stream/describe-data-stream.js.map +1 -0
  146. package/dist/tools/stream/list-data-streams.d.ts +8 -0
  147. package/dist/tools/stream/list-data-streams.d.ts.map +1 -0
  148. package/dist/tools/stream/list-data-streams.js +10 -0
  149. package/dist/tools/stream/list-data-streams.js.map +1 -0
  150. package/dist/tools/transform/get-transform-status.d.ts +9 -0
  151. package/dist/tools/transform/get-transform-status.d.ts.map +1 -0
  152. package/dist/tools/transform/get-transform-status.js +10 -0
  153. package/dist/tools/transform/get-transform-status.js.map +1 -0
  154. package/dist/tools/transform/list-transforms.d.ts +8 -0
  155. package/dist/tools/transform/list-transforms.d.ts.map +1 -0
  156. package/dist/tools/transform/list-transforms.js +10 -0
  157. package/dist/tools/transform/list-transforms.js.map +1 -0
  158. package/dist/tools/transform/run-transform.d.ts +10 -0
  159. package/dist/tools/transform/run-transform.d.ts.map +1 -0
  160. package/dist/tools/transform/run-transform.js +14 -0
  161. package/dist/tools/transform/run-transform.js.map +1 -0
  162. package/dist/util/errors.d.ts +2 -0
  163. package/dist/util/errors.d.ts.map +1 -0
  164. package/dist/util/errors.js +40 -0
  165. package/dist/util/errors.js.map +1 -0
  166. package/dist/util/http.d.ts +24 -0
  167. package/dist/util/http.d.ts.map +1 -0
  168. package/dist/util/http.js +104 -0
  169. package/dist/util/http.js.map +1 -0
  170. package/dist/util/unwrap.d.ts +12 -0
  171. package/dist/util/unwrap.d.ts.map +1 -0
  172. package/dist/util/unwrap.js +51 -0
  173. package/dist/util/unwrap.js.map +1 -0
  174. package/package.json +46 -0
@@ -0,0 +1,10 @@
1
+ import { z } from "zod";
2
+ import type { AuthManager } from "../../auth/auth-manager.js";
3
+ import type { DataCloudHttpClient } from "../../util/http.js";
4
+ export declare const resolveFieldNamesInputSchema: z.ZodObject<{
5
+ target_org: z.ZodString;
6
+ crm_object: z.ZodString;
7
+ crm_field: z.ZodOptional<z.ZodString>;
8
+ }, z.core.$strip>;
9
+ export declare function resolveFieldNamesTool(input: z.infer<typeof resolveFieldNamesInputSchema>, auth: AuthManager, http: DataCloudHttpClient): Promise<Record<string, unknown>>;
10
+ //# sourceMappingURL=resolve-field-names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-field-names.d.ts","sourceRoot":"","sources":["../../../src/tools/smart/resolve-field-names.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAG9D,eAAO,MAAM,4BAA4B;;;;iBAIvC,CAAC;AAEH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,EACnD,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAoBlC"}
@@ -0,0 +1,18 @@
1
+ import { z } from "zod";
2
+ import { FieldResolver } from "../../smart/field-resolver.js";
3
+ export const resolveFieldNamesInputSchema = z.object({
4
+ target_org: z.string().describe("Salesforce org alias or username"),
5
+ crm_object: z.string().describe("CRM object API name (e.g. Billing_Account__c)"),
6
+ crm_field: z.string().optional().describe("CRM field API name (e.g. Provider__c)")
7
+ });
8
+ export async function resolveFieldNamesTool(input, auth, http) {
9
+ const orgCreds = await auth.getOrgCredentials(input.target_org);
10
+ const resolver = new FieldResolver(http);
11
+ if (input.crm_field) {
12
+ const mapping = await resolver.resolveFieldMapping(input.crm_object, input.crm_field, orgCreds.accessToken, orgCreds.instanceUrl);
13
+ return { ...mapping };
14
+ }
15
+ const dloName = await resolver.resolveDloName(input.crm_object, orgCreds.accessToken, orgCreds.instanceUrl);
16
+ return { crm: input.crm_object, dlo: dloName };
17
+ }
18
+ //# sourceMappingURL=resolve-field-names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-field-names.js","sourceRoot":"","sources":["../../../src/tools/smart/resolve-field-names.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IACnD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IACnE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;IAChF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;CACnF,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAmD,EACnD,IAAiB,EACjB,IAAyB;IAEzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;IAEzC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,mBAAmB,CAChD,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,SAAS,EACf,QAAQ,CAAC,WAAW,EACpB,QAAQ,CAAC,WAAW,CACrB,CAAC;QACF,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;IACxB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,cAAc,CAC3C,KAAK,CAAC,UAAU,EAChB,QAAQ,CAAC,WAAW,EACpB,QAAQ,CAAC,WAAW,CACrB,CAAC;IACF,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AACjD,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { z } from "zod";
2
+ import type { AuthManager } from "../../auth/auth-manager.js";
3
+ import type { DataCloudHttpClient } from "../../util/http.js";
4
+ export declare const createDataStreamInputSchema: z.ZodObject<{
5
+ target_org: z.ZodString;
6
+ definition: z.ZodRecord<z.ZodString, z.ZodUnknown>;
7
+ confirm: z.ZodOptional<z.ZodBoolean>;
8
+ }, z.core.$strip>;
9
+ export declare function createDataStreamTool(input: z.infer<typeof createDataStreamInputSchema>, auth: AuthManager, http: DataCloudHttpClient): Promise<Record<string, unknown>>;
10
+ //# sourceMappingURL=create-data-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-data-stream.d.ts","sourceRoot":"","sources":["../../../src/tools/stream/create-data-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,eAAO,MAAM,2BAA2B;;;;iBAItC,CAAC;AAEH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,EAClD,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAWlC"}
@@ -0,0 +1,14 @@
1
+ import { z } from "zod";
2
+ export const createDataStreamInputSchema = z.object({
3
+ target_org: z.string().describe("Salesforce org alias or username"),
4
+ definition: z.record(z.string(), z.unknown()).describe("Data stream definition"),
5
+ confirm: z.boolean().optional().describe("Set to true to execute. Omit for preview.")
6
+ });
7
+ export async function createDataStreamTool(input, auth, http) {
8
+ if (!input.confirm) {
9
+ return { preview: true, definition: input.definition, message: "Set confirm: true to create this data stream." };
10
+ }
11
+ const orgCreds = await auth.getOrgCredentials(input.target_org);
12
+ return http.post(`${orgCreds.instanceUrl}/services/data/v66.0/ssot/data-streams`, orgCreds.accessToken, input.definition);
13
+ }
14
+ //# sourceMappingURL=create-data-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-data-stream.js","sourceRoot":"","sources":["../../../src/tools/stream/create-data-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IACnE,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IAChF,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;CACtF,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAAkD,EAClD,IAAiB,EACjB,IAAyB;IAEzB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,+CAA+C,EAAE,CAAC;IACnH,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC,IAAI,CACd,GAAG,QAAQ,CAAC,WAAW,wCAAwC,EAC/D,QAAQ,CAAC,WAAW,EACpB,KAAK,CAAC,UAAU,CACjB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { z } from "zod";
2
+ import type { AuthManager } from "../../auth/auth-manager.js";
3
+ import type { DataCloudHttpClient } from "../../util/http.js";
4
+ export declare const describeDataStreamInputSchema: z.ZodObject<{
5
+ target_org: z.ZodString;
6
+ stream_name: z.ZodString;
7
+ }, z.core.$strip>;
8
+ export declare function describeDataStreamTool(input: z.infer<typeof describeDataStreamInputSchema>, auth: AuthManager, http: DataCloudHttpClient): Promise<Record<string, unknown>>;
9
+ //# sourceMappingURL=describe-data-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-data-stream.d.ts","sourceRoot":"","sources":["../../../src/tools/stream/describe-data-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,eAAO,MAAM,6BAA6B;;;iBAGxC,CAAC;AAEH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,EACpD,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAMlC"}
@@ -0,0 +1,10 @@
1
+ import { z } from "zod";
2
+ export const describeDataStreamInputSchema = z.object({
3
+ target_org: z.string().describe("Salesforce org alias or username"),
4
+ stream_name: z.string().describe("Data stream name")
5
+ });
6
+ export async function describeDataStreamTool(input, auth, http) {
7
+ const orgCreds = await auth.getOrgCredentials(input.target_org);
8
+ return http.get(`${orgCreds.instanceUrl}/services/data/v66.0/ssot/data-streams/${input.stream_name}`, orgCreds.accessToken);
9
+ }
10
+ //# sourceMappingURL=describe-data-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-data-stream.js","sourceRoot":"","sources":["../../../src/tools/stream/describe-data-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IACpD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IACnE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;CACrD,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,KAAoD,EACpD,IAAiB,EACjB,IAAyB;IAEzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC,GAAG,CACb,GAAG,QAAQ,CAAC,WAAW,0CAA0C,KAAK,CAAC,WAAW,EAAE,EACpF,QAAQ,CAAC,WAAW,CACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { z } from "zod";
2
+ import type { AuthManager } from "../../auth/auth-manager.js";
3
+ import type { DataCloudHttpClient } from "../../util/http.js";
4
+ export declare const listDataStreamsInputSchema: z.ZodObject<{
5
+ target_org: z.ZodString;
6
+ }, z.core.$strip>;
7
+ export declare function listDataStreamsTool(input: z.infer<typeof listDataStreamsInputSchema>, auth: AuthManager, http: DataCloudHttpClient): Promise<Record<string, unknown>[]>;
8
+ //# sourceMappingURL=list-data-streams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-data-streams.d.ts","sourceRoot":"","sources":["../../../src/tools/stream/list-data-streams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,eAAO,MAAM,0BAA0B;;iBAErC,CAAC;AAEH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,EACjD,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CASpC"}
@@ -0,0 +1,10 @@
1
+ import { z } from "zod";
2
+ export const listDataStreamsInputSchema = z.object({
3
+ target_org: z.string().describe("Salesforce org alias or username")
4
+ });
5
+ export async function listDataStreamsTool(input, auth, http) {
6
+ const orgCreds = await auth.getOrgCredentials(input.target_org);
7
+ const result = await http.paginatedGet(`${orgCreds.instanceUrl}/services/data/v66.0/ssot/data-streams`, orgCreds.accessToken, "dataStreams", orgCreds.instanceUrl);
8
+ return result.items;
9
+ }
10
+ //# sourceMappingURL=list-data-streams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-data-streams.js","sourceRoot":"","sources":["../../../src/tools/stream/list-data-streams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;CACpE,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAiD,EACjD,IAAiB,EACjB,IAAyB;IAEzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CACpC,GAAG,QAAQ,CAAC,WAAW,wCAAwC,EAC/D,QAAQ,CAAC,WAAW,EACpB,aAAa,EACb,QAAQ,CAAC,WAAW,CACrB,CAAC;IACF,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { z } from "zod";
2
+ import type { AuthManager } from "../../auth/auth-manager.js";
3
+ import type { DataCloudHttpClient } from "../../util/http.js";
4
+ export declare const getTransformStatusInputSchema: z.ZodObject<{
5
+ target_org: z.ZodString;
6
+ transform_name: z.ZodString;
7
+ }, z.core.$strip>;
8
+ export declare function getTransformStatusTool(input: z.infer<typeof getTransformStatusInputSchema>, auth: AuthManager, http: DataCloudHttpClient): Promise<Record<string, unknown>>;
9
+ //# sourceMappingURL=get-transform-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-transform-status.d.ts","sourceRoot":"","sources":["../../../src/tools/transform/get-transform-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,eAAO,MAAM,6BAA6B;;;iBAGxC,CAAC;AAEH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,EACpD,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAMlC"}
@@ -0,0 +1,10 @@
1
+ import { z } from "zod";
2
+ export const getTransformStatusInputSchema = z.object({
3
+ target_org: z.string().describe("Salesforce org alias or username"),
4
+ transform_name: z.string().describe("Transform name")
5
+ });
6
+ export async function getTransformStatusTool(input, auth, http) {
7
+ const orgCreds = await auth.getOrgCredentials(input.target_org);
8
+ return http.get(`${orgCreds.instanceUrl}/services/data/v66.0/ssot/data-transforms/${input.transform_name}`, orgCreds.accessToken);
9
+ }
10
+ //# sourceMappingURL=get-transform-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-transform-status.js","sourceRoot":"","sources":["../../../src/tools/transform/get-transform-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IACpD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IACnE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;CACtD,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,KAAoD,EACpD,IAAiB,EACjB,IAAyB;IAEzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC,GAAG,CACb,GAAG,QAAQ,CAAC,WAAW,6CAA6C,KAAK,CAAC,cAAc,EAAE,EAC1F,QAAQ,CAAC,WAAW,CACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { z } from "zod";
2
+ import type { AuthManager } from "../../auth/auth-manager.js";
3
+ import type { DataCloudHttpClient } from "../../util/http.js";
4
+ export declare const listTransformsInputSchema: z.ZodObject<{
5
+ target_org: z.ZodString;
6
+ }, z.core.$strip>;
7
+ export declare function listTransformsTool(input: z.infer<typeof listTransformsInputSchema>, auth: AuthManager, http: DataCloudHttpClient): Promise<Record<string, unknown>[]>;
8
+ //# sourceMappingURL=list-transforms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-transforms.d.ts","sourceRoot":"","sources":["../../../src/tools/transform/list-transforms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,eAAO,MAAM,yBAAyB;;iBAEpC,CAAC;AAEH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,EAChD,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CASpC"}
@@ -0,0 +1,10 @@
1
+ import { z } from "zod";
2
+ export const listTransformsInputSchema = z.object({
3
+ target_org: z.string().describe("Salesforce org alias or username")
4
+ });
5
+ export async function listTransformsTool(input, auth, http) {
6
+ const orgCreds = await auth.getOrgCredentials(input.target_org);
7
+ const result = await http.paginatedGet(`${orgCreds.instanceUrl}/services/data/v66.0/ssot/data-transforms`, orgCreds.accessToken, "dataTransforms", orgCreds.instanceUrl);
8
+ return result.items;
9
+ }
10
+ //# sourceMappingURL=list-transforms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-transforms.js","sourceRoot":"","sources":["../../../src/tools/transform/list-transforms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;CACpE,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAgD,EAChD,IAAiB,EACjB,IAAyB;IAEzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CACpC,GAAG,QAAQ,CAAC,WAAW,2CAA2C,EAClE,QAAQ,CAAC,WAAW,EACpB,gBAAgB,EAChB,QAAQ,CAAC,WAAW,CACrB,CAAC;IACF,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { z } from "zod";
2
+ import type { AuthManager } from "../../auth/auth-manager.js";
3
+ import type { DataCloudHttpClient } from "../../util/http.js";
4
+ export declare const runTransformInputSchema: z.ZodObject<{
5
+ target_org: z.ZodString;
6
+ transform_name: z.ZodString;
7
+ confirm: z.ZodOptional<z.ZodBoolean>;
8
+ }, z.core.$strip>;
9
+ export declare function runTransformTool(input: z.infer<typeof runTransformInputSchema>, auth: AuthManager, http: DataCloudHttpClient): Promise<Record<string, unknown>>;
10
+ //# sourceMappingURL=run-transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-transform.d.ts","sourceRoot":"","sources":["../../../src/tools/transform/run-transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,eAAO,MAAM,uBAAuB;;;;iBAIlC,CAAC;AAEH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,EAC9C,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAWlC"}
@@ -0,0 +1,14 @@
1
+ import { z } from "zod";
2
+ export const runTransformInputSchema = z.object({
3
+ target_org: z.string().describe("Salesforce org alias or username"),
4
+ transform_name: z.string().describe("Transform name"),
5
+ confirm: z.boolean().optional().describe("Set to true to execute. Omit for preview.")
6
+ });
7
+ export async function runTransformTool(input, auth, http) {
8
+ if (!input.confirm) {
9
+ return { preview: true, transform_name: input.transform_name, message: "Set confirm: true to run this transform." };
10
+ }
11
+ const orgCreds = await auth.getOrgCredentials(input.target_org);
12
+ return http.post(`${orgCreds.instanceUrl}/services/data/v66.0/ssot/data-transforms/${input.transform_name}/actions/run`, orgCreds.accessToken, undefined);
13
+ }
14
+ //# sourceMappingURL=run-transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-transform.js","sourceRoot":"","sources":["../../../src/tools/transform/run-transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IACnE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IACrD,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;CACtF,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAA8C,EAC9C,IAAiB,EACjB,IAAyB;IAEzB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,OAAO,EAAE,0CAA0C,EAAE,CAAC;IACtH,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC,IAAI,CACd,GAAG,QAAQ,CAAC,WAAW,6CAA6C,KAAK,CAAC,cAAc,cAAc,EACtG,QAAQ,CAAC,WAAW,EACpB,SAAS,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function translateError(message: string): string;
2
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/util/errors.ts"],"names":[],"mappings":"AA2CA,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQtD"}
@@ -0,0 +1,40 @@
1
+ const ERROR_PATTERNS = [
2
+ {
3
+ pattern: /Invalid.*Calculated Insight Publish Schedule Interval:\s*(\S+)/i,
4
+ translate: (match, original) => `Schedule interval must be PascalCase: NotScheduled, One (1hr), Six (6hr), Twelve (12hr), TwentyFour (24hr). You sent: ${match[1]}`
5
+ },
6
+ {
7
+ pattern: /Error getting FactTable\s+\S+__dll/i,
8
+ translate: () => `CIs require DMO references (__dlm), not DLO references (__dll). Use resolve_field_names to find DMO table names.`
9
+ },
10
+ {
11
+ pattern: /cannot be found in dependencies or existing DMOs/i,
12
+ translate: () => `Field not found on DMO. Run describe_dmo to check actual field names — custom object fields get _c_c__c suffix.`
13
+ },
14
+ {
15
+ pattern: /type Date is different from.*type DateTime/i,
16
+ translate: () => `DLO/DMO type mismatch on Date/Currency fields. Use create_dmo_from_dlo which auto-corrects types, or exclude the field and add manually.`
17
+ },
18
+ {
19
+ pattern: /Unable to find Primary Key of DLO/i,
20
+ translate: () => `Reference table DLOs require a Key field in the mapping. Include Key__c in your field list.`
21
+ },
22
+ {
23
+ pattern: /The Definition Type is not supported/i,
24
+ translate: () => `Missing definitionType field. Add "definitionType": "CALCULATED_METRIC" to your CI definition.`
25
+ },
26
+ {
27
+ pattern: /Missing required field\(s\):\s*(.+)/i,
28
+ translate: (match) => `Missing required field(s): ${match[1]}. Check the design doc Section 8 for expected formats.`
29
+ }
30
+ ];
31
+ export function translateError(message) {
32
+ for (const { pattern, translate } of ERROR_PATTERNS) {
33
+ const match = message.match(pattern);
34
+ if (match) {
35
+ return translate(match, message);
36
+ }
37
+ }
38
+ return message;
39
+ }
40
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/util/errors.ts"],"names":[],"mappings":"AAKA,MAAM,cAAc,GAAmB;IACrC;QACE,OAAO,EAAE,iEAAiE;QAC1E,SAAS,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,CAC7B,yHAAyH,KAAK,CAAC,CAAC,CAAC,EAAE;KACtI;IACD;QACE,OAAO,EAAE,qCAAqC;QAC9C,SAAS,EAAE,GAAG,EAAE,CACd,kHAAkH;KACrH;IACD;QACE,OAAO,EAAE,mDAAmD;QAC5D,SAAS,EAAE,GAAG,EAAE,CACd,iHAAiH;KACpH;IACD;QACE,OAAO,EAAE,6CAA6C;QACtD,SAAS,EAAE,GAAG,EAAE,CACd,0IAA0I;KAC7I;IACD;QACE,OAAO,EAAE,oCAAoC;QAC7C,SAAS,EAAE,GAAG,EAAE,CACd,6FAA6F;KAChG;IACD;QACE,OAAO,EAAE,uCAAuC;QAChD,SAAS,EAAE,GAAG,EAAE,CACd,gGAAgG;KACnG;IACD;QACE,OAAO,EAAE,sCAAsC;QAC/C,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CACnB,8BAA8B,KAAK,CAAC,CAAC,CAAC,wDAAwD;KACjG;CACF,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,KAAK,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,cAAc,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { type UnwrappedResponse } from "./unwrap.js";
2
+ interface HttpClientOptions {
3
+ maxRetries?: number;
4
+ retryDelayMs?: number;
5
+ maxPages?: number;
6
+ }
7
+ export declare class DataCloudHttpClient {
8
+ private maxRetries;
9
+ private retryDelayMs;
10
+ private maxPages;
11
+ constructor(options?: HttpClientOptions);
12
+ get<T = unknown>(url: string, token: string): Promise<T>;
13
+ post<T = unknown>(url: string, token: string, body?: unknown): Promise<T>;
14
+ delete<T = unknown>(url: string, token: string): Promise<T>;
15
+ patch<T = unknown>(url: string, token: string, body?: unknown): Promise<T>;
16
+ /**
17
+ * Paginated GET — follows nextPageUrl to collect all items.
18
+ * Returns the combined unwrapped response.
19
+ */
20
+ paginatedGet(url: string, token: string, expectedKey: string, baseUrl?: string): Promise<UnwrappedResponse>;
21
+ private request;
22
+ }
23
+ export {};
24
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/util/http.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErE,UAAU,iBAAiB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,GAAE,iBAAsB;IAMrC,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAIxD,IAAI,CAAC,CAAC,GAAG,OAAO,EACpB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,CAAC,CAAC;IAIP,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAI3D,KAAK,CAAC,CAAC,GAAG,OAAO,EACrB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,CAAC,CAAC;IAIb;;;OAGG;IACG,YAAY,CAChB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,iBAAiB,CAAC;YA+Bf,OAAO;CAoDtB"}
@@ -0,0 +1,104 @@
1
+ import { translateError } from "./errors.js";
2
+ import { unwrapResponse } from "./unwrap.js";
3
+ export class DataCloudHttpClient {
4
+ maxRetries;
5
+ retryDelayMs;
6
+ maxPages;
7
+ constructor(options = {}) {
8
+ this.maxRetries = options.maxRetries ?? 3;
9
+ this.retryDelayMs = options.retryDelayMs ?? 1000;
10
+ this.maxPages = options.maxPages ?? 20;
11
+ }
12
+ async get(url, token) {
13
+ return this.request("GET", url, token);
14
+ }
15
+ async post(url, token, body) {
16
+ return this.request("POST", url, token, body);
17
+ }
18
+ async delete(url, token) {
19
+ return this.request("DELETE", url, token);
20
+ }
21
+ async patch(url, token, body) {
22
+ return this.request("PATCH", url, token, body);
23
+ }
24
+ /**
25
+ * Paginated GET — follows nextPageUrl to collect all items.
26
+ * Returns the combined unwrapped response.
27
+ */
28
+ async paginatedGet(url, token, expectedKey, baseUrl) {
29
+ const allItems = [];
30
+ let currentUrl = url;
31
+ let totalSize;
32
+ let pages = 0;
33
+ while (currentUrl && pages < this.maxPages) {
34
+ const raw = await this.get(currentUrl, token);
35
+ const page = unwrapResponse(raw, expectedKey);
36
+ allItems.push(...page.items);
37
+ if (page.totalSize !== undefined)
38
+ totalSize = page.totalSize;
39
+ if (page.nextPageUrl) {
40
+ // nextPageUrl may be relative (e.g. "/services/data/v66.0/ssot/...")
41
+ currentUrl = page.nextPageUrl.startsWith("http")
42
+ ? page.nextPageUrl
43
+ : `${baseUrl}${page.nextPageUrl}`;
44
+ }
45
+ else if (page.nextPageToken) {
46
+ // Token-based pagination (collection pattern)
47
+ const sep = currentUrl.includes("?") ? "&" : "?";
48
+ currentUrl = `${url}${sep}pageToken=${page.nextPageToken}`;
49
+ }
50
+ else {
51
+ break;
52
+ }
53
+ pages++;
54
+ }
55
+ return { items: allItems, totalSize };
56
+ }
57
+ async request(method, url, token, body) {
58
+ let lastError = null;
59
+ for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
60
+ const headers = {
61
+ Authorization: `Bearer ${token}`,
62
+ Accept: "application/json"
63
+ };
64
+ const init = { method, headers };
65
+ if (body !== undefined) {
66
+ headers["Content-Type"] = "application/json";
67
+ init.body = JSON.stringify(body);
68
+ }
69
+ const response = await fetch(url, init);
70
+ if (response.ok) {
71
+ return (await response.json());
72
+ }
73
+ const errorBody = await response
74
+ .json()
75
+ .catch(() => ({ message: `HTTP ${response.status}` }));
76
+ const errorMessage = errorBody.message ??
77
+ `HTTP ${response.status}`;
78
+ if ((response.status === 429 || response.status >= 500) &&
79
+ attempt < this.maxRetries) {
80
+ lastError = new Error(errorMessage);
81
+ // Respect Retry-After header if present, otherwise exponential backoff
82
+ const retryAfter = response.headers.get("Retry-After");
83
+ const delayMs = retryAfter
84
+ ? parseRetryAfter(retryAfter)
85
+ : this.retryDelayMs * Math.pow(2, attempt);
86
+ await new Promise((r) => setTimeout(r, delayMs));
87
+ continue;
88
+ }
89
+ throw new Error(translateError(errorMessage));
90
+ }
91
+ throw lastError ?? new Error("Request failed after retries");
92
+ }
93
+ }
94
+ function parseRetryAfter(value) {
95
+ const seconds = parseInt(value, 10);
96
+ if (!isNaN(seconds))
97
+ return seconds * 1000;
98
+ // HTTP-date format
99
+ const date = new Date(value);
100
+ if (!isNaN(date.getTime()))
101
+ return Math.max(0, date.getTime() - Date.now());
102
+ return 1000; // fallback
103
+ }
104
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/util/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Unwraps Data Cloud API responses into a consistent shape.
3
+ * Handles: plural key, singular key, collection pattern, bare arrays.
4
+ */
5
+ export interface UnwrappedResponse {
6
+ items: Record<string, unknown>[];
7
+ totalSize?: number;
8
+ nextPageUrl?: string;
9
+ nextPageToken?: string;
10
+ }
11
+ export declare function unwrapResponse(data: unknown, expectedKey: string): UnwrappedResponse;
12
+ //# sourceMappingURL=unwrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unwrap.d.ts","sourceRoot":"","sources":["../../src/util/unwrap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,OAAO,EACb,WAAW,EAAE,MAAM,GAClB,iBAAiB,CAmDnB"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Unwraps Data Cloud API responses into a consistent shape.
3
+ * Handles: plural key, singular key, collection pattern, bare arrays.
4
+ */
5
+ export function unwrapResponse(data, expectedKey) {
6
+ // Bare array
7
+ if (Array.isArray(data)) {
8
+ return { items: data };
9
+ }
10
+ if (typeof data !== "object" || data === null) {
11
+ return { items: [] };
12
+ }
13
+ const obj = data;
14
+ // Collection pattern: { collection: { items: [...], total, nextPageToken } }
15
+ if (obj.collection && typeof obj.collection === "object") {
16
+ const coll = obj.collection;
17
+ const items = Array.isArray(coll.items) ? coll.items : [];
18
+ return {
19
+ items: items,
20
+ totalSize: typeof coll.total === "number" ? coll.total : undefined,
21
+ nextPageToken: typeof coll.nextPageToken === "string" ? coll.nextPageToken : undefined
22
+ };
23
+ }
24
+ // Standard key: try exact match, then singular (drop trailing 's')
25
+ let items;
26
+ if (Array.isArray(obj[expectedKey])) {
27
+ items = obj[expectedKey];
28
+ }
29
+ else {
30
+ // Try singular form: dataModelObjects -> dataModelObject
31
+ const singular = expectedKey.replace(/s$/, "");
32
+ if (Array.isArray(obj[singular])) {
33
+ items = obj[singular];
34
+ }
35
+ }
36
+ if (!items) {
37
+ // Last resort: find first array-valued key
38
+ for (const val of Object.values(obj)) {
39
+ if (Array.isArray(val)) {
40
+ items = val;
41
+ break;
42
+ }
43
+ }
44
+ }
45
+ return {
46
+ items: (items ?? []),
47
+ totalSize: typeof obj.totalSize === "number" ? obj.totalSize : undefined,
48
+ nextPageUrl: typeof obj.nextPageUrl === "string" ? obj.nextPageUrl : undefined
49
+ };
50
+ }
51
+ //# sourceMappingURL=unwrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unwrap.js","sourceRoot":"","sources":["../../src/util/unwrap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,UAAU,cAAc,CAC5B,IAAa,EACb,WAAmB;IAEnB,aAAa;IACb,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACvB,CAAC;IAED,MAAM,GAAG,GAAG,IAA+B,CAAC;IAE5C,6EAA6E;IAC7E,IAAI,GAAG,CAAC,UAAU,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,GAAG,CAAC,UAAqC,CAAC;QACvD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,OAAO;YACL,KAAK,EAAE,KAAkC;YACzC,SAAS,EAAE,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YAClE,aAAa,EAAE,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;SACvF,CAAC;IACJ,CAAC;IAED,mEAAmE;IACnE,IAAI,KAA4B,CAAC;IAEjC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QACpC,KAAK,GAAG,GAAG,CAAC,WAAW,CAAc,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,yDAAyD;QACzD,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YACjC,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAc,CAAC;QACrC,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,2CAA2C;QAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,KAAK,GAAG,GAAG,CAAC;gBACZ,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,CAAC,KAAK,IAAI,EAAE,CAA8B;QACjD,SAAS,EAAE,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QACxE,WAAW,EAAE,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;KAC/E,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@chriscamp/sf-data-cloud-mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for Salesforce Data Cloud operations",
5
+ "type": "module",
6
+ "bin": {
7
+ "sf-data-cloud-mcp": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "README.md"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "dev": "tsc --watch",
16
+ "test": "vitest run",
17
+ "test:watch": "vitest",
18
+ "lint": "tsc --noEmit",
19
+ "prepare": "npm run build",
20
+ "prepublishOnly": "npm run build"
21
+ },
22
+ "engines": {
23
+ "node": ">=18"
24
+ },
25
+ "keywords": [
26
+ "mcp",
27
+ "salesforce",
28
+ "data-cloud",
29
+ "ai"
30
+ ],
31
+ "author": "Chris Camp",
32
+ "license": "MIT",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "https://github.com/ChrisCampTN/sf-data-cloud-mcp.git"
36
+ },
37
+ "dependencies": {
38
+ "@modelcontextprotocol/sdk": "^1.29.0",
39
+ "zod": "^4.3.6"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^25.5.2",
43
+ "typescript": "^6.0.2",
44
+ "vitest": "^4.1.3"
45
+ }
46
+ }