@hayodev/crystallize-mcp 0.1.1

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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +304 -0
  3. package/build/src/audit.d.ts +23 -0
  4. package/build/src/audit.d.ts.map +1 -0
  5. package/build/src/audit.js +38 -0
  6. package/build/src/audit.js.map +1 -0
  7. package/build/src/bin/crystallize-mcp.d.ts +12 -0
  8. package/build/src/bin/crystallize-mcp.d.ts.map +1 -0
  9. package/build/src/bin/crystallize-mcp.js +45 -0
  10. package/build/src/bin/crystallize-mcp.js.map +1 -0
  11. package/build/src/bin/setup.d.ts +12 -0
  12. package/build/src/bin/setup.d.ts.map +1 -0
  13. package/build/src/bin/setup.js +171 -0
  14. package/build/src/bin/setup.js.map +1 -0
  15. package/build/src/client.d.ts +28 -0
  16. package/build/src/client.d.ts.map +1 -0
  17. package/build/src/client.js +124 -0
  18. package/build/src/client.js.map +1 -0
  19. package/build/src/credentials.d.ts +25 -0
  20. package/build/src/credentials.d.ts.map +1 -0
  21. package/build/src/credentials.js +104 -0
  22. package/build/src/credentials.js.map +1 -0
  23. package/build/src/errors.d.ts +12 -0
  24. package/build/src/errors.d.ts.map +1 -0
  25. package/build/src/errors.js +66 -0
  26. package/build/src/errors.js.map +1 -0
  27. package/build/src/index.d.ts +12 -0
  28. package/build/src/index.d.ts.map +1 -0
  29. package/build/src/index.js +83 -0
  30. package/build/src/index.js.map +1 -0
  31. package/build/src/pii.d.ts +20 -0
  32. package/build/src/pii.d.ts.map +1 -0
  33. package/build/src/pii.js +85 -0
  34. package/build/src/pii.js.map +1 -0
  35. package/build/src/tools/catalogue.d.ts +7 -0
  36. package/build/src/tools/catalogue.d.ts.map +1 -0
  37. package/build/src/tools/catalogue.js +329 -0
  38. package/build/src/tools/catalogue.js.map +1 -0
  39. package/build/src/tools/customers.d.ts +7 -0
  40. package/build/src/tools/customers.d.ts.map +1 -0
  41. package/build/src/tools/customers.js +278 -0
  42. package/build/src/tools/customers.js.map +1 -0
  43. package/build/src/tools/discovery.d.ts +10 -0
  44. package/build/src/tools/discovery.d.ts.map +1 -0
  45. package/build/src/tools/discovery.js +285 -0
  46. package/build/src/tools/discovery.js.map +1 -0
  47. package/build/src/tools/orders.d.ts +7 -0
  48. package/build/src/tools/orders.d.ts.map +1 -0
  49. package/build/src/tools/orders.js +250 -0
  50. package/build/src/tools/orders.js.map +1 -0
  51. package/build/src/tools/shapes.d.ts +7 -0
  52. package/build/src/tools/shapes.d.ts.map +1 -0
  53. package/build/src/tools/shapes.js +194 -0
  54. package/build/src/tools/shapes.js.map +1 -0
  55. package/build/src/types.d.ts +43 -0
  56. package/build/src/types.d.ts.map +1 -0
  57. package/build/src/types.js +5 -0
  58. package/build/src/types.js.map +1 -0
  59. package/package.json +75 -0
@@ -0,0 +1,329 @@
1
+ /**
2
+ * Catalogue tools — browse, get items, search, and product variants.
3
+ */
4
+ import { z } from 'zod';
5
+ export function catalogueTools(client) {
6
+ return [
7
+ {
8
+ name: 'browse_catalogue',
9
+ description: 'Browse the catalogue tree by path. Returns child items (folders, products, documents) with names, paths, and types. Start with "/" to see the root.',
10
+ schema: {
11
+ path: z
12
+ .string()
13
+ .default('/')
14
+ .describe('Catalogue path to browse, e.g. "/" or "/shop/plants"'),
15
+ language: z.string().default('en').describe('Language code'),
16
+ depth: z
17
+ .number()
18
+ .default(1)
19
+ .describe('How many levels deep to fetch children (1-3)'),
20
+ },
21
+ handler: async (params) => {
22
+ const { path, language, depth } = params;
23
+ const clampedDepth = Math.min(Math.max(depth, 1), 3);
24
+ const childrenFragment = buildChildrenFragment(clampedDepth);
25
+ const query = `
26
+ query BrowseCatalogue($path: String!, $language: String!) {
27
+ catalogue(path: $path, language: $language) {
28
+ id
29
+ name
30
+ type
31
+ path
32
+ ${childrenFragment}
33
+ }
34
+ }
35
+ `;
36
+ const data = await client.api.catalogueApi(query, { path, language });
37
+ const catalogue = data
38
+ .catalogue;
39
+ if (!catalogue) {
40
+ return {
41
+ content: [
42
+ { type: 'text', text: `No item found at path "${path}"` },
43
+ ],
44
+ isError: true,
45
+ };
46
+ }
47
+ const lines = formatCatalogueNode(catalogue, client, 0, language);
48
+ return {
49
+ content: [{ type: 'text', text: lines.join('\n') }],
50
+ };
51
+ },
52
+ },
53
+ {
54
+ name: 'get_item',
55
+ description: 'Get a catalogue item by path with its full component data. Returns name, type, shape, components, and a deep link to the Crystallize UI.',
56
+ schema: {
57
+ path: z.string().describe('Item path, e.g. "/shop/plants/monstera"'),
58
+ language: z.string().default('en').describe('Language code'),
59
+ },
60
+ handler: async (params) => {
61
+ const { path, language } = params;
62
+ const query = `
63
+ query GetItem($path: String!, $language: String!) {
64
+ catalogue(path: $path, language: $language) {
65
+ id
66
+ name
67
+ type
68
+ path
69
+ shape {
70
+ identifier
71
+ name
72
+ }
73
+ components {
74
+ id
75
+ name
76
+ type
77
+ content {
78
+ ... on SingleLineContent { text }
79
+ ... on RichTextContent { plainText }
80
+ ... on BooleanContent { value }
81
+ ... on NumericContent { number unit }
82
+ ... on SelectionContent { options { key value } }
83
+ ... on ImageContent {
84
+ images { url altText width height }
85
+ }
86
+ ... on ComponentChoiceContent {
87
+ selectedComponent { id name type }
88
+ }
89
+ }
90
+ }
91
+ }
92
+ }
93
+ `;
94
+ const data = await client.api.catalogueApi(query, { path, language });
95
+ const item = data.catalogue;
96
+ if (!item) {
97
+ return {
98
+ content: [
99
+ { type: 'text', text: `No item found at path "${path}"` },
100
+ ],
101
+ isError: true,
102
+ };
103
+ }
104
+ const lines = [
105
+ `${item.name}`,
106
+ ` Type: ${item.type}`,
107
+ ` Path: ${item.path}`,
108
+ ` Shape: ${item.shape?.name ?? 'unknown'} (${item.shape?.identifier ?? '?'})`,
109
+ ` Link: ${client.itemLink(item.id, item.type, language)}`,
110
+ ` Shape link: ${item.shape ? client.shapeLink(item.shape.identifier, language) : 'n/a'}`,
111
+ ];
112
+ if (item.components?.length) {
113
+ lines.push('', 'Components:');
114
+ for (const comp of item.components) {
115
+ lines.push(` ${comp.id} (${comp.type}): ${formatComponentContent(comp.content)}`);
116
+ }
117
+ }
118
+ return {
119
+ content: [{ type: 'text', text: lines.join('\n') }],
120
+ };
121
+ },
122
+ },
123
+ {
124
+ name: 'search_catalogue',
125
+ description: 'Search across the catalogue for products, documents, and folders. Supports filtering by type (PRODUCT, DOCUMENT, FOLDER). Returns names, paths, types, and deep links.',
126
+ schema: {
127
+ term: z.string().describe('Search term'),
128
+ type: z
129
+ .enum(['PRODUCT', 'DOCUMENT', 'FOLDER'])
130
+ .optional()
131
+ .describe('Filter by item type'),
132
+ language: z.string().default('no').describe('Language code'),
133
+ limit: z.number().default(20).describe('Max results to return'),
134
+ },
135
+ handler: async (params) => {
136
+ const { term, type, language, limit } = params;
137
+ const typeFilter = type ? `, type: ${type}` : '';
138
+ const query = `
139
+ query Search($term: String!, $language: String!) {
140
+ search(
141
+ language: $language
142
+ filter: { searchTerm: $term${typeFilter} }
143
+ ) {
144
+ edges {
145
+ node {
146
+ id
147
+ name
148
+ path
149
+ type
150
+ }
151
+ }
152
+ }
153
+ }
154
+ `;
155
+ const response = await fetch(`https://api.crystallize.com/${client.config.tenantIdentifier}/search`, {
156
+ method: 'POST',
157
+ headers: { 'Content-Type': 'application/json' },
158
+ body: JSON.stringify({ query, variables: { term, language } }),
159
+ });
160
+ const json = (await response.json());
161
+ const edges = (json.data?.search?.edges ?? []).slice(0, limit);
162
+ if (edges.length === 0) {
163
+ return {
164
+ content: [
165
+ {
166
+ type: 'text',
167
+ text: `No results for "${term}"${type ? ` (type: ${type})` : ''}`,
168
+ },
169
+ ],
170
+ };
171
+ }
172
+ const lines = edges.map((edge, i) => {
173
+ const node = edge.node;
174
+ const parts = [
175
+ `${i + 1}. ${node.name} [${node.type}]`,
176
+ ` Path: ${node.path}`,
177
+ ` Link: ${client.itemLink(node.id, node.type, language)}`,
178
+ ];
179
+ return parts.join('\n');
180
+ });
181
+ return {
182
+ content: [
183
+ {
184
+ type: 'text',
185
+ text: `Search results for "${term}" (${edges.length} hits):\n\n${lines.join('\n\n')}`,
186
+ },
187
+ ],
188
+ };
189
+ },
190
+ },
191
+ {
192
+ name: 'get_product_variants',
193
+ description: 'Get all variants for a product by path. Returns SKUs, names, pricing, stock, and attributes.',
194
+ schema: {
195
+ path: z.string().describe('Product path, e.g. "/shop/plants/monstera"'),
196
+ language: z.string().default('en').describe('Language code'),
197
+ },
198
+ handler: async (params) => {
199
+ const { path, language } = params;
200
+ const query = `
201
+ query GetVariants($path: String!, $language: String!) {
202
+ catalogue(path: $path, language: $language) {
203
+ id
204
+ name
205
+ ... on Product {
206
+ variants {
207
+ sku
208
+ name
209
+ isDefault
210
+ price
211
+ stock
212
+ attributes {
213
+ attribute
214
+ value
215
+ }
216
+ images {
217
+ url
218
+ altText
219
+ }
220
+ }
221
+ }
222
+ }
223
+ }
224
+ `;
225
+ const data = await client.api.catalogueApi(query, { path, language });
226
+ const product = data.catalogue;
227
+ if (!product) {
228
+ return {
229
+ content: [
230
+ { type: 'text', text: `No product found at path "${path}"` },
231
+ ],
232
+ isError: true,
233
+ };
234
+ }
235
+ const variants = product.variants ?? [];
236
+ if (variants.length === 0) {
237
+ return {
238
+ content: [
239
+ {
240
+ type: 'text',
241
+ text: `Product "${product.name}" has no variants.`,
242
+ },
243
+ ],
244
+ };
245
+ }
246
+ const lines = [
247
+ `${product.name} — ${variants.length} variant(s)`,
248
+ `Link: ${client.itemLink(product.id, 'product', language)}`,
249
+ '',
250
+ ];
251
+ for (const v of variants) {
252
+ lines.push(`${v.isDefault ? '* ' : ' '}${v.name ?? v.sku}`);
253
+ lines.push(` SKU: ${v.sku}`);
254
+ if (v.price != null) {
255
+ lines.push(` Price: ${v.price}`);
256
+ }
257
+ if (v.stock != null) {
258
+ lines.push(` Stock: ${v.stock}`);
259
+ }
260
+ if (v.attributes?.length) {
261
+ for (const attr of v.attributes) {
262
+ lines.push(` ${attr.attribute}: ${attr.value}`);
263
+ }
264
+ }
265
+ lines.push('');
266
+ }
267
+ return {
268
+ content: [{ type: 'text', text: lines.join('\n') }],
269
+ };
270
+ },
271
+ },
272
+ ];
273
+ }
274
+ // --- Helpers ---
275
+ function buildChildrenFragment(depth) {
276
+ if (depth <= 0) {
277
+ return '';
278
+ }
279
+ const inner = depth > 1 ? buildChildrenFragment(depth - 1) : '';
280
+ return `children { id name type path ${inner} }`;
281
+ }
282
+ function formatCatalogueNode(node, client, indent, language = 'en') {
283
+ const prefix = ' '.repeat(indent);
284
+ const lines = [
285
+ `${prefix}${node.name} [${node.type}]`,
286
+ `${prefix} Path: ${node.path}`,
287
+ `${prefix} Link: ${client.itemLink(node.id, node.type, language)}`,
288
+ ];
289
+ if (node.children?.length) {
290
+ for (const child of node.children) {
291
+ lines.push(...formatCatalogueNode(child, client, indent + 1, language));
292
+ }
293
+ }
294
+ return lines;
295
+ }
296
+ function formatComponentContent(content) {
297
+ if (!content) {
298
+ return '(empty)';
299
+ }
300
+ if ('text' in content) {
301
+ return String(content.text);
302
+ }
303
+ if ('plainText' in content) {
304
+ return truncate(String(content.plainText), 200);
305
+ }
306
+ if ('value' in content) {
307
+ return String(content.value);
308
+ }
309
+ if ('number' in content) {
310
+ const unit = content.unit ? ` ${content.unit}` : '';
311
+ return `${content.number}${unit}`;
312
+ }
313
+ if ('images' in content) {
314
+ const images = content.images;
315
+ return `${images.length} image(s)`;
316
+ }
317
+ if ('options' in content) {
318
+ const options = content.options;
319
+ return options.map(o => o.value).join(', ');
320
+ }
321
+ return JSON.stringify(content);
322
+ }
323
+ function truncate(text, max) {
324
+ if (text.length <= max) {
325
+ return text;
326
+ }
327
+ return text.slice(0, max) + '...';
328
+ }
329
+ //# sourceMappingURL=catalogue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalogue.js","sourceRoot":"","sources":["../../../src/tools/catalogue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Customer tools — search and inspect customers.
3
+ */
4
+ import type { CrystallizeClient } from '../client.js';
5
+ import type { ToolDefinition } from '../types.js';
6
+ export declare function customerTools(client: CrystallizeClient): ToolDefinition[];
7
+ //# sourceMappingURL=customers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customers.d.ts","sourceRoot":"","sources":["../../../src/tools/customers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,wBAAgB,aAAa,CAAC,MAAM,EAAE,iBAAiB,GAAG,cAAc,EAAE,CA+SzE"}
@@ -0,0 +1,278 @@
1
+ /**
2
+ * Customer tools — search and inspect customers.
3
+ */
4
+ import { z } from 'zod';
5
+ import { maskEmail, maskPhone } from '../pii.js';
6
+ export function customerTools(client) {
7
+ return [
8
+ {
9
+ name: 'list_customers',
10
+ description: 'Search and list customers in the tenant. Supports filtering by name or email. Returned fields depend on CRYSTALLIZE_PII_MODE: full (default) returns name, identifier, email, company, and phone; masked returns name, identifier, company, and masked email/phone; none returns identifiers only.',
11
+ schema: {
12
+ searchTerm: z
13
+ .string()
14
+ .optional()
15
+ .describe('Filter customers by name or email (partial match)'),
16
+ first: z.number().default(20).describe('Max customers to return'),
17
+ after: z
18
+ .string()
19
+ .optional()
20
+ .describe('Pagination cursor from a previous response'),
21
+ },
22
+ handler: async (params) => {
23
+ const { searchTerm, first, after } = params;
24
+ const filterArg = searchTerm
25
+ ? `, filter: { searchTerm: "${searchTerm}" }`
26
+ : '';
27
+ const afterArg = after ? `, after: "${after}"` : '';
28
+ const query = `
29
+ query ListCustomers($tenantId: ID!, $first: Int) {
30
+ customer {
31
+ getMany(
32
+ tenantId: $tenantId
33
+ first: $first${afterArg}${filterArg}
34
+ ) {
35
+ pageInfo {
36
+ hasNextPage
37
+ hasPreviousPage
38
+ startCursor
39
+ endCursor
40
+ totalNodes
41
+ }
42
+ edges {
43
+ node {
44
+ identifier
45
+ firstName
46
+ lastName
47
+ email
48
+ companyName
49
+ phone
50
+ }
51
+ }
52
+ }
53
+ }
54
+ }
55
+ `;
56
+ const data = await client.api.pimApi(query, {
57
+ tenantId: client.config.tenantId,
58
+ first,
59
+ });
60
+ const result = data.customer?.getMany;
61
+ if (!result) {
62
+ return {
63
+ content: [
64
+ {
65
+ type: 'text',
66
+ text: `No customers found${searchTerm ? ` matching "${searchTerm}"` : ''}.`,
67
+ },
68
+ ],
69
+ };
70
+ }
71
+ const customers = result.edges.map(e => e.node);
72
+ if (customers.length === 0) {
73
+ return {
74
+ content: [
75
+ {
76
+ type: 'text',
77
+ text: `No customers found${searchTerm ? ` matching "${searchTerm}"` : ''}.`,
78
+ },
79
+ ],
80
+ };
81
+ }
82
+ const total = result.pageInfo.totalNodes ?? customers.length;
83
+ const lines = [
84
+ `Customers (${customers.length} of ${total}):`,
85
+ '',
86
+ ];
87
+ const pii = client.config.piiMode;
88
+ for (const c of customers) {
89
+ const maskedId = pii !== 'full' && c.identifier.includes('@')
90
+ ? maskEmail(c.identifier)
91
+ : c.identifier;
92
+ if (pii === 'none') {
93
+ lines.push(`${maskedId}`);
94
+ }
95
+ else {
96
+ const name = [c.firstName, c.lastName].filter(Boolean).join(' ');
97
+ lines.push(`${name || maskedId} (${maskedId})`);
98
+ if (c.email) {
99
+ lines.push(` Email: ${pii === 'masked' ? maskEmail(c.email) : c.email}`);
100
+ }
101
+ if (c.companyName) {
102
+ lines.push(` Company: ${c.companyName}`);
103
+ }
104
+ if (c.phone) {
105
+ lines.push(` Phone: ${pii === 'masked' ? maskPhone(c.phone) : c.phone}`);
106
+ }
107
+ }
108
+ lines.push('');
109
+ }
110
+ if (result.pageInfo.hasNextPage && result.pageInfo.endCursor) {
111
+ lines.push(`Next page cursor: ${result.pageInfo.endCursor}`);
112
+ }
113
+ return {
114
+ content: [{ type: 'text', text: lines.join('\n') }],
115
+ };
116
+ },
117
+ },
118
+ {
119
+ name: 'get_customer',
120
+ description: 'Get full profile for a customer by their identifier (UUID from list_customers). Returns name, email, addresses, meta, and external references.',
121
+ schema: {
122
+ identifier: z
123
+ .string()
124
+ .describe('Customer identifier UUID — use list_customers to find it'),
125
+ },
126
+ handler: async (params) => {
127
+ const { identifier } = params;
128
+ const query = `
129
+ query GetCustomer($identifier: String!, $tenantId: ID!) {
130
+ customer {
131
+ get(identifier: $identifier, tenantId: $tenantId) {
132
+ identifier
133
+ firstName
134
+ lastName
135
+ email
136
+ companyName
137
+ phone
138
+ taxNumber
139
+ birthDate
140
+ meta {
141
+ key
142
+ value
143
+ }
144
+ externalReferences {
145
+ key
146
+ value
147
+ }
148
+ addresses {
149
+ type
150
+ firstName
151
+ lastName
152
+ street
153
+ street2
154
+ streetNumber
155
+ city
156
+ state
157
+ postalCode
158
+ country
159
+ email
160
+ phone
161
+ }
162
+ }
163
+ }
164
+ }
165
+ `;
166
+ const data = await client.api.pimApi(query, {
167
+ identifier,
168
+ tenantId: client.config.tenantId,
169
+ });
170
+ const customer = data.customer?.get;
171
+ if (!customer) {
172
+ return {
173
+ content: [
174
+ {
175
+ type: 'text',
176
+ text: `Customer "${identifier}" not found. Use list_customers to search.`,
177
+ },
178
+ ],
179
+ isError: true,
180
+ };
181
+ }
182
+ const pii = client.config.piiMode;
183
+ const maskedId = pii !== 'full' && customer.identifier.includes('@')
184
+ ? maskEmail(customer.identifier)
185
+ : customer.identifier;
186
+ const lines = [` Identifier: ${maskedId}`];
187
+ if (pii !== 'none') {
188
+ const name = [customer.firstName, customer.lastName]
189
+ .filter(Boolean)
190
+ .join(' ');
191
+ if (name) {
192
+ lines.unshift(name);
193
+ }
194
+ else {
195
+ lines.unshift(maskedId);
196
+ }
197
+ if (customer.email) {
198
+ lines.push(` Email: ${pii === 'masked' ? maskEmail(customer.email) : customer.email}`);
199
+ }
200
+ if (customer.phone) {
201
+ lines.push(` Phone: ${pii === 'masked' ? maskPhone(customer.phone) : customer.phone}`);
202
+ }
203
+ if (customer.companyName) {
204
+ lines.push(` Company: ${customer.companyName}`);
205
+ }
206
+ if (customer.taxNumber) {
207
+ lines.push(` Tax number: ${customer.taxNumber}`);
208
+ }
209
+ if (customer.birthDate) {
210
+ lines.push(` Birth date: ${customer.birthDate}`);
211
+ }
212
+ }
213
+ else {
214
+ lines.unshift(maskedId);
215
+ }
216
+ if (pii !== 'none' && customer.addresses?.length) {
217
+ lines.push('');
218
+ lines.push(`Addresses (${customer.addresses.length}):`);
219
+ for (const addr of customer.addresses) {
220
+ if (pii === 'masked') {
221
+ // City + country only
222
+ const addrStr = [addr.city, addr.country]
223
+ .filter(Boolean)
224
+ .join(', ');
225
+ lines.push(` [${addr.type}] ${addrStr || '(masked)'}`);
226
+ }
227
+ else {
228
+ const addrName = [addr.firstName, addr.lastName]
229
+ .filter(Boolean)
230
+ .join(' ');
231
+ const addrStr = [
232
+ addr.streetNumber,
233
+ addr.street,
234
+ addr.street2,
235
+ addr.city,
236
+ addr.state,
237
+ addr.postalCode,
238
+ addr.country,
239
+ ]
240
+ .filter(Boolean)
241
+ .join(', ');
242
+ lines.push(` [${addr.type}] ${addrName}`);
243
+ if (addrStr) {
244
+ lines.push(` ${addrStr}`);
245
+ }
246
+ if (addr.email) {
247
+ lines.push(` Email: ${addr.email}`);
248
+ }
249
+ if (addr.phone) {
250
+ lines.push(` Phone: ${addr.phone}`);
251
+ }
252
+ }
253
+ }
254
+ }
255
+ if (pii !== 'none') {
256
+ if (customer.externalReferences?.length) {
257
+ lines.push('');
258
+ lines.push('External references:');
259
+ for (const ref of customer.externalReferences) {
260
+ lines.push(` ${ref.key}: ${ref.value ?? ''}`);
261
+ }
262
+ }
263
+ if (customer.meta?.length) {
264
+ lines.push('');
265
+ lines.push('Meta:');
266
+ for (const m of customer.meta) {
267
+ lines.push(` ${m.key}: ${m.value ?? ''}`);
268
+ }
269
+ }
270
+ }
271
+ return {
272
+ content: [{ type: 'text', text: lines.join('\n') }],
273
+ };
274
+ },
275
+ },
276
+ ];
277
+ }
278
+ //# sourceMappingURL=customers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customers.js","sourceRoot":"","sources":["../../../src/tools/customers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Discovery API tools — browse shapes, introspect schema, search via browse.
3
+ *
4
+ * Uses the Discovery API's semantic browse queries where each shape
5
+ * is a top-level field with its own filters, pagination, and fields.
6
+ */
7
+ import type { CrystallizeClient } from '../client.js';
8
+ import type { ToolDefinition } from '../types.js';
9
+ export declare function discoveryTools(client: CrystallizeClient): ToolDefinition[];
10
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/tools/discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAqHlD,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,cAAc,EAAE,CA+N1E"}