@transcend-io/mcp-server-inventory 0.3.3 → 0.3.7

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.
package/README.md CHANGED
@@ -6,7 +6,7 @@ Transcend MCP Server for data inventory management. Provides tools for managing
6
6
 
7
7
  Requires **Node.js ≥ 22.12** (see `engines` in `package.json`).
8
8
 
9
- For local runs from this repository, copy [`secret.env.example`](../../../secret.env.example) to **`secret.env`** at the repo root (gitignored) and set your API key (see **Run from the monorepo**).
9
+ For local runs from this repository, copy [`secret.env.example`](../../../secret.env.example) to **`secret.env`** at the repo root (gitignored) and set your API key (see **Run from the monorepo**). The key must be created with **MCP** enabled in the Transcend dashboard (a toggle when you create the key).
10
10
 
11
11
  ## Install
12
12
 
package/dist/cli.mjs CHANGED
@@ -1,14 +1,15 @@
1
1
  #!/usr/bin/env node
2
- import { n as getInventoryTools, t as InventoryMixin } from "./graphql-0tHfKnDD.mjs";
2
+ import { n as getInventoryTools, t as InventoryMixin } from "./graphql-BgCMWmUd.mjs";
3
3
  import { TranscendRestClient, createMCPServer } from "@transcend-io/mcp-server-base";
4
4
  //#region src/cli.ts
5
5
  createMCPServer({
6
6
  name: "transcend-mcp-inventory",
7
7
  version: "1.0.0",
8
8
  getTools: getInventoryTools,
9
- createClients: (auth, sombraUrl, graphqlUrl) => ({
9
+ createClients: ({ auth, sombraUrl, graphqlUrl, dashboardUrl }) => ({
10
10
  rest: new TranscendRestClient(auth, sombraUrl),
11
- graphql: new InventoryMixin(auth, graphqlUrl)
11
+ graphql: new InventoryMixin(auth, graphqlUrl),
12
+ dashboardUrl
12
13
  })
13
14
  });
14
15
  //#endregion
package/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.mjs","names":[],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { createMCPServer, TranscendRestClient } from '@transcend-io/mcp-server-base';\n\nimport { InventoryMixin } from './graphql.js';\nimport { getInventoryTools } from './tools/index.js';\n\ncreateMCPServer({\n name: 'transcend-mcp-inventory',\n version: '1.0.0',\n getTools: getInventoryTools,\n createClients: (auth, sombraUrl, graphqlUrl) => ({\n rest: new TranscendRestClient(auth, sombraUrl),\n graphql: new InventoryMixin(auth, graphqlUrl),\n }),\n});\n"],"mappings":";;;;AAMA,gBAAgB;CACd,MAAM;CACN,SAAS;CACT,UAAU;CACV,gBAAgB,MAAM,WAAW,gBAAgB;EAC/C,MAAM,IAAI,oBAAoB,MAAM,UAAU;EAC9C,SAAS,IAAI,eAAe,MAAM,WAAW;EAC9C;CACF,CAAC"}
1
+ {"version":3,"file":"cli.mjs","names":[],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { createMCPServer, TranscendRestClient } from '@transcend-io/mcp-server-base';\n\nimport { InventoryMixin } from './graphql.js';\nimport { getInventoryTools } from './tools/index.js';\n\ncreateMCPServer({\n name: 'transcend-mcp-inventory',\n version: '1.0.0',\n getTools: getInventoryTools,\n createClients: ({ auth, sombraUrl, graphqlUrl, dashboardUrl }) => ({\n rest: new TranscendRestClient(auth, sombraUrl),\n graphql: new InventoryMixin(auth, graphqlUrl),\n dashboardUrl,\n }),\n});\n"],"mappings":";;;;AAMA,gBAAgB;CACd,MAAM;CACN,SAAS;CACT,UAAU;CACV,gBAAgB,EAAE,MAAM,WAAW,YAAY,oBAAoB;EACjE,MAAM,IAAI,oBAAoB,MAAM,UAAU;EAC9C,SAAS,IAAI,eAAe,MAAM,WAAW;EAC7C;EACD;CACF,CAAC"}
@@ -15,15 +15,16 @@ function createInventoryAnalyzeTool(clients) {
15
15
  zodSchema: EmptySchema,
16
16
  handler: async (_args) => {
17
17
  const [dataSilosResult, vendorsResult, identifiersResult, categoriesResult] = await Promise.all([
18
- graphql.listDataSilos({ first: 100 }),
19
- graphql.listVendors({ first: 100 }),
20
- graphql.listIdentifiers({ first: 100 }),
21
- graphql.listDataCategories({ first: 100 })
18
+ graphql.listDataSilos({ all: true }),
19
+ graphql.listVendors({ all: true }),
20
+ graphql.listIdentifiers({ all: true }),
21
+ graphql.listDataCategories({ all: true })
22
22
  ]);
23
23
  const dataSilos = dataSilosResult.nodes;
24
24
  const vendors = vendorsResult.nodes;
25
25
  const identifiers = identifiersResult.nodes;
26
26
  const categories = categoriesResult.nodes;
27
+ const totalCategories = categories.length;
27
28
  const liveDataSilos = dataSilos.filter((ds) => ds.isLive);
28
29
  return createToolResult(true, {
29
30
  summary: {
@@ -31,7 +32,7 @@ function createInventoryAnalyzeTool(clients) {
31
32
  liveDataSilos: liveDataSilos.length,
32
33
  totalVendors: vendors.length,
33
34
  totalIdentifiers: identifiers.length,
34
- totalCategories: categories.length
35
+ totalCategories
35
36
  },
36
37
  breakdown: {
37
38
  dataSilosByType: groupBy(dataSilos, "type"),
@@ -105,13 +106,13 @@ function createInventoryGetDataSiloTool(clients) {
105
106
  //#region src/tools/inventory_list_categories.ts
106
107
  const ListCategoriesSchema = z.object({
107
108
  limit: z.coerce.number().min(1).max(100).optional().default(50).describe("Results per page (1-100, default: 50)"),
108
- cursor: z.string().optional().describe("Pagination cursor from previous response (where supported)")
109
+ offset: z.coerce.number().min(0).optional().default(0).describe("Number of results to skip for pagination (default: 0)")
109
110
  });
110
111
  function createInventoryListCategoriesTool(clients) {
111
112
  const graphql = clients.graphql;
112
113
  return defineTool({
113
114
  name: "inventory_list_categories",
114
- description: "List all data categories (PII types) configured in your organization. Note: API does not support cursor pagination (max ~100 results).",
115
+ description: "List data categories (PII types) configured in your organization. Paginate with `offset` (increment by `limit`) until `hasNextPage` is false; `totalCount` is the full count.",
115
116
  category: "Data Inventory",
116
117
  readOnly: true,
117
118
  annotations: {
@@ -120,10 +121,10 @@ function createInventoryListCategoriesTool(clients) {
120
121
  idempotentHint: true
121
122
  },
122
123
  zodSchema: ListCategoriesSchema,
123
- handler: async ({ limit, cursor }) => {
124
+ handler: async ({ limit, offset }) => {
124
125
  const result = await graphql.listDataCategories({
125
126
  first: limit,
126
- after: cursor
127
+ offset
127
128
  });
128
129
  return createListResult(result.nodes, {
129
130
  totalCount: result.totalCount,
@@ -136,13 +137,13 @@ function createInventoryListCategoriesTool(clients) {
136
137
  //#region src/tools/inventory_list_data_points.ts
137
138
  const ListDataPointsSchema = z.object({
138
139
  limit: z.coerce.number().min(1).max(100).optional().default(50).describe("Results per page (1-100, default: 50)"),
139
- cursor: z.string().optional().describe("Pagination cursor from previous response (where supported)")
140
+ offset: z.coerce.number().min(0).optional().default(0).describe("Number of results to skip for pagination (default: 0)")
140
141
  });
141
142
  function createInventoryListDataPointsTool(clients) {
142
143
  const graphql = clients.graphql;
143
144
  return defineTool({
144
145
  name: "inventory_list_data_points",
145
- description: "List data points (collections of personal data). Note: API does not support cursor pagination or data_silo filtering (max ~100 results).",
146
+ description: "List data points (collections of personal data). Paginate with `offset` (increment by `limit`) until `hasNextPage` is false; `totalCount` is the full count. Note: data_silo filtering is not supported.",
146
147
  category: "Data Inventory",
147
148
  readOnly: true,
148
149
  annotations: {
@@ -151,10 +152,10 @@ function createInventoryListDataPointsTool(clients) {
151
152
  idempotentHint: true
152
153
  },
153
154
  zodSchema: ListDataPointsSchema,
154
- handler: async ({ limit, cursor }) => {
155
+ handler: async ({ limit, offset }) => {
155
156
  const result = await graphql.listDataPoints(void 0, {
156
157
  first: limit,
157
- after: cursor
158
+ offset
158
159
  });
159
160
  return createListResult(result.nodes, {
160
161
  totalCount: result.totalCount,
@@ -167,13 +168,13 @@ function createInventoryListDataPointsTool(clients) {
167
168
  //#region src/tools/inventory_list_data_silos.ts
168
169
  const ListDataSilosSchema = z.object({
169
170
  limit: z.coerce.number().min(1).max(100).optional().default(50).describe("Results per page (1-100, default: 50)"),
170
- cursor: z.string().optional().describe("Pagination cursor from previous response (where supported)")
171
+ offset: z.coerce.number().min(0).optional().default(0).describe("Number of results to skip for pagination (default: 0)")
171
172
  });
172
173
  function createInventoryListDataSilosTool(clients) {
173
174
  const graphql = clients.graphql;
174
175
  return defineTool({
175
176
  name: "inventory_list_data_silos",
176
- description: "List all data silos (data systems and integrations) in your organization. Note: API does not support cursor pagination (max ~100 results).",
177
+ description: "List data silos (data systems and integrations) in your organization. Paginate with `offset` (increment by `limit`) until `hasNextPage` is false, `totalCount` is the full count.",
177
178
  category: "Data Inventory",
178
179
  readOnly: true,
179
180
  annotations: {
@@ -182,10 +183,10 @@ function createInventoryListDataSilosTool(clients) {
182
183
  idempotentHint: true
183
184
  },
184
185
  zodSchema: ListDataSilosSchema,
185
- handler: async ({ limit, cursor }) => {
186
+ handler: async ({ limit, offset }) => {
186
187
  const result = await graphql.listDataSilos({
187
188
  first: limit,
188
- after: cursor
189
+ offset
189
190
  });
190
191
  return createListResult(result.nodes, {
191
192
  totalCount: result.totalCount,
@@ -198,13 +199,13 @@ function createInventoryListDataSilosTool(clients) {
198
199
  //#region src/tools/inventory_list_identifiers.ts
199
200
  const ListIdentifiersSchema = z.object({
200
201
  limit: z.coerce.number().min(1).max(100).optional().default(50).describe("Results per page (1-100, default: 50)"),
201
- cursor: z.string().optional().describe("Pagination cursor from previous response (where supported)")
202
+ offset: z.coerce.number().min(0).optional().default(0).describe("Number of results to skip for pagination (default: 0)")
202
203
  });
203
204
  function createInventoryListIdentifiersTool(clients) {
204
205
  const graphql = clients.graphql;
205
206
  return defineTool({
206
207
  name: "inventory_list_identifiers",
207
- description: "List all identifier types (email, user ID, etc.) configured in your organization. Note: API does not support cursor pagination (max ~100 results).",
208
+ description: "List identifier types (email, user ID, etc.) configured in your organization. Paginate with `offset` (increment by `limit`) until `hasNextPage` is false; `totalCount` is the full count.",
208
209
  category: "Data Inventory",
209
210
  readOnly: true,
210
211
  annotations: {
@@ -213,10 +214,10 @@ function createInventoryListIdentifiersTool(clients) {
213
214
  idempotentHint: true
214
215
  },
215
216
  zodSchema: ListIdentifiersSchema,
216
- handler: async ({ limit, cursor }) => {
217
+ handler: async ({ limit, offset }) => {
217
218
  const result = await graphql.listIdentifiers({
218
219
  first: limit,
219
- after: cursor
220
+ offset
220
221
  });
221
222
  return createListResult(result.nodes, {
222
223
  totalCount: result.totalCount,
@@ -261,13 +262,13 @@ function createInventoryListSubDataPointsTool(clients) {
261
262
  //#region src/tools/inventory_list_vendors.ts
262
263
  const ListVendorsSchema = z.object({
263
264
  limit: z.coerce.number().min(1).max(100).optional().default(50).describe("Results per page (1-100, default: 50)"),
264
- cursor: z.string().optional().describe("Pagination cursor from previous response (where supported)")
265
+ offset: z.coerce.number().min(0).optional().default(0).describe("Number of results to skip for pagination (default: 0)")
265
266
  });
266
267
  function createInventoryListVendorsTool(clients) {
267
268
  const graphql = clients.graphql;
268
269
  return defineTool({
269
270
  name: "inventory_list_vendors",
270
- description: "List all vendors (third-party data processors) in your organization. Note: API does not support cursor pagination (max ~100 results).",
271
+ description: "List vendors (third-party data processors) in your organization. Paginate with `offset` (increment by `limit`) until `hasNextPage` is false; `totalCount` is the full count.",
271
272
  category: "Data Inventory",
272
273
  readOnly: true,
273
274
  annotations: {
@@ -276,10 +277,10 @@ function createInventoryListVendorsTool(clients) {
276
277
  idempotentHint: true
277
278
  },
278
279
  zodSchema: ListVendorsSchema,
279
- handler: async ({ limit, cursor }) => {
280
+ handler: async ({ limit, offset }) => {
280
281
  const result = await graphql.listVendors({
281
282
  first: limit,
282
- after: cursor
283
+ offset
283
284
  });
284
285
  return createListResult(result.nodes, {
285
286
  totalCount: result.totalCount,
@@ -341,26 +342,20 @@ function getInventoryTools(clients) {
341
342
  //#region src/graphql.ts
342
343
  var InventoryMixin = class extends TranscendGraphQLBase {
343
344
  async listDataSilos(options) {
344
- const data = await this.makeRequest(`
345
- query ListDataSilos($first: Int) {
346
- dataSilos(first: $first) {
345
+ return this.listConnection(`
346
+ query ListDataSilos($first: Int, $offset: Int) {
347
+ dataSilos(first: $first, offset: $offset) {
347
348
  nodes {
348
349
  id
349
350
  title
350
351
  type
352
+ isLive
353
+ outerType
351
354
  }
352
355
  totalCount
353
356
  }
354
357
  }
355
- `, { first: Math.min(options?.first || 100, 100) });
356
- return {
357
- nodes: data.dataSilos.nodes,
358
- pageInfo: {
359
- hasNextPage: data.dataSilos.nodes.length < data.dataSilos.totalCount,
360
- hasPreviousPage: false
361
- },
362
- totalCount: data.dataSilos.totalCount
363
- };
358
+ `, "dataSilos", options);
364
359
  }
365
360
  async getDataSilo(id) {
366
361
  return (await this.makeRequest(`
@@ -425,9 +420,9 @@ var InventoryMixin = class extends TranscendGraphQLBase {
425
420
  return updated;
426
421
  }
427
422
  async listVendors(options) {
428
- const data = await this.makeRequest(`
429
- query ListVendors($first: Int) {
430
- vendors(first: $first) {
423
+ return this.listConnection(`
424
+ query ListVendors($first: Int, $offset: Int) {
425
+ vendors(first: $first, offset: $offset) {
431
426
  nodes {
432
427
  id
433
428
  title
@@ -435,20 +430,12 @@ var InventoryMixin = class extends TranscendGraphQLBase {
435
430
  totalCount
436
431
  }
437
432
  }
438
- `, { first: Math.min(options?.first || 100, 100) });
439
- return {
440
- nodes: data.vendors.nodes,
441
- pageInfo: {
442
- hasNextPage: data.vendors.nodes.length < data.vendors.totalCount,
443
- hasPreviousPage: false
444
- },
445
- totalCount: data.vendors.totalCount
446
- };
433
+ `, "vendors", options);
447
434
  }
448
435
  async listDataPoints(_dataSiloId, options) {
449
- const data = await this.makeRequest(`
450
- query ListDataPoints($first: Int) {
451
- dataPoints(first: $first) {
436
+ const query = `
437
+ query ListDataPoints($first: Int, $offset: Int) {
438
+ dataPoints(first: $first, offset: $offset) {
452
439
  nodes {
453
440
  id
454
441
  name
@@ -462,26 +449,19 @@ var InventoryMixin = class extends TranscendGraphQLBase {
462
449
  totalCount
463
450
  }
464
451
  }
465
- `, { first: Math.min(options?.first || 100, 100) });
466
- const points = data.dataPoints.nodes.map((dp) => ({
452
+ `;
453
+ const toDataPoint = (dp) => ({
467
454
  id: dp.id,
468
455
  name: dp.name,
469
456
  title: dp.title?.defaultMessage,
470
457
  description: dp.description?.defaultMessage,
471
458
  createdAt: (/* @__PURE__ */ new Date()).toISOString(),
472
459
  updatedAt: (/* @__PURE__ */ new Date()).toISOString()
473
- }));
474
- return {
475
- nodes: points,
476
- pageInfo: {
477
- hasNextPage: points.length < data.dataPoints.totalCount,
478
- hasPreviousPage: false
479
- },
480
- totalCount: data.dataPoints.totalCount
481
- };
460
+ });
461
+ return this.listConnection(query, "dataPoints", options, { mapNode: toDataPoint });
482
462
  }
483
463
  async listSubDataPoints(dataPointId, options) {
484
- const data = await this.makeRequest(`
464
+ return this.listConnection(`
485
465
  query ListSubDataPoints($first: Int, $offset: Int, $filterBy: SubDataPointFiltersInput) {
486
466
  subDataPoints(first: $first, offset: $offset, filterBy: $filterBy) {
487
467
  nodes {
@@ -493,46 +473,27 @@ var InventoryMixin = class extends TranscendGraphQLBase {
493
473
  totalCount
494
474
  }
495
475
  }
496
- `, {
497
- first: Math.min(options?.first || 100, 100),
498
- offset: options?.offset || 0,
499
- filterBy: { dataPoints: [dataPointId] }
500
- });
501
- return {
502
- nodes: data.subDataPoints.nodes,
503
- pageInfo: {
504
- hasNextPage: data.subDataPoints.nodes.length < data.subDataPoints.totalCount,
505
- hasPreviousPage: false
506
- },
507
- totalCount: data.subDataPoints.totalCount
508
- };
476
+ `, "subDataPoints", options, { variables: { filterBy: { dataPoints: [dataPointId] } } });
509
477
  }
510
478
  async listIdentifiers(options) {
511
- const data = await this.makeRequest(`
512
- query ListIdentifiers($first: Int) {
513
- identifiers(first: $first) {
479
+ return this.listConnection(`
480
+ query ListIdentifiers($first: Int, $offset: Int) {
481
+ identifiers(first: $first, offset: $offset) {
514
482
  nodes {
515
483
  id
516
484
  name
517
485
  type
486
+ isRequiredInForm
518
487
  }
519
488
  totalCount
520
489
  }
521
490
  }
522
- `, { first: Math.min(options?.first || 100, 100) });
523
- return {
524
- nodes: data.identifiers.nodes,
525
- pageInfo: {
526
- hasNextPage: data.identifiers.nodes.length < data.identifiers.totalCount,
527
- hasPreviousPage: false
528
- },
529
- totalCount: data.identifiers.totalCount
530
- };
491
+ `, "identifiers", options);
531
492
  }
532
493
  async listDataCategories(options) {
533
- const data = await this.makeRequest(`
534
- query ListDataCategories($first: Int) {
535
- dataCategories(first: $first) {
494
+ return this.listConnection(`
495
+ query ListDataCategories($first: Int, $offset: Int) {
496
+ dataCategories(first: $first, offset: $offset) {
536
497
  nodes {
537
498
  name
538
499
  category
@@ -540,18 +501,10 @@ var InventoryMixin = class extends TranscendGraphQLBase {
540
501
  totalCount
541
502
  }
542
503
  }
543
- `, { first: Math.min(options?.first || 100, 100) });
544
- return {
545
- nodes: data.dataCategories.nodes,
546
- pageInfo: {
547
- hasNextPage: data.dataCategories.nodes.length < data.dataCategories.totalCount,
548
- hasPreviousPage: false
549
- },
550
- totalCount: data.dataCategories.totalCount
551
- };
504
+ `, "dataCategories", options);
552
505
  }
553
506
  };
554
507
  //#endregion
555
508
  export { ListSubDataPointsSchema as a, ListDataPointsSchema as c, CreateDataSiloSchema as d, ListVendorsSchema as i, ListCategoriesSchema as l, getInventoryTools as n, ListIdentifiersSchema as o, UpdateDataSiloSchema as r, ListDataSilosSchema as s, InventoryMixin as t, GetDataSiloSchema as u };
556
509
 
557
- //# sourceMappingURL=graphql-0tHfKnDD.mjs.map
510
+ //# sourceMappingURL=graphql-BgCMWmUd.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql-BgCMWmUd.mjs","names":[],"sources":["../src/tools/inventory_analyze.ts","../src/tools/inventory_create_data_silo.ts","../src/tools/inventory_get_data_silo.ts","../src/tools/inventory_list_categories.ts","../src/tools/inventory_list_data_points.ts","../src/tools/inventory_list_data_silos.ts","../src/tools/inventory_list_identifiers.ts","../src/tools/inventory_list_sub_data_points.ts","../src/tools/inventory_list_vendors.ts","../src/tools/inventory_update_data_silo.ts","../src/tools/index.ts","../src/graphql.ts"],"sourcesContent":["import {\n createToolResult,\n defineTool,\n EmptySchema,\n groupBy,\n type ToolClients,\n} from '@transcend-io/mcp-server-base';\n\nimport type { InventoryMixin } from '../graphql.js';\n\nexport function createInventoryAnalyzeTool(clients: ToolClients) {\n const graphql = clients.graphql as InventoryMixin;\n return defineTool({\n name: 'inventory_analyze',\n description:\n 'Analyze your data inventory including data silos by type, vendor distribution, and data point coverage',\n category: 'Data Inventory',\n readOnly: true,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },\n zodSchema: EmptySchema,\n handler: async (_args) => {\n // `all: true` fully paginates each entity so the reported totals and\n // breakdowns are accurate for orgs with >100 of any.\n const [dataSilosResult, vendorsResult, identifiersResult, categoriesResult] =\n await Promise.all([\n graphql.listDataSilos({ all: true }),\n graphql.listVendors({ all: true }),\n graphql.listIdentifiers({ all: true }),\n graphql.listDataCategories({ all: true }),\n ]);\n\n const dataSilos = dataSilosResult.nodes;\n const vendors = vendorsResult.nodes;\n const identifiers = identifiersResult.nodes;\n const categories = categoriesResult.nodes;\n const totalCategories = categories.length;\n\n const liveDataSilos = dataSilos.filter((ds) => ds.isLive);\n\n return createToolResult(true, {\n summary: {\n totalDataSilos: dataSilos.length,\n liveDataSilos: liveDataSilos.length,\n totalVendors: vendors.length,\n totalIdentifiers: identifiers.length,\n totalCategories,\n },\n breakdown: {\n dataSilosByType: groupBy(dataSilos, 'type'),\n dataSilosByOuterType: groupBy(\n dataSilos.filter((ds) => ds.outerType),\n 'outerType' as keyof (typeof dataSilos)[0],\n ),\n },\n topIdentifiers: identifiers.slice(0, 10).map((id) => ({\n name: id.name,\n type: id.type,\n isRequired: id.isRequiredInForm,\n })),\n topCategories: categories.slice(0, 10).map((cat) => ({\n name: cat.name,\n category: cat.category,\n })),\n recommendations: [\n dataSilos.length === 0 ? 'Add data silos to map your data landscape' : null,\n liveDataSilos.length < dataSilos.length\n ? `${dataSilos.length - liveDataSilos.length} data silos are not live - consider activating them`\n : null,\n vendors.length === 0 ? 'Add vendors to track third-party data processors' : null,\n ].filter(Boolean),\n });\n },\n });\n}\n","import { createToolResult, defineTool, z, type ToolClients } from '@transcend-io/mcp-server-base';\n\nimport type { InventoryMixin } from '../graphql.js';\n\nexport const CreateDataSiloSchema = z.object({\n title: z\n .string()\n .describe(\n 'Name/title of the data silo (must match an integrationName in the Transcend catalog, e.g. \"Salesforce\", \"Stripe\")',\n ),\n});\nexport type CreateDataSiloInput = z.infer<typeof CreateDataSiloSchema>;\n\nexport function createInventoryCreateDataSiloTool(clients: ToolClients) {\n const graphql = clients.graphql as InventoryMixin;\n return defineTool({\n name: 'inventory_create_data_silo',\n description:\n 'Create a new data silo (data system or integration). The name must match an integration name from the Transcend catalog.',\n category: 'Data Inventory',\n readOnly: false,\n confirmationHint: 'Creates a new data silo in the inventory',\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false },\n zodSchema: CreateDataSiloSchema,\n handler: async ({ title }) => {\n const result = await graphql.createDataSilo({\n name: title,\n });\n return createToolResult(true, {\n dataSilo: result,\n message: `Data silo \"${title}\" created successfully`,\n });\n },\n });\n}\n","import { createToolResult, defineTool, z, type ToolClients } from '@transcend-io/mcp-server-base';\n\nimport type { InventoryMixin } from '../graphql.js';\n\nexport const GetDataSiloSchema = z.object({\n data_silo_id: z.string().describe('ID of the data silo to retrieve'),\n});\nexport type GetDataSiloInput = z.infer<typeof GetDataSiloSchema>;\n\nexport function createInventoryGetDataSiloTool(clients: ToolClients) {\n const graphql = clients.graphql as InventoryMixin;\n return defineTool({\n name: 'inventory_get_data_silo',\n description:\n 'Get detailed information about a specific data silo including its data points and identifiers',\n category: 'Data Inventory',\n readOnly: true,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },\n zodSchema: GetDataSiloSchema,\n handler: async ({ data_silo_id }) => {\n const result = await graphql.getDataSilo(data_silo_id);\n return createToolResult(true, result);\n },\n });\n}\n","import { createListResult, defineTool, z, type ToolClients } from '@transcend-io/mcp-server-base';\n\nimport type { InventoryMixin } from '../graphql.js';\n\nexport const ListCategoriesSchema = z.object({\n limit: z.coerce\n .number()\n .min(1)\n .max(100)\n .optional()\n .default(50)\n .describe('Results per page (1-100, default: 50)'),\n offset: z.coerce\n .number()\n .min(0)\n .optional()\n .default(0)\n .describe('Number of results to skip for pagination (default: 0)'),\n});\nexport type ListCategoriesInput = z.infer<typeof ListCategoriesSchema>;\n\nexport function createInventoryListCategoriesTool(clients: ToolClients) {\n const graphql = clients.graphql as InventoryMixin;\n return defineTool({\n name: 'inventory_list_categories',\n description:\n 'List data categories (PII types) configured in your organization. Paginate with `offset` (increment by `limit`) until `hasNextPage` is false; `totalCount` is the full count.',\n category: 'Data Inventory',\n readOnly: true,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },\n zodSchema: ListCategoriesSchema,\n handler: async ({ limit, offset }) => {\n const result = await graphql.listDataCategories({\n first: limit,\n offset,\n });\n\n return createListResult(result.nodes, {\n totalCount: result.totalCount,\n hasNextPage: result.pageInfo?.hasNextPage,\n });\n },\n });\n}\n","import { createListResult, defineTool, z, type ToolClients } from '@transcend-io/mcp-server-base';\n\nimport type { InventoryMixin } from '../graphql.js';\n\nexport const ListDataPointsSchema = z.object({\n limit: z.coerce\n .number()\n .min(1)\n .max(100)\n .optional()\n .default(50)\n .describe('Results per page (1-100, default: 50)'),\n offset: z.coerce\n .number()\n .min(0)\n .optional()\n .default(0)\n .describe('Number of results to skip for pagination (default: 0)'),\n});\nexport type ListDataPointsInput = z.infer<typeof ListDataPointsSchema>;\n\nexport function createInventoryListDataPointsTool(clients: ToolClients) {\n const graphql = clients.graphql as InventoryMixin;\n return defineTool({\n name: 'inventory_list_data_points',\n description:\n 'List data points (collections of personal data). Paginate with `offset` (increment by `limit`) until `hasNextPage` is false; `totalCount` is the full count. Note: data_silo filtering is not supported.',\n category: 'Data Inventory',\n readOnly: true,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },\n zodSchema: ListDataPointsSchema,\n handler: async ({ limit, offset }) => {\n const result = await graphql.listDataPoints(\n undefined, // dataSiloId not supported by API\n {\n first: limit,\n offset,\n },\n );\n\n return createListResult(result.nodes, {\n totalCount: result.totalCount,\n hasNextPage: result.pageInfo?.hasNextPage,\n });\n },\n });\n}\n","import { createListResult, defineTool, z, type ToolClients } from '@transcend-io/mcp-server-base';\n\nimport type { InventoryMixin } from '../graphql.js';\n\nexport const ListDataSilosSchema = z.object({\n limit: z.coerce\n .number()\n .min(1)\n .max(100)\n .optional()\n .default(50)\n .describe('Results per page (1-100, default: 50)'),\n offset: z.coerce\n .number()\n .min(0)\n .optional()\n .default(0)\n .describe('Number of results to skip for pagination (default: 0)'),\n});\nexport type ListDataSilosInput = z.infer<typeof ListDataSilosSchema>;\n\nexport function createInventoryListDataSilosTool(clients: ToolClients) {\n const graphql = clients.graphql as InventoryMixin;\n return defineTool({\n name: 'inventory_list_data_silos',\n description:\n 'List data silos (data systems and integrations) in your organization. Paginate with `offset` (increment by `limit`) until `hasNextPage` is false, `totalCount` is the full count.',\n category: 'Data Inventory',\n readOnly: true,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },\n zodSchema: ListDataSilosSchema,\n handler: async ({ limit, offset }) => {\n const result = await graphql.listDataSilos({\n first: limit,\n offset,\n });\n\n return createListResult(result.nodes, {\n totalCount: result.totalCount,\n hasNextPage: result.pageInfo?.hasNextPage,\n });\n },\n });\n}\n","import { createListResult, defineTool, z, type ToolClients } from '@transcend-io/mcp-server-base';\n\nimport type { InventoryMixin } from '../graphql.js';\n\nexport const ListIdentifiersSchema = z.object({\n limit: z.coerce\n .number()\n .min(1)\n .max(100)\n .optional()\n .default(50)\n .describe('Results per page (1-100, default: 50)'),\n offset: z.coerce\n .number()\n .min(0)\n .optional()\n .default(0)\n .describe('Number of results to skip for pagination (default: 0)'),\n});\nexport type ListIdentifiersInput = z.infer<typeof ListIdentifiersSchema>;\n\nexport function createInventoryListIdentifiersTool(clients: ToolClients) {\n const graphql = clients.graphql as InventoryMixin;\n return defineTool({\n name: 'inventory_list_identifiers',\n description:\n 'List identifier types (email, user ID, etc.) configured in your organization. Paginate with `offset` (increment by `limit`) until `hasNextPage` is false; `totalCount` is the full count.',\n category: 'Data Inventory',\n readOnly: true,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },\n zodSchema: ListIdentifiersSchema,\n handler: async ({ limit, offset }) => {\n const result = await graphql.listIdentifiers({\n first: limit,\n offset,\n });\n\n return createListResult(result.nodes, {\n totalCount: result.totalCount,\n hasNextPage: result.pageInfo?.hasNextPage,\n });\n },\n });\n}\n","import { createListResult, defineTool, z, type ToolClients } from '@transcend-io/mcp-server-base';\n\nimport type { InventoryMixin } from '../graphql.js';\n\nexport const ListSubDataPointsSchema = z.object({\n data_point_id: z.string().describe('ID of the parent data point'),\n limit: z.coerce\n .number()\n .min(1)\n .max(100)\n .optional()\n .default(50)\n .describe('Results per page (1-100, default: 50)'),\n offset: z.coerce\n .number()\n .min(0)\n .optional()\n .default(0)\n .describe('Number of results to skip (default: 0)'),\n});\nexport type ListSubDataPointsInput = z.infer<typeof ListSubDataPointsSchema>;\n\nexport function createInventoryListSubDataPointsTool(clients: ToolClients) {\n const graphql = clients.graphql as InventoryMixin;\n return defineTool({\n name: 'inventory_list_sub_data_points',\n description:\n 'List sub-data points (individual data fields) for a specific data point. Note: This feature may have limited availability.',\n category: 'Data Inventory',\n readOnly: true,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },\n zodSchema: ListSubDataPointsSchema,\n handler: async ({ data_point_id, limit, offset }) => {\n const result = await graphql.listSubDataPoints(data_point_id, {\n first: limit,\n offset,\n });\n\n return createListResult(result.nodes, {\n totalCount: result.totalCount,\n hasNextPage: result.pageInfo?.hasNextPage,\n });\n },\n });\n}\n","import { createListResult, defineTool, z, type ToolClients } from '@transcend-io/mcp-server-base';\n\nimport type { InventoryMixin } from '../graphql.js';\n\nexport const ListVendorsSchema = z.object({\n limit: z.coerce\n .number()\n .min(1)\n .max(100)\n .optional()\n .default(50)\n .describe('Results per page (1-100, default: 50)'),\n offset: z.coerce\n .number()\n .min(0)\n .optional()\n .default(0)\n .describe('Number of results to skip for pagination (default: 0)'),\n});\nexport type ListVendorsInput = z.infer<typeof ListVendorsSchema>;\n\nexport function createInventoryListVendorsTool(clients: ToolClients) {\n const graphql = clients.graphql as InventoryMixin;\n return defineTool({\n name: 'inventory_list_vendors',\n description:\n 'List vendors (third-party data processors) in your organization. Paginate with `offset` (increment by `limit`) until `hasNextPage` is false; `totalCount` is the full count.',\n category: 'Data Inventory',\n readOnly: true,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },\n zodSchema: ListVendorsSchema,\n handler: async ({ limit, offset }) => {\n const result = await graphql.listVendors({\n first: limit,\n offset,\n });\n\n return createListResult(result.nodes, {\n totalCount: result.totalCount,\n hasNextPage: result.pageInfo?.hasNextPage,\n });\n },\n });\n}\n","import { createToolResult, defineTool, z, type ToolClients } from '@transcend-io/mcp-server-base';\n\nimport type { InventoryMixin } from '../graphql.js';\n\nexport const UpdateDataSiloSchema = z.object({\n data_silo_id: z.string().describe('ID of the data silo to update'),\n title: z.string().optional().describe('New title for the data silo'),\n description: z.string().optional().describe('New description'),\n});\nexport type UpdateDataSiloInput = z.infer<typeof UpdateDataSiloSchema>;\n\nexport function createInventoryUpdateDataSiloTool(clients: ToolClients) {\n const graphql = clients.graphql as InventoryMixin;\n return defineTool({\n name: 'inventory_update_data_silo',\n description: 'Update an existing data silo',\n category: 'Data Inventory',\n readOnly: false,\n confirmationHint: 'Updates the data silo configuration',\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },\n zodSchema: UpdateDataSiloSchema,\n handler: async ({ data_silo_id, title, description }) => {\n const result = await graphql.updateDataSilo({\n id: data_silo_id,\n title,\n description,\n });\n return createToolResult(true, {\n dataSilo: result,\n message: 'Data silo updated successfully',\n });\n },\n });\n}\n","import type { ToolDefinition, ToolClients } from '@transcend-io/mcp-server-base';\n\nimport { createInventoryAnalyzeTool } from './inventory_analyze.js';\nimport { createInventoryCreateDataSiloTool } from './inventory_create_data_silo.js';\nimport { createInventoryGetDataSiloTool } from './inventory_get_data_silo.js';\nimport { createInventoryListCategoriesTool } from './inventory_list_categories.js';\nimport { createInventoryListDataPointsTool } from './inventory_list_data_points.js';\nimport { createInventoryListDataSilosTool } from './inventory_list_data_silos.js';\nimport { createInventoryListIdentifiersTool } from './inventory_list_identifiers.js';\nimport { createInventoryListSubDataPointsTool } from './inventory_list_sub_data_points.js';\nimport { createInventoryListVendorsTool } from './inventory_list_vendors.js';\nimport { createInventoryUpdateDataSiloTool } from './inventory_update_data_silo.js';\n\nexport function getInventoryTools(clients: ToolClients): ToolDefinition[] {\n return [\n createInventoryListDataSilosTool(clients),\n createInventoryGetDataSiloTool(clients),\n createInventoryCreateDataSiloTool(clients),\n createInventoryUpdateDataSiloTool(clients),\n createInventoryListVendorsTool(clients),\n createInventoryListDataPointsTool(clients),\n createInventoryListSubDataPointsTool(clients),\n createInventoryListIdentifiersTool(clients),\n createInventoryListCategoriesTool(clients),\n createInventoryAnalyzeTool(clients),\n ];\n}\n","import {\n TranscendGraphQLBase,\n type DataCategory,\n type DataPoint,\n type DataSilo,\n type DataSiloCreateInput,\n type DataSiloDetails,\n type DataSiloUpdateInput,\n type Identifier,\n type ListOptions,\n type PaginatedResponse,\n type SubDataPoint,\n type Vendor,\n} from '@transcend-io/mcp-server-base';\n\nexport class InventoryMixin extends TranscendGraphQLBase {\n async listDataSilos(options?: ListOptions): Promise<PaginatedResponse<DataSilo>> {\n const query = `\n query ListDataSilos($first: Int, $offset: Int) {\n dataSilos(first: $first, offset: $offset) {\n nodes {\n id\n title\n type\n isLive\n outerType\n }\n totalCount\n }\n }\n `;\n return this.listConnection<DataSilo>(query, 'dataSilos', options);\n }\n\n async getDataSilo(id: string): Promise<DataSiloDetails> {\n const query = `\n query GetDataSilo($id: String!) {\n dataSilo(id: $id) {\n id\n title\n type\n description\n link\n isLive\n outerType\n createdAt\n connectionState\n identifiers {\n id\n name\n type\n isRequiredInForm\n }\n }\n }\n `;\n const data = await this.makeRequest<{ dataSilo: DataSiloDetails }>(query, { id });\n return data.dataSilo;\n }\n\n async createDataSilo(input: DataSiloCreateInput): Promise<DataSilo> {\n const mutation = `\n mutation CreateDataSilos($input: [CreateDataSilosInput!]!) {\n createDataSilos(input: $input) {\n dataSilos {\n id\n title\n type\n description\n isLive\n createdAt\n }\n }\n }\n `;\n const data = await this.makeRequest<{ createDataSilos: { dataSilos: DataSilo[] } }>(mutation, {\n input: [input],\n });\n const created = data.createDataSilos.dataSilos[0];\n if (!created) throw new Error('createDataSilos returned an empty array');\n return created;\n }\n\n async updateDataSilo(input: DataSiloUpdateInput): Promise<DataSilo> {\n const mutation = `\n mutation UpdateDataSilos($input: UpdateDataSilosInput!) {\n updateDataSilos(input: $input) {\n dataSilos {\n id\n title\n type\n description\n isLive\n createdAt\n updatedAt\n }\n }\n }\n `;\n const wrappedInput = { dataSilos: [input] };\n const data = await this.makeRequest<{ updateDataSilos: { dataSilos: DataSilo[] } }>(mutation, {\n input: wrappedInput,\n });\n const updated = data.updateDataSilos.dataSilos[0];\n if (!updated) throw new Error('updateDataSilos returned an empty array');\n return updated;\n }\n\n async listVendors(options?: ListOptions): Promise<PaginatedResponse<Vendor>> {\n const query = `\n query ListVendors($first: Int, $offset: Int) {\n vendors(first: $first, offset: $offset) {\n nodes {\n id\n title\n }\n totalCount\n }\n }\n `;\n return this.listConnection<Vendor>(query, 'vendors', options);\n }\n\n async listDataPoints(\n _dataSiloId?: string,\n options?: ListOptions,\n ): Promise<PaginatedResponse<DataPoint>> {\n const query = `\n query ListDataPoints($first: Int, $offset: Int) {\n dataPoints(first: $first, offset: $offset) {\n nodes {\n id\n name\n title {\n defaultMessage\n }\n description {\n defaultMessage\n }\n }\n totalCount\n }\n }\n `;\n type RawDataPoint = {\n id: string;\n name: string;\n title: { defaultMessage: string };\n description: { defaultMessage: string } | null;\n };\n const toDataPoint = (dp: RawDataPoint): DataPoint => ({\n id: dp.id,\n name: dp.name,\n title: dp.title?.defaultMessage,\n description: dp.description?.defaultMessage,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n });\n return this.listConnection<RawDataPoint, DataPoint>(query, 'dataPoints', options, {\n mapNode: toDataPoint,\n });\n }\n\n async listSubDataPoints(\n dataPointId: string,\n options?: ListOptions,\n ): Promise<PaginatedResponse<SubDataPoint>> {\n const query = `\n query ListSubDataPoints($first: Int, $offset: Int, $filterBy: SubDataPointFiltersInput) {\n subDataPoints(first: $first, offset: $offset, filterBy: $filterBy) {\n nodes {\n id\n name\n description\n accessRequestVisibilityEnabled\n }\n totalCount\n }\n }\n `;\n return this.listConnection<SubDataPoint>(query, 'subDataPoints', options, {\n variables: { filterBy: { dataPoints: [dataPointId] } },\n });\n }\n\n async listIdentifiers(options?: ListOptions): Promise<PaginatedResponse<Identifier>> {\n const query = `\n query ListIdentifiers($first: Int, $offset: Int) {\n identifiers(first: $first, offset: $offset) {\n nodes {\n id\n name\n type\n isRequiredInForm\n }\n totalCount\n }\n }\n `;\n return this.listConnection<Identifier>(query, 'identifiers', options);\n }\n\n async listDataCategories(options?: ListOptions): Promise<PaginatedResponse<DataCategory>> {\n const query = `\n query ListDataCategories($first: Int, $offset: Int) {\n dataCategories(first: $first, offset: $offset) {\n nodes {\n name\n category\n }\n totalCount\n }\n }\n `;\n return this.listConnection<DataCategory>(query, 'dataCategories', options);\n }\n}\n"],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -31,28 +31,28 @@ type GetDataSiloInput = z.infer<typeof GetDataSiloSchema>;
31
31
  //#region src/tools/inventory_list_categories.d.ts
32
32
  declare const ListCategoriesSchema: z.ZodObject<{
33
33
  limit: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
34
- cursor: z.ZodOptional<z.ZodString>;
34
+ offset: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
35
35
  }, z.core.$strip>;
36
36
  type ListCategoriesInput = z.infer<typeof ListCategoriesSchema>;
37
37
  //#endregion
38
38
  //#region src/tools/inventory_list_data_points.d.ts
39
39
  declare const ListDataPointsSchema: z.ZodObject<{
40
40
  limit: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
41
- cursor: z.ZodOptional<z.ZodString>;
41
+ offset: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
42
42
  }, z.core.$strip>;
43
43
  type ListDataPointsInput = z.infer<typeof ListDataPointsSchema>;
44
44
  //#endregion
45
45
  //#region src/tools/inventory_list_data_silos.d.ts
46
46
  declare const ListDataSilosSchema: z.ZodObject<{
47
47
  limit: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
48
- cursor: z.ZodOptional<z.ZodString>;
48
+ offset: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
49
49
  }, z.core.$strip>;
50
50
  type ListDataSilosInput = z.infer<typeof ListDataSilosSchema>;
51
51
  //#endregion
52
52
  //#region src/tools/inventory_list_identifiers.d.ts
53
53
  declare const ListIdentifiersSchema: z.ZodObject<{
54
54
  limit: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
55
- cursor: z.ZodOptional<z.ZodString>;
55
+ offset: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
56
56
  }, z.core.$strip>;
57
57
  type ListIdentifiersInput = z.infer<typeof ListIdentifiersSchema>;
58
58
  //#endregion
@@ -67,7 +67,7 @@ type ListSubDataPointsInput = z.infer<typeof ListSubDataPointsSchema>;
67
67
  //#region src/tools/inventory_list_vendors.d.ts
68
68
  declare const ListVendorsSchema: z.ZodObject<{
69
69
  limit: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
70
- cursor: z.ZodOptional<z.ZodString>;
70
+ offset: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
71
71
  }, z.core.$strip>;
72
72
  type ListVendorsInput = z.infer<typeof ListVendorsSchema>;
73
73
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/tools/index.ts","../src/graphql.ts","../src/tools/inventory_create_data_silo.ts","../src/tools/inventory_get_data_silo.ts","../src/tools/inventory_list_categories.ts","../src/tools/inventory_list_data_points.ts","../src/tools/inventory_list_data_silos.ts","../src/tools/inventory_list_identifiers.ts","../src/tools/inventory_list_sub_data_points.ts","../src/tools/inventory_list_vendors.ts","../src/tools/inventory_update_data_silo.ts"],"mappings":";;;iBAagB,iBAAA,CAAkB,OAAA,EAAS,WAAA,GAAc,cAAA;;;cCE5C,cAAA,SAAuB,oBAAA;EAC5B,aAAA,CAAc,OAAA,GAAU,WAAA,GAAc,OAAA,CAAQ,iBAAA,CAAkB,QAAA;EA2BhE,WAAA,CAAY,EAAA,WAAa,OAAA,CAAQ,eAAA;EA0BjC,cAAA,CAAe,KAAA,EAAO,mBAAA,GAAsB,OAAA,CAAQ,QAAA;EAuBpD,cAAA,CAAe,KAAA,EAAO,mBAAA,GAAsB,OAAA,CAAQ,QAAA;EAyBpD,WAAA,CAAY,OAAA,GAAU,WAAA,GAAc,OAAA,CAAQ,iBAAA,CAAkB,MAAA;EA0B9D,cAAA,CACJ,WAAA,WACA,OAAA,GAAU,WAAA,GACT,OAAA,CAAQ,iBAAA,CAAkB,SAAA;EA4CvB,iBAAA,CACJ,WAAA,UACA,OAAA,GAAU,WAAA,GACT,OAAA,CAAQ,iBAAA,CAAkB,YAAA;EA+BvB,eAAA,CAAgB,OAAA,GAAU,WAAA,GAAc,OAAA,CAAQ,iBAAA,CAAkB,UAAA;EA0BlE,kBAAA,CAAmB,OAAA,GAAU,WAAA,GAAc,OAAA,CAAQ,iBAAA,CAAkB,YAAA;AAAA;;;cCtPhE,oBAAA,EAAoB,CAAA,CAAA,SAAA;;;KAOrB,mBAAA,GAAsB,CAAA,CAAE,KAAA,QAAa,oBAAA;;;cCPpC,iBAAA,EAAiB,CAAA,CAAA,SAAA;;;KAGlB,gBAAA,GAAmB,CAAA,CAAE,KAAA,QAAa,iBAAA;;;cCHjC,oBAAA,EAAoB,CAAA,CAAA,SAAA;;;;KAarB,mBAAA,GAAsB,CAAA,CAAE,KAAA,QAAa,oBAAA;;;cCbpC,oBAAA,EAAoB,CAAA,CAAA,SAAA;;;;KAarB,mBAAA,GAAsB,CAAA,CAAE,KAAA,QAAa,oBAAA;;;cCbpC,mBAAA,EAAmB,CAAA,CAAA,SAAA;;;;KAapB,kBAAA,GAAqB,CAAA,CAAE,KAAA,QAAa,mBAAA;;;cCbnC,qBAAA,EAAqB,CAAA,CAAA,SAAA;;;;KAatB,oBAAA,GAAuB,CAAA,CAAE,KAAA,QAAa,qBAAA;;;cCbrC,uBAAA,EAAuB,CAAA,CAAA,SAAA;;;;;KAgBxB,sBAAA,GAAyB,CAAA,CAAE,KAAA,QAAa,uBAAA;;;cChBvC,iBAAA,EAAiB,CAAA,CAAA,SAAA;;;;KAalB,gBAAA,GAAmB,CAAA,CAAE,KAAA,QAAa,iBAAA;;;cCbjC,oBAAA,EAAoB,CAAA,CAAA,SAAA;;;;;KAKrB,mBAAA,GAAsB,CAAA,CAAE,KAAA,QAAa,oBAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/tools/index.ts","../src/graphql.ts","../src/tools/inventory_create_data_silo.ts","../src/tools/inventory_get_data_silo.ts","../src/tools/inventory_list_categories.ts","../src/tools/inventory_list_data_points.ts","../src/tools/inventory_list_data_silos.ts","../src/tools/inventory_list_identifiers.ts","../src/tools/inventory_list_sub_data_points.ts","../src/tools/inventory_list_vendors.ts","../src/tools/inventory_update_data_silo.ts"],"mappings":";;;iBAagB,iBAAA,CAAkB,OAAA,EAAS,WAAA,GAAc,cAAA;;;cCE5C,cAAA,SAAuB,oBAAA;EAC5B,aAAA,CAAc,OAAA,GAAU,WAAA,GAAc,OAAA,CAAQ,iBAAA,CAAkB,QAAA;EAkBhE,WAAA,CAAY,EAAA,WAAa,OAAA,CAAQ,eAAA;EA0BjC,cAAA,CAAe,KAAA,EAAO,mBAAA,GAAsB,OAAA,CAAQ,QAAA;EAuBpD,cAAA,CAAe,KAAA,EAAO,mBAAA,GAAsB,OAAA,CAAQ,QAAA;EAyBpD,WAAA,CAAY,OAAA,GAAU,WAAA,GAAc,OAAA,CAAQ,iBAAA,CAAkB,MAAA;EAe9D,cAAA,CACJ,WAAA,WACA,OAAA,GAAU,WAAA,GACT,OAAA,CAAQ,iBAAA,CAAkB,SAAA;EAqCvB,iBAAA,CACJ,WAAA,UACA,OAAA,GAAU,WAAA,GACT,OAAA,CAAQ,iBAAA,CAAkB,YAAA;EAmBvB,eAAA,CAAgB,OAAA,GAAU,WAAA,GAAc,OAAA,CAAQ,iBAAA,CAAkB,UAAA;EAiBlE,kBAAA,CAAmB,OAAA,GAAU,WAAA,GAAc,OAAA,CAAQ,iBAAA,CAAkB,YAAA;AAAA;;;cCtMhE,oBAAA,EAAoB,CAAA,CAAA,SAAA;;;KAOrB,mBAAA,GAAsB,CAAA,CAAE,KAAA,QAAa,oBAAA;;;cCPpC,iBAAA,EAAiB,CAAA,CAAA,SAAA;;;KAGlB,gBAAA,GAAmB,CAAA,CAAE,KAAA,QAAa,iBAAA;;;cCHjC,oBAAA,EAAoB,CAAA,CAAA,SAAA;;;;KAerB,mBAAA,GAAsB,CAAA,CAAE,KAAA,QAAa,oBAAA;;;cCfpC,oBAAA,EAAoB,CAAA,CAAA,SAAA;;;;KAerB,mBAAA,GAAsB,CAAA,CAAE,KAAA,QAAa,oBAAA;;;cCfpC,mBAAA,EAAmB,CAAA,CAAA,SAAA;;;;KAepB,kBAAA,GAAqB,CAAA,CAAE,KAAA,QAAa,mBAAA;;;cCfnC,qBAAA,EAAqB,CAAA,CAAA,SAAA;;;;KAetB,oBAAA,GAAuB,CAAA,CAAE,KAAA,QAAa,qBAAA;;;cCfrC,uBAAA,EAAuB,CAAA,CAAA,SAAA;;;;;KAgBxB,sBAAA,GAAyB,CAAA,CAAE,KAAA,QAAa,uBAAA;;;cChBvC,iBAAA,EAAiB,CAAA,CAAA,SAAA;;;;KAelB,gBAAA,GAAmB,CAAA,CAAE,KAAA,QAAa,iBAAA;;;cCfjC,oBAAA,EAAoB,CAAA,CAAA,SAAA;;;;;KAKrB,mBAAA,GAAsB,CAAA,CAAE,KAAA,QAAa,oBAAA"}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { a as ListSubDataPointsSchema, c as ListDataPointsSchema, d as CreateDataSiloSchema, i as ListVendorsSchema, l as ListCategoriesSchema, n as getInventoryTools, o as ListIdentifiersSchema, r as UpdateDataSiloSchema, s as ListDataSilosSchema, t as InventoryMixin, u as GetDataSiloSchema } from "./graphql-0tHfKnDD.mjs";
1
+ import { a as ListSubDataPointsSchema, c as ListDataPointsSchema, d as CreateDataSiloSchema, i as ListVendorsSchema, l as ListCategoriesSchema, n as getInventoryTools, o as ListIdentifiersSchema, r as UpdateDataSiloSchema, s as ListDataSilosSchema, t as InventoryMixin, u as GetDataSiloSchema } from "./graphql-BgCMWmUd.mjs";
2
2
  export { CreateDataSiloSchema, GetDataSiloSchema, InventoryMixin, ListCategoriesSchema, ListDataPointsSchema, ListDataSilosSchema, ListIdentifiersSchema, ListSubDataPointsSchema, ListVendorsSchema, UpdateDataSiloSchema, getInventoryTools };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transcend-io/mcp-server-inventory",
3
- "version": "0.3.3",
3
+ "version": "0.3.7",
4
4
  "description": "Transcend MCP Server — Data Inventory tools.",
5
5
  "homepage": "https://github.com/transcend-io/tools/tree/main/packages/mcp/mcp-server-inventory",
6
6
  "license": "Apache-2.0",
@@ -32,14 +32,14 @@
32
32
  "dependencies": {
33
33
  "@modelcontextprotocol/sdk": "^1.29.0",
34
34
  "zod": "^4.3.6",
35
- "@transcend-io/mcp-server-base": "0.4.2"
35
+ "@transcend-io/mcp-server-base": "0.4.5"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@arethetypeswrong/cli": "^0.18.2",
39
39
  "@types/node": "^22.19.15",
40
40
  "publint": "^0.3.18",
41
41
  "tsdown": "^0.21.2",
42
- "typescript": "^5.9.3",
42
+ "typescript": "^6.0.0",
43
43
  "vitest": "^4.0.18"
44
44
  },
45
45
  "engines": {
@@ -1 +0,0 @@
1
- {"version":3,"file":"graphql-0tHfKnDD.mjs","names":[],"sources":["../src/tools/inventory_analyze.ts","../src/tools/inventory_create_data_silo.ts","../src/tools/inventory_get_data_silo.ts","../src/tools/inventory_list_categories.ts","../src/tools/inventory_list_data_points.ts","../src/tools/inventory_list_data_silos.ts","../src/tools/inventory_list_identifiers.ts","../src/tools/inventory_list_sub_data_points.ts","../src/tools/inventory_list_vendors.ts","../src/tools/inventory_update_data_silo.ts","../src/tools/index.ts","../src/graphql.ts"],"sourcesContent":["import {\n createToolResult,\n defineTool,\n EmptySchema,\n groupBy,\n type ToolClients,\n} from '@transcend-io/mcp-server-base';\n\nimport type { InventoryMixin } from '../graphql.js';\n\nexport function createInventoryAnalyzeTool(clients: ToolClients) {\n const graphql = clients.graphql as InventoryMixin;\n return defineTool({\n name: 'inventory_analyze',\n description:\n 'Analyze your data inventory including data silos by type, vendor distribution, and data point coverage',\n category: 'Data Inventory',\n readOnly: true,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },\n zodSchema: EmptySchema,\n handler: async (_args) => {\n const [dataSilosResult, vendorsResult, identifiersResult, categoriesResult] =\n await Promise.all([\n graphql.listDataSilos({ first: 100 }),\n graphql.listVendors({ first: 100 }),\n graphql.listIdentifiers({ first: 100 }),\n graphql.listDataCategories({ first: 100 }),\n ]);\n\n const dataSilos = dataSilosResult.nodes;\n const vendors = vendorsResult.nodes;\n const identifiers = identifiersResult.nodes;\n const categories = categoriesResult.nodes;\n\n const liveDataSilos = dataSilos.filter((ds) => ds.isLive);\n\n return createToolResult(true, {\n summary: {\n totalDataSilos: dataSilos.length,\n liveDataSilos: liveDataSilos.length,\n totalVendors: vendors.length,\n totalIdentifiers: identifiers.length,\n totalCategories: categories.length,\n },\n breakdown: {\n dataSilosByType: groupBy(dataSilos, 'type'),\n dataSilosByOuterType: groupBy(\n dataSilos.filter((ds) => ds.outerType),\n 'outerType' as keyof (typeof dataSilos)[0],\n ),\n },\n topIdentifiers: identifiers.slice(0, 10).map((id) => ({\n name: id.name,\n type: id.type,\n isRequired: id.isRequiredInForm,\n })),\n topCategories: categories.slice(0, 10).map((cat) => ({\n name: cat.name,\n category: cat.category,\n })),\n recommendations: [\n dataSilos.length === 0 ? 'Add data silos to map your data landscape' : null,\n liveDataSilos.length < dataSilos.length\n ? `${dataSilos.length - liveDataSilos.length} data silos are not live - consider activating them`\n : null,\n vendors.length === 0 ? 'Add vendors to track third-party data processors' : null,\n ].filter(Boolean),\n });\n },\n });\n}\n","import { createToolResult, defineTool, z, type ToolClients } from '@transcend-io/mcp-server-base';\n\nimport type { InventoryMixin } from '../graphql.js';\n\nexport const CreateDataSiloSchema = z.object({\n title: z\n .string()\n .describe(\n 'Name/title of the data silo (must match an integrationName in the Transcend catalog, e.g. \"Salesforce\", \"Stripe\")',\n ),\n});\nexport type CreateDataSiloInput = z.infer<typeof CreateDataSiloSchema>;\n\nexport function createInventoryCreateDataSiloTool(clients: ToolClients) {\n const graphql = clients.graphql as InventoryMixin;\n return defineTool({\n name: 'inventory_create_data_silo',\n description:\n 'Create a new data silo (data system or integration). The name must match an integration name from the Transcend catalog.',\n category: 'Data Inventory',\n readOnly: false,\n confirmationHint: 'Creates a new data silo in the inventory',\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false },\n zodSchema: CreateDataSiloSchema,\n handler: async ({ title }) => {\n const result = await graphql.createDataSilo({\n name: title,\n });\n return createToolResult(true, {\n dataSilo: result,\n message: `Data silo \"${title}\" created successfully`,\n });\n },\n });\n}\n","import { createToolResult, defineTool, z, type ToolClients } from '@transcend-io/mcp-server-base';\n\nimport type { InventoryMixin } from '../graphql.js';\n\nexport const GetDataSiloSchema = z.object({\n data_silo_id: z.string().describe('ID of the data silo to retrieve'),\n});\nexport type GetDataSiloInput = z.infer<typeof GetDataSiloSchema>;\n\nexport function createInventoryGetDataSiloTool(clients: ToolClients) {\n const graphql = clients.graphql as InventoryMixin;\n return defineTool({\n name: 'inventory_get_data_silo',\n description:\n 'Get detailed information about a specific data silo including its data points and identifiers',\n category: 'Data Inventory',\n readOnly: true,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },\n zodSchema: GetDataSiloSchema,\n handler: async ({ data_silo_id }) => {\n const result = await graphql.getDataSilo(data_silo_id);\n return createToolResult(true, result);\n },\n });\n}\n","import { createListResult, defineTool, z, type ToolClients } from '@transcend-io/mcp-server-base';\n\nimport type { InventoryMixin } from '../graphql.js';\n\nexport const ListCategoriesSchema = z.object({\n limit: z.coerce\n .number()\n .min(1)\n .max(100)\n .optional()\n .default(50)\n .describe('Results per page (1-100, default: 50)'),\n cursor: z\n .string()\n .optional()\n .describe('Pagination cursor from previous response (where supported)'),\n});\nexport type ListCategoriesInput = z.infer<typeof ListCategoriesSchema>;\n\nexport function createInventoryListCategoriesTool(clients: ToolClients) {\n const graphql = clients.graphql as InventoryMixin;\n return defineTool({\n name: 'inventory_list_categories',\n description:\n 'List all data categories (PII types) configured in your organization. Note: API does not support cursor pagination (max ~100 results).',\n category: 'Data Inventory',\n readOnly: true,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },\n zodSchema: ListCategoriesSchema,\n handler: async ({ limit, cursor }) => {\n const result = await graphql.listDataCategories({\n first: limit,\n after: cursor,\n });\n\n return createListResult(result.nodes, {\n totalCount: result.totalCount,\n hasNextPage: result.pageInfo?.hasNextPage,\n });\n },\n });\n}\n","import { createListResult, defineTool, z, type ToolClients } from '@transcend-io/mcp-server-base';\n\nimport type { InventoryMixin } from '../graphql.js';\n\nexport const ListDataPointsSchema = z.object({\n limit: z.coerce\n .number()\n .min(1)\n .max(100)\n .optional()\n .default(50)\n .describe('Results per page (1-100, default: 50)'),\n cursor: z\n .string()\n .optional()\n .describe('Pagination cursor from previous response (where supported)'),\n});\nexport type ListDataPointsInput = z.infer<typeof ListDataPointsSchema>;\n\nexport function createInventoryListDataPointsTool(clients: ToolClients) {\n const graphql = clients.graphql as InventoryMixin;\n return defineTool({\n name: 'inventory_list_data_points',\n description:\n 'List data points (collections of personal data). Note: API does not support cursor pagination or data_silo filtering (max ~100 results).',\n category: 'Data Inventory',\n readOnly: true,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },\n zodSchema: ListDataPointsSchema,\n handler: async ({ limit, cursor }) => {\n const result = await graphql.listDataPoints(\n undefined, // dataSiloId not supported by API\n {\n first: limit,\n after: cursor,\n },\n );\n\n return createListResult(result.nodes, {\n totalCount: result.totalCount,\n hasNextPage: result.pageInfo?.hasNextPage,\n });\n },\n });\n}\n","import { createListResult, defineTool, z, type ToolClients } from '@transcend-io/mcp-server-base';\n\nimport type { InventoryMixin } from '../graphql.js';\n\nexport const ListDataSilosSchema = z.object({\n limit: z.coerce\n .number()\n .min(1)\n .max(100)\n .optional()\n .default(50)\n .describe('Results per page (1-100, default: 50)'),\n cursor: z\n .string()\n .optional()\n .describe('Pagination cursor from previous response (where supported)'),\n});\nexport type ListDataSilosInput = z.infer<typeof ListDataSilosSchema>;\n\nexport function createInventoryListDataSilosTool(clients: ToolClients) {\n const graphql = clients.graphql as InventoryMixin;\n return defineTool({\n name: 'inventory_list_data_silos',\n description:\n 'List all data silos (data systems and integrations) in your organization. Note: API does not support cursor pagination (max ~100 results).',\n category: 'Data Inventory',\n readOnly: true,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },\n zodSchema: ListDataSilosSchema,\n handler: async ({ limit, cursor }) => {\n const result = await graphql.listDataSilos({\n first: limit,\n after: cursor,\n });\n\n return createListResult(result.nodes, {\n totalCount: result.totalCount,\n hasNextPage: result.pageInfo?.hasNextPage,\n });\n },\n });\n}\n","import { createListResult, defineTool, z, type ToolClients } from '@transcend-io/mcp-server-base';\n\nimport type { InventoryMixin } from '../graphql.js';\n\nexport const ListIdentifiersSchema = z.object({\n limit: z.coerce\n .number()\n .min(1)\n .max(100)\n .optional()\n .default(50)\n .describe('Results per page (1-100, default: 50)'),\n cursor: z\n .string()\n .optional()\n .describe('Pagination cursor from previous response (where supported)'),\n});\nexport type ListIdentifiersInput = z.infer<typeof ListIdentifiersSchema>;\n\nexport function createInventoryListIdentifiersTool(clients: ToolClients) {\n const graphql = clients.graphql as InventoryMixin;\n return defineTool({\n name: 'inventory_list_identifiers',\n description:\n 'List all identifier types (email, user ID, etc.) configured in your organization. Note: API does not support cursor pagination (max ~100 results).',\n category: 'Data Inventory',\n readOnly: true,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },\n zodSchema: ListIdentifiersSchema,\n handler: async ({ limit, cursor }) => {\n const result = await graphql.listIdentifiers({\n first: limit,\n after: cursor,\n });\n\n return createListResult(result.nodes, {\n totalCount: result.totalCount,\n hasNextPage: result.pageInfo?.hasNextPage,\n });\n },\n });\n}\n","import { createListResult, defineTool, z, type ToolClients } from '@transcend-io/mcp-server-base';\n\nimport type { InventoryMixin } from '../graphql.js';\n\nexport const ListSubDataPointsSchema = z.object({\n data_point_id: z.string().describe('ID of the parent data point'),\n limit: z.coerce\n .number()\n .min(1)\n .max(100)\n .optional()\n .default(50)\n .describe('Results per page (1-100, default: 50)'),\n offset: z.coerce\n .number()\n .min(0)\n .optional()\n .default(0)\n .describe('Number of results to skip (default: 0)'),\n});\nexport type ListSubDataPointsInput = z.infer<typeof ListSubDataPointsSchema>;\n\nexport function createInventoryListSubDataPointsTool(clients: ToolClients) {\n const graphql = clients.graphql as InventoryMixin;\n return defineTool({\n name: 'inventory_list_sub_data_points',\n description:\n 'List sub-data points (individual data fields) for a specific data point. Note: This feature may have limited availability.',\n category: 'Data Inventory',\n readOnly: true,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },\n zodSchema: ListSubDataPointsSchema,\n handler: async ({ data_point_id, limit, offset }) => {\n const result = await graphql.listSubDataPoints(data_point_id, {\n first: limit,\n offset,\n });\n\n return createListResult(result.nodes, {\n totalCount: result.totalCount,\n hasNextPage: result.pageInfo?.hasNextPage,\n });\n },\n });\n}\n","import { createListResult, defineTool, z, type ToolClients } from '@transcend-io/mcp-server-base';\n\nimport type { InventoryMixin } from '../graphql.js';\n\nexport const ListVendorsSchema = z.object({\n limit: z.coerce\n .number()\n .min(1)\n .max(100)\n .optional()\n .default(50)\n .describe('Results per page (1-100, default: 50)'),\n cursor: z\n .string()\n .optional()\n .describe('Pagination cursor from previous response (where supported)'),\n});\nexport type ListVendorsInput = z.infer<typeof ListVendorsSchema>;\n\nexport function createInventoryListVendorsTool(clients: ToolClients) {\n const graphql = clients.graphql as InventoryMixin;\n return defineTool({\n name: 'inventory_list_vendors',\n description:\n 'List all vendors (third-party data processors) in your organization. Note: API does not support cursor pagination (max ~100 results).',\n category: 'Data Inventory',\n readOnly: true,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },\n zodSchema: ListVendorsSchema,\n handler: async ({ limit, cursor }) => {\n const result = await graphql.listVendors({\n first: limit,\n after: cursor,\n });\n\n return createListResult(result.nodes, {\n totalCount: result.totalCount,\n hasNextPage: result.pageInfo?.hasNextPage,\n });\n },\n });\n}\n","import { createToolResult, defineTool, z, type ToolClients } from '@transcend-io/mcp-server-base';\n\nimport type { InventoryMixin } from '../graphql.js';\n\nexport const UpdateDataSiloSchema = z.object({\n data_silo_id: z.string().describe('ID of the data silo to update'),\n title: z.string().optional().describe('New title for the data silo'),\n description: z.string().optional().describe('New description'),\n});\nexport type UpdateDataSiloInput = z.infer<typeof UpdateDataSiloSchema>;\n\nexport function createInventoryUpdateDataSiloTool(clients: ToolClients) {\n const graphql = clients.graphql as InventoryMixin;\n return defineTool({\n name: 'inventory_update_data_silo',\n description: 'Update an existing data silo',\n category: 'Data Inventory',\n readOnly: false,\n confirmationHint: 'Updates the data silo configuration',\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },\n zodSchema: UpdateDataSiloSchema,\n handler: async ({ data_silo_id, title, description }) => {\n const result = await graphql.updateDataSilo({\n id: data_silo_id,\n title,\n description,\n });\n return createToolResult(true, {\n dataSilo: result,\n message: 'Data silo updated successfully',\n });\n },\n });\n}\n","import type { ToolDefinition, ToolClients } from '@transcend-io/mcp-server-base';\n\nimport { createInventoryAnalyzeTool } from './inventory_analyze.js';\nimport { createInventoryCreateDataSiloTool } from './inventory_create_data_silo.js';\nimport { createInventoryGetDataSiloTool } from './inventory_get_data_silo.js';\nimport { createInventoryListCategoriesTool } from './inventory_list_categories.js';\nimport { createInventoryListDataPointsTool } from './inventory_list_data_points.js';\nimport { createInventoryListDataSilosTool } from './inventory_list_data_silos.js';\nimport { createInventoryListIdentifiersTool } from './inventory_list_identifiers.js';\nimport { createInventoryListSubDataPointsTool } from './inventory_list_sub_data_points.js';\nimport { createInventoryListVendorsTool } from './inventory_list_vendors.js';\nimport { createInventoryUpdateDataSiloTool } from './inventory_update_data_silo.js';\n\nexport function getInventoryTools(clients: ToolClients): ToolDefinition[] {\n return [\n createInventoryListDataSilosTool(clients),\n createInventoryGetDataSiloTool(clients),\n createInventoryCreateDataSiloTool(clients),\n createInventoryUpdateDataSiloTool(clients),\n createInventoryListVendorsTool(clients),\n createInventoryListDataPointsTool(clients),\n createInventoryListSubDataPointsTool(clients),\n createInventoryListIdentifiersTool(clients),\n createInventoryListCategoriesTool(clients),\n createInventoryAnalyzeTool(clients),\n ];\n}\n","import {\n TranscendGraphQLBase,\n type DataCategory,\n type DataPoint,\n type DataSilo,\n type DataSiloCreateInput,\n type DataSiloDetails,\n type DataSiloUpdateInput,\n type Identifier,\n type ListOptions,\n type PaginatedResponse,\n type SubDataPoint,\n type Vendor,\n} from '@transcend-io/mcp-server-base';\n\nexport class InventoryMixin extends TranscendGraphQLBase {\n async listDataSilos(options?: ListOptions): Promise<PaginatedResponse<DataSilo>> {\n const query = `\n query ListDataSilos($first: Int) {\n dataSilos(first: $first) {\n nodes {\n id\n title\n type\n }\n totalCount\n }\n }\n `;\n const data = await this.makeRequest<{ dataSilos: { nodes: DataSilo[]; totalCount: number } }>(\n query,\n { first: Math.min(options?.first || 100, 100) },\n );\n return {\n nodes: data.dataSilos.nodes,\n pageInfo: {\n hasNextPage: data.dataSilos.nodes.length < data.dataSilos.totalCount,\n hasPreviousPage: false,\n },\n totalCount: data.dataSilos.totalCount,\n };\n }\n\n async getDataSilo(id: string): Promise<DataSiloDetails> {\n const query = `\n query GetDataSilo($id: String!) {\n dataSilo(id: $id) {\n id\n title\n type\n description\n link\n isLive\n outerType\n createdAt\n connectionState\n identifiers {\n id\n name\n type\n isRequiredInForm\n }\n }\n }\n `;\n const data = await this.makeRequest<{ dataSilo: DataSiloDetails }>(query, { id });\n return data.dataSilo;\n }\n\n async createDataSilo(input: DataSiloCreateInput): Promise<DataSilo> {\n const mutation = `\n mutation CreateDataSilos($input: [CreateDataSilosInput!]!) {\n createDataSilos(input: $input) {\n dataSilos {\n id\n title\n type\n description\n isLive\n createdAt\n }\n }\n }\n `;\n const data = await this.makeRequest<{ createDataSilos: { dataSilos: DataSilo[] } }>(mutation, {\n input: [input],\n });\n const created = data.createDataSilos.dataSilos[0];\n if (!created) throw new Error('createDataSilos returned an empty array');\n return created;\n }\n\n async updateDataSilo(input: DataSiloUpdateInput): Promise<DataSilo> {\n const mutation = `\n mutation UpdateDataSilos($input: UpdateDataSilosInput!) {\n updateDataSilos(input: $input) {\n dataSilos {\n id\n title\n type\n description\n isLive\n createdAt\n updatedAt\n }\n }\n }\n `;\n const wrappedInput = { dataSilos: [input] };\n const data = await this.makeRequest<{ updateDataSilos: { dataSilos: DataSilo[] } }>(mutation, {\n input: wrappedInput,\n });\n const updated = data.updateDataSilos.dataSilos[0];\n if (!updated) throw new Error('updateDataSilos returned an empty array');\n return updated;\n }\n\n async listVendors(options?: ListOptions): Promise<PaginatedResponse<Vendor>> {\n const query = `\n query ListVendors($first: Int) {\n vendors(first: $first) {\n nodes {\n id\n title\n }\n totalCount\n }\n }\n `;\n const data = await this.makeRequest<{ vendors: { nodes: Vendor[]; totalCount: number } }>(\n query,\n { first: Math.min(options?.first || 100, 100) },\n );\n return {\n nodes: data.vendors.nodes,\n pageInfo: {\n hasNextPage: data.vendors.nodes.length < data.vendors.totalCount,\n hasPreviousPage: false,\n },\n totalCount: data.vendors.totalCount,\n };\n }\n\n async listDataPoints(\n _dataSiloId?: string,\n options?: ListOptions,\n ): Promise<PaginatedResponse<DataPoint>> {\n const query = `\n query ListDataPoints($first: Int) {\n dataPoints(first: $first) {\n nodes {\n id\n name\n title {\n defaultMessage\n }\n description {\n defaultMessage\n }\n }\n totalCount\n }\n }\n `;\n const data = await this.makeRequest<{\n dataPoints: {\n nodes: Array<{\n id: string;\n name: string;\n title: { defaultMessage: string };\n description: { defaultMessage: string } | null;\n }>;\n totalCount: number;\n };\n }>(query, { first: Math.min(options?.first || 100, 100) });\n const points: DataPoint[] = data.dataPoints.nodes.map((dp) => ({\n id: dp.id,\n name: dp.name,\n title: dp.title?.defaultMessage,\n description: dp.description?.defaultMessage,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }));\n return {\n nodes: points,\n pageInfo: { hasNextPage: points.length < data.dataPoints.totalCount, hasPreviousPage: false },\n totalCount: data.dataPoints.totalCount,\n };\n }\n\n async listSubDataPoints(\n dataPointId: string,\n options?: ListOptions,\n ): Promise<PaginatedResponse<SubDataPoint>> {\n const query = `\n query ListSubDataPoints($first: Int, $offset: Int, $filterBy: SubDataPointFiltersInput) {\n subDataPoints(first: $first, offset: $offset, filterBy: $filterBy) {\n nodes {\n id\n name\n description\n accessRequestVisibilityEnabled\n }\n totalCount\n }\n }\n `;\n const data = await this.makeRequest<{\n subDataPoints: { nodes: SubDataPoint[]; totalCount: number };\n }>(query, {\n first: Math.min(options?.first || 100, 100),\n offset: options?.offset || 0,\n filterBy: { dataPoints: [dataPointId] },\n });\n return {\n nodes: data.subDataPoints.nodes,\n pageInfo: {\n hasNextPage: data.subDataPoints.nodes.length < data.subDataPoints.totalCount,\n hasPreviousPage: false,\n },\n totalCount: data.subDataPoints.totalCount,\n };\n }\n\n async listIdentifiers(options?: ListOptions): Promise<PaginatedResponse<Identifier>> {\n const query = `\n query ListIdentifiers($first: Int) {\n identifiers(first: $first) {\n nodes {\n id\n name\n type\n }\n totalCount\n }\n }\n `;\n const data = await this.makeRequest<{\n identifiers: { nodes: Identifier[]; totalCount: number };\n }>(query, { first: Math.min(options?.first || 100, 100) });\n return {\n nodes: data.identifiers.nodes,\n pageInfo: {\n hasNextPage: data.identifiers.nodes.length < data.identifiers.totalCount,\n hasPreviousPage: false,\n },\n totalCount: data.identifiers.totalCount,\n };\n }\n\n async listDataCategories(options?: ListOptions): Promise<PaginatedResponse<DataCategory>> {\n const query = `\n query ListDataCategories($first: Int) {\n dataCategories(first: $first) {\n nodes {\n name\n category\n }\n totalCount\n }\n }\n `;\n const data = await this.makeRequest<{\n dataCategories: { nodes: DataCategory[]; totalCount: number };\n }>(query, { first: Math.min(options?.first || 100, 100) });\n return {\n nodes: data.dataCategories.nodes,\n pageInfo: {\n hasNextPage: data.dataCategories.nodes.length < data.dataCategories.totalCount,\n hasPreviousPage: false,\n },\n totalCount: data.dataCategories.totalCount,\n };\n }\n}\n"],"mappings":"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"}