@transcend-io/mcp-server-inventory 0.3.7 → 0.4.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.
- package/README.md +36 -10
- package/dist/cli.mjs +2 -1
- package/dist/cli.mjs.map +1 -1
- package/dist/{graphql-BgCMWmUd.mjs → graphql-BJIrpomr.mjs} +506 -65
- package/dist/graphql-BJIrpomr.mjs.map +1 -0
- package/dist/index.d.mts +9 -4
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +2 -2
- package/package.json +5 -2
- package/dist/graphql-BgCMWmUd.mjs.map +0 -1
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
|
|
9
|
+
For local runs from this repository, copy [`secret.env.example`](../../../secret.env.example) to **`secret.env`** at the repo root (gitignored) and set the OAuth environment variables (see **Run from the monorepo**).
|
|
10
10
|
|
|
11
11
|
## Install
|
|
12
12
|
|
|
@@ -21,12 +21,31 @@ Or run from a checkout of this repository (see **Run from the monorepo** below).
|
|
|
21
21
|
## Usage
|
|
22
22
|
|
|
23
23
|
```bash
|
|
24
|
-
# With
|
|
25
|
-
|
|
24
|
+
# With OAuth env vars in the environment; from the monorepo use secret.env (see Run from the monorepo)
|
|
25
|
+
TRANSCEND_OAUTH_CLIENT_ID=your-client-id \
|
|
26
|
+
TRANSCEND_OAUTH_CLIENT_SECRET=your-client-secret \
|
|
27
|
+
TRANSCEND_OAUTH_REDIRECT_PORT=your-client-redirect-port \
|
|
28
|
+
transcend-mcp-inventory
|
|
26
29
|
```
|
|
27
30
|
|
|
28
31
|
The process speaks MCP over **stdio** and is meant to be launched by an MCP client (for example Cursor or Claude Desktop), not used as an interactive shell.
|
|
29
32
|
|
|
33
|
+
### OAuth client setup
|
|
34
|
+
|
|
35
|
+
OAuth stdio is the recommended path for MCP clients (Cursor, Claude Desktop). Requires **org admin** access to create OAuth clients.
|
|
36
|
+
|
|
37
|
+
1. Navigate to [app.transcend.com/admin/oauth-clients](https://app.transcend.com/admin/oauth-clients) and create an OAuth client.
|
|
38
|
+
2. Copy the **client ID** and **client secret**.
|
|
39
|
+
3. Register `http://127.0.0.1:{port}/callback` — use **`127.0.0.1`, not `localhost`**, and ensure the path is `/callback`. Set `TRANSCEND_OAUTH_REDIRECT_PORT` to the matching port.
|
|
40
|
+
|
|
41
|
+
At startup the server verifies client ID, secret, and redirect URI. On first tool call it opens a browser for login. Tokens are session-only (in-memory).
|
|
42
|
+
|
|
43
|
+
**OAuth scopes:** `ViewDataMap`, `ViewAssignedIntegrations`, `ManageDataMap`, `ManageAssignedIntegrations`, `ViewDataInventory`, `ViewAssignedDataInventory`, `ManageDataInventory`, `ManageAssignedDataInventory`. The signed-in user must hold these permissions. See [`src/scopes.ts`](./src/scopes.ts).
|
|
44
|
+
|
|
45
|
+
Full setup, troubleshooting, and multi-server guidance: [MCP root README](../README.md#oauth-client-setup).
|
|
46
|
+
|
|
47
|
+
> **API key alternative:** set `TRANSCEND_API_KEY` instead of OAuth vars for stdio (OAuth is disabled when both are set).
|
|
48
|
+
|
|
30
49
|
### MCP client configuration
|
|
31
50
|
|
|
32
51
|
`npx` runs the package’s `transcend-mcp-inventory` binary (see `bin` in `package.json`).
|
|
@@ -38,7 +57,9 @@ The process speaks MCP over **stdio** and is meant to be launched by an MCP clie
|
|
|
38
57
|
"command": "npx",
|
|
39
58
|
"args": ["-y", "@transcend-io/mcp-server-inventory"],
|
|
40
59
|
"env": {
|
|
41
|
-
"
|
|
60
|
+
"TRANSCEND_OAUTH_CLIENT_ID": "your-client-id",
|
|
61
|
+
"TRANSCEND_OAUTH_CLIENT_SECRET": "your-client-secret",
|
|
62
|
+
"TRANSCEND_OAUTH_REDIRECT_PORT": "your-client-redirect-port"
|
|
42
63
|
}
|
|
43
64
|
}
|
|
44
65
|
}
|
|
@@ -49,7 +70,7 @@ When developing in this repository, reuse the same variable names from root **`s
|
|
|
49
70
|
|
|
50
71
|
### Run from the monorepo
|
|
51
72
|
|
|
52
|
-
1. **Credentials** — From the repository root, copy [`secret.env.example`](../../../secret.env.example) to **`secret.env`** and set `
|
|
73
|
+
1. **Credentials** — From the repository root, copy [`secret.env.example`](../../../secret.env.example) to **`secret.env`** and set `TRANSCEND_OAUTH_CLIENT_ID`, `TRANSCEND_OAUTH_CLIENT_SECRET`, and `TRANSCEND_OAUTH_REDIRECT_PORT` (and optional URL overrides).
|
|
53
74
|
|
|
54
75
|
2. **Build and run** — `node ./dist/cli.mjs` matches the `transcend-mcp-inventory` `bin` (use `node` because `pnpm exec transcend-mcp-inventory` may not resolve this package’s own binary in a pnpm workspace):
|
|
55
76
|
|
|
@@ -66,11 +87,16 @@ See [CONTRIBUTING.md](../../../CONTRIBUTING.md#mcp-servers) for workspace layout
|
|
|
66
87
|
|
|
67
88
|
### Environment variables
|
|
68
89
|
|
|
69
|
-
| Variable
|
|
70
|
-
|
|
|
71
|
-
| `
|
|
72
|
-
| `
|
|
73
|
-
| `
|
|
90
|
+
| Variable | Required (stdio OAuth) | Default | Description |
|
|
91
|
+
| ------------------------------- | ---------------------- | ------------------------------------------ | ----------------------------------------------------------------------------------------------------- |
|
|
92
|
+
| `TRANSCEND_OAUTH_CLIENT_ID` | Yes | — | Client ID from [app.transcend.com/admin/oauth-clients](https://app.transcend.com/admin/oauth-clients) |
|
|
93
|
+
| `TRANSCEND_OAUTH_CLIENT_SECRET` | Yes | — | Client secret from the same OAuth clients page |
|
|
94
|
+
| `TRANSCEND_OAUTH_REDIRECT_PORT` | Yes | — | Localhost port for the OAuth callback server; **must match the port in your registered redirect URI** |
|
|
95
|
+
| `TRANSCEND_OAUTH_REDIRECT_HOST` | No | `127.0.0.1` | Loopback host for the OAuth callback (`127.0.0.1` or `::1` for `http://[::1]:{port}/callback`) |
|
|
96
|
+
| `TRANSCEND_OAUTH_ISSUER` | No | auto-detected | OAuth issuer URL; production auto-detects region. Test-only override |
|
|
97
|
+
| `TRANSCEND_API_KEY` | No | — | API key for stdio (alternative to OAuth). Disables OAuth when set alongside client ID |
|
|
98
|
+
| `TRANSCEND_API_URL` | No | `https://api.transcend.io` | GraphQL backend API URL (matches CLI convention) |
|
|
99
|
+
| `SOMBRA_URL` | No | `https://multi-tenant.sombra.transcend.io` | Sombra REST API URL (matches CLI / SDK convention) |
|
|
74
100
|
|
|
75
101
|
**Monorepo:** keep these in root **`secret.env`** (from [`secret.env.example`](../../../secret.env.example)); see **Run from the monorepo**.
|
|
76
102
|
|
package/dist/cli.mjs
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { n as getInventoryTools, t as InventoryMixin } from "./graphql-
|
|
2
|
+
import { n as INVENTORY_OAUTH_SCOPES, r as getInventoryTools, t as InventoryMixin } from "./graphql-BJIrpomr.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
|
+
oauthScopes: INVENTORY_OAUTH_SCOPES,
|
|
8
9
|
getTools: getInventoryTools,
|
|
9
10
|
createClients: ({ auth, sombraUrl, graphqlUrl, dashboardUrl }) => ({
|
|
10
11
|
rest: new TranscendRestClient(auth, sombraUrl),
|
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, dashboardUrl }) => ({\n rest: new TranscendRestClient(auth, sombraUrl),\n graphql: new InventoryMixin(auth, graphqlUrl),\n dashboardUrl,\n }),\n});\n"],"mappings":";;;;
|
|
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 { INVENTORY_OAUTH_SCOPES } from './scopes.js';\nimport { getInventoryTools } from './tools/index.js';\n\ncreateMCPServer({\n name: 'transcend-mcp-inventory',\n version: '1.0.0',\n oauthScopes: INVENTORY_OAUTH_SCOPES,\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":";;;;AAOA,gBAAgB;CACd,MAAM;CACN,SAAS;CACT,aAAa;CACb,UAAU;CACV,gBAAgB,EAAE,MAAM,WAAW,YAAY,oBAAoB;EACjE,MAAM,IAAI,oBAAoB,MAAM,UAAU;EAC9C,SAAS,IAAI,eAAe,MAAM,WAAW;EAC7C;EACD;CACF,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { EmptySchema, TranscendGraphQLBase, createListResult, createToolResult, defineTool, groupBy, z } from "@transcend-io/mcp-server-base";
|
|
2
|
+
import { ScopeName } from "@transcend-io/privacy-types";
|
|
2
3
|
//#region src/tools/inventory_analyze.ts
|
|
3
4
|
function createInventoryAnalyzeTool(clients) {
|
|
4
5
|
const graphql = clients.graphql;
|
|
@@ -83,7 +84,7 @@ function createInventoryCreateDataSiloTool(clients) {
|
|
|
83
84
|
}
|
|
84
85
|
//#endregion
|
|
85
86
|
//#region src/tools/inventory_get_data_silo.ts
|
|
86
|
-
const GetDataSiloSchema = z.object({
|
|
87
|
+
const GetDataSiloSchema = z.object({ dataSiloId: z.string().describe("ID of the data silo to retrieve") });
|
|
87
88
|
function createInventoryGetDataSiloTool(clients) {
|
|
88
89
|
const graphql = clients.graphql;
|
|
89
90
|
return defineTool({
|
|
@@ -97,8 +98,8 @@ function createInventoryGetDataSiloTool(clients) {
|
|
|
97
98
|
idempotentHint: true
|
|
98
99
|
},
|
|
99
100
|
zodSchema: GetDataSiloSchema,
|
|
100
|
-
handler: async ({
|
|
101
|
-
return createToolResult(true, await graphql.getDataSilo(
|
|
101
|
+
handler: async ({ dataSiloId }) => {
|
|
102
|
+
return createToolResult(true, await graphql.getDataSilo(dataSiloId));
|
|
102
103
|
}
|
|
103
104
|
});
|
|
104
105
|
}
|
|
@@ -229,7 +230,7 @@ function createInventoryListIdentifiersTool(clients) {
|
|
|
229
230
|
//#endregion
|
|
230
231
|
//#region src/tools/inventory_list_sub_data_points.ts
|
|
231
232
|
const ListSubDataPointsSchema = z.object({
|
|
232
|
-
|
|
233
|
+
dataPointId: z.string().describe("ID of the parent data point"),
|
|
233
234
|
limit: z.coerce.number().min(1).max(100).optional().default(50).describe("Results per page (1-100, default: 50)"),
|
|
234
235
|
offset: z.coerce.number().min(0).optional().default(0).describe("Number of results to skip (default: 0)")
|
|
235
236
|
});
|
|
@@ -246,8 +247,8 @@ function createInventoryListSubDataPointsTool(clients) {
|
|
|
246
247
|
idempotentHint: true
|
|
247
248
|
},
|
|
248
249
|
zodSchema: ListSubDataPointsSchema,
|
|
249
|
-
handler: async ({
|
|
250
|
-
const result = await graphql.listSubDataPoints(
|
|
250
|
+
handler: async ({ dataPointId, limit, offset }) => {
|
|
251
|
+
const result = await graphql.listSubDataPoints(dataPointId, {
|
|
251
252
|
first: limit,
|
|
252
253
|
offset
|
|
253
254
|
});
|
|
@@ -292,7 +293,7 @@ function createInventoryListVendorsTool(clients) {
|
|
|
292
293
|
//#endregion
|
|
293
294
|
//#region src/tools/inventory_update_data_silo.ts
|
|
294
295
|
const UpdateDataSiloSchema = z.object({
|
|
295
|
-
|
|
296
|
+
dataSiloId: z.string().describe("ID of the data silo to update"),
|
|
296
297
|
title: z.string().optional().describe("New title for the data silo"),
|
|
297
298
|
description: z.string().optional().describe("New description")
|
|
298
299
|
});
|
|
@@ -310,10 +311,10 @@ function createInventoryUpdateDataSiloTool(clients) {
|
|
|
310
311
|
idempotentHint: true
|
|
311
312
|
},
|
|
312
313
|
zodSchema: UpdateDataSiloSchema,
|
|
313
|
-
handler: async ({
|
|
314
|
+
handler: async ({ dataSiloId, title, description }) => {
|
|
314
315
|
return createToolResult(true, {
|
|
315
316
|
dataSilo: await graphql.updateDataSilo({
|
|
316
|
-
id:
|
|
317
|
+
id: dataSiloId,
|
|
317
318
|
title,
|
|
318
319
|
description
|
|
319
320
|
}),
|
|
@@ -339,7 +340,479 @@ function getInventoryTools(clients) {
|
|
|
339
340
|
];
|
|
340
341
|
}
|
|
341
342
|
//#endregion
|
|
343
|
+
//#region src/scopes.ts
|
|
344
|
+
/** OAuth scopes required for Inventory MCP tools (offline_access added by base). */
|
|
345
|
+
const INVENTORY_OAUTH_SCOPES = [
|
|
346
|
+
ScopeName.ViewDataMap,
|
|
347
|
+
ScopeName.ViewAssignedIntegrations,
|
|
348
|
+
ScopeName.ManageDataMap,
|
|
349
|
+
ScopeName.ManageAssignedIntegrations,
|
|
350
|
+
ScopeName.ViewDataInventory,
|
|
351
|
+
ScopeName.ViewAssignedDataInventory,
|
|
352
|
+
ScopeName.ManageDataInventory,
|
|
353
|
+
ScopeName.ManageAssignedDataInventory
|
|
354
|
+
];
|
|
355
|
+
//#endregion
|
|
356
|
+
//#region src/__generated__/gql.ts
|
|
357
|
+
const documents = {
|
|
358
|
+
"\n query InventoryGetDataSilo($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": {
|
|
359
|
+
"kind": "Document",
|
|
360
|
+
"definitions": [{
|
|
361
|
+
"kind": "OperationDefinition",
|
|
362
|
+
"operation": "query",
|
|
363
|
+
"name": {
|
|
364
|
+
"kind": "Name",
|
|
365
|
+
"value": "InventoryGetDataSilo"
|
|
366
|
+
},
|
|
367
|
+
"variableDefinitions": [{
|
|
368
|
+
"kind": "VariableDefinition",
|
|
369
|
+
"variable": {
|
|
370
|
+
"kind": "Variable",
|
|
371
|
+
"name": {
|
|
372
|
+
"kind": "Name",
|
|
373
|
+
"value": "id"
|
|
374
|
+
}
|
|
375
|
+
},
|
|
376
|
+
"type": {
|
|
377
|
+
"kind": "NonNullType",
|
|
378
|
+
"type": {
|
|
379
|
+
"kind": "NamedType",
|
|
380
|
+
"name": {
|
|
381
|
+
"kind": "Name",
|
|
382
|
+
"value": "String"
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}],
|
|
387
|
+
"selectionSet": {
|
|
388
|
+
"kind": "SelectionSet",
|
|
389
|
+
"selections": [{
|
|
390
|
+
"kind": "Field",
|
|
391
|
+
"name": {
|
|
392
|
+
"kind": "Name",
|
|
393
|
+
"value": "dataSilo"
|
|
394
|
+
},
|
|
395
|
+
"arguments": [{
|
|
396
|
+
"kind": "Argument",
|
|
397
|
+
"name": {
|
|
398
|
+
"kind": "Name",
|
|
399
|
+
"value": "id"
|
|
400
|
+
},
|
|
401
|
+
"value": {
|
|
402
|
+
"kind": "Variable",
|
|
403
|
+
"name": {
|
|
404
|
+
"kind": "Name",
|
|
405
|
+
"value": "id"
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}],
|
|
409
|
+
"selectionSet": {
|
|
410
|
+
"kind": "SelectionSet",
|
|
411
|
+
"selections": [
|
|
412
|
+
{
|
|
413
|
+
"kind": "Field",
|
|
414
|
+
"name": {
|
|
415
|
+
"kind": "Name",
|
|
416
|
+
"value": "id"
|
|
417
|
+
}
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
"kind": "Field",
|
|
421
|
+
"name": {
|
|
422
|
+
"kind": "Name",
|
|
423
|
+
"value": "title"
|
|
424
|
+
}
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
"kind": "Field",
|
|
428
|
+
"name": {
|
|
429
|
+
"kind": "Name",
|
|
430
|
+
"value": "type"
|
|
431
|
+
}
|
|
432
|
+
},
|
|
433
|
+
{
|
|
434
|
+
"kind": "Field",
|
|
435
|
+
"name": {
|
|
436
|
+
"kind": "Name",
|
|
437
|
+
"value": "description"
|
|
438
|
+
}
|
|
439
|
+
},
|
|
440
|
+
{
|
|
441
|
+
"kind": "Field",
|
|
442
|
+
"name": {
|
|
443
|
+
"kind": "Name",
|
|
444
|
+
"value": "link"
|
|
445
|
+
}
|
|
446
|
+
},
|
|
447
|
+
{
|
|
448
|
+
"kind": "Field",
|
|
449
|
+
"name": {
|
|
450
|
+
"kind": "Name",
|
|
451
|
+
"value": "isLive"
|
|
452
|
+
}
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
"kind": "Field",
|
|
456
|
+
"name": {
|
|
457
|
+
"kind": "Name",
|
|
458
|
+
"value": "outerType"
|
|
459
|
+
}
|
|
460
|
+
},
|
|
461
|
+
{
|
|
462
|
+
"kind": "Field",
|
|
463
|
+
"name": {
|
|
464
|
+
"kind": "Name",
|
|
465
|
+
"value": "createdAt"
|
|
466
|
+
}
|
|
467
|
+
},
|
|
468
|
+
{
|
|
469
|
+
"kind": "Field",
|
|
470
|
+
"name": {
|
|
471
|
+
"kind": "Name",
|
|
472
|
+
"value": "connectionState"
|
|
473
|
+
}
|
|
474
|
+
},
|
|
475
|
+
{
|
|
476
|
+
"kind": "Field",
|
|
477
|
+
"name": {
|
|
478
|
+
"kind": "Name",
|
|
479
|
+
"value": "identifiers"
|
|
480
|
+
},
|
|
481
|
+
"selectionSet": {
|
|
482
|
+
"kind": "SelectionSet",
|
|
483
|
+
"selections": [
|
|
484
|
+
{
|
|
485
|
+
"kind": "Field",
|
|
486
|
+
"name": {
|
|
487
|
+
"kind": "Name",
|
|
488
|
+
"value": "id"
|
|
489
|
+
}
|
|
490
|
+
},
|
|
491
|
+
{
|
|
492
|
+
"kind": "Field",
|
|
493
|
+
"name": {
|
|
494
|
+
"kind": "Name",
|
|
495
|
+
"value": "name"
|
|
496
|
+
}
|
|
497
|
+
},
|
|
498
|
+
{
|
|
499
|
+
"kind": "Field",
|
|
500
|
+
"name": {
|
|
501
|
+
"kind": "Name",
|
|
502
|
+
"value": "type"
|
|
503
|
+
}
|
|
504
|
+
},
|
|
505
|
+
{
|
|
506
|
+
"kind": "Field",
|
|
507
|
+
"name": {
|
|
508
|
+
"kind": "Name",
|
|
509
|
+
"value": "isRequiredInForm"
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
]
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
]
|
|
516
|
+
}
|
|
517
|
+
}]
|
|
518
|
+
}
|
|
519
|
+
}]
|
|
520
|
+
},
|
|
521
|
+
"\n mutation InventoryCreateDataSilos($input: [CreateDataSilosInput!]!) {\n createDataSilos(input: $input) {\n dataSilos {\n id\n title\n type\n description\n isLive\n createdAt\n }\n }\n }\n": {
|
|
522
|
+
"kind": "Document",
|
|
523
|
+
"definitions": [{
|
|
524
|
+
"kind": "OperationDefinition",
|
|
525
|
+
"operation": "mutation",
|
|
526
|
+
"name": {
|
|
527
|
+
"kind": "Name",
|
|
528
|
+
"value": "InventoryCreateDataSilos"
|
|
529
|
+
},
|
|
530
|
+
"variableDefinitions": [{
|
|
531
|
+
"kind": "VariableDefinition",
|
|
532
|
+
"variable": {
|
|
533
|
+
"kind": "Variable",
|
|
534
|
+
"name": {
|
|
535
|
+
"kind": "Name",
|
|
536
|
+
"value": "input"
|
|
537
|
+
}
|
|
538
|
+
},
|
|
539
|
+
"type": {
|
|
540
|
+
"kind": "NonNullType",
|
|
541
|
+
"type": {
|
|
542
|
+
"kind": "ListType",
|
|
543
|
+
"type": {
|
|
544
|
+
"kind": "NonNullType",
|
|
545
|
+
"type": {
|
|
546
|
+
"kind": "NamedType",
|
|
547
|
+
"name": {
|
|
548
|
+
"kind": "Name",
|
|
549
|
+
"value": "CreateDataSilosInput"
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
}],
|
|
556
|
+
"selectionSet": {
|
|
557
|
+
"kind": "SelectionSet",
|
|
558
|
+
"selections": [{
|
|
559
|
+
"kind": "Field",
|
|
560
|
+
"name": {
|
|
561
|
+
"kind": "Name",
|
|
562
|
+
"value": "createDataSilos"
|
|
563
|
+
},
|
|
564
|
+
"arguments": [{
|
|
565
|
+
"kind": "Argument",
|
|
566
|
+
"name": {
|
|
567
|
+
"kind": "Name",
|
|
568
|
+
"value": "input"
|
|
569
|
+
},
|
|
570
|
+
"value": {
|
|
571
|
+
"kind": "Variable",
|
|
572
|
+
"name": {
|
|
573
|
+
"kind": "Name",
|
|
574
|
+
"value": "input"
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
}],
|
|
578
|
+
"selectionSet": {
|
|
579
|
+
"kind": "SelectionSet",
|
|
580
|
+
"selections": [{
|
|
581
|
+
"kind": "Field",
|
|
582
|
+
"name": {
|
|
583
|
+
"kind": "Name",
|
|
584
|
+
"value": "dataSilos"
|
|
585
|
+
},
|
|
586
|
+
"selectionSet": {
|
|
587
|
+
"kind": "SelectionSet",
|
|
588
|
+
"selections": [
|
|
589
|
+
{
|
|
590
|
+
"kind": "Field",
|
|
591
|
+
"name": {
|
|
592
|
+
"kind": "Name",
|
|
593
|
+
"value": "id"
|
|
594
|
+
}
|
|
595
|
+
},
|
|
596
|
+
{
|
|
597
|
+
"kind": "Field",
|
|
598
|
+
"name": {
|
|
599
|
+
"kind": "Name",
|
|
600
|
+
"value": "title"
|
|
601
|
+
}
|
|
602
|
+
},
|
|
603
|
+
{
|
|
604
|
+
"kind": "Field",
|
|
605
|
+
"name": {
|
|
606
|
+
"kind": "Name",
|
|
607
|
+
"value": "type"
|
|
608
|
+
}
|
|
609
|
+
},
|
|
610
|
+
{
|
|
611
|
+
"kind": "Field",
|
|
612
|
+
"name": {
|
|
613
|
+
"kind": "Name",
|
|
614
|
+
"value": "description"
|
|
615
|
+
}
|
|
616
|
+
},
|
|
617
|
+
{
|
|
618
|
+
"kind": "Field",
|
|
619
|
+
"name": {
|
|
620
|
+
"kind": "Name",
|
|
621
|
+
"value": "isLive"
|
|
622
|
+
}
|
|
623
|
+
},
|
|
624
|
+
{
|
|
625
|
+
"kind": "Field",
|
|
626
|
+
"name": {
|
|
627
|
+
"kind": "Name",
|
|
628
|
+
"value": "createdAt"
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
]
|
|
632
|
+
}
|
|
633
|
+
}]
|
|
634
|
+
}
|
|
635
|
+
}]
|
|
636
|
+
}
|
|
637
|
+
}]
|
|
638
|
+
},
|
|
639
|
+
"\n mutation InventoryUpdateDataSilos($input: UpdateDataSilosInput!) {\n updateDataSilos(input: $input) {\n dataSilos {\n id\n title\n type\n description\n isLive\n createdAt\n }\n }\n }\n": {
|
|
640
|
+
"kind": "Document",
|
|
641
|
+
"definitions": [{
|
|
642
|
+
"kind": "OperationDefinition",
|
|
643
|
+
"operation": "mutation",
|
|
644
|
+
"name": {
|
|
645
|
+
"kind": "Name",
|
|
646
|
+
"value": "InventoryUpdateDataSilos"
|
|
647
|
+
},
|
|
648
|
+
"variableDefinitions": [{
|
|
649
|
+
"kind": "VariableDefinition",
|
|
650
|
+
"variable": {
|
|
651
|
+
"kind": "Variable",
|
|
652
|
+
"name": {
|
|
653
|
+
"kind": "Name",
|
|
654
|
+
"value": "input"
|
|
655
|
+
}
|
|
656
|
+
},
|
|
657
|
+
"type": {
|
|
658
|
+
"kind": "NonNullType",
|
|
659
|
+
"type": {
|
|
660
|
+
"kind": "NamedType",
|
|
661
|
+
"name": {
|
|
662
|
+
"kind": "Name",
|
|
663
|
+
"value": "UpdateDataSilosInput"
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
}],
|
|
668
|
+
"selectionSet": {
|
|
669
|
+
"kind": "SelectionSet",
|
|
670
|
+
"selections": [{
|
|
671
|
+
"kind": "Field",
|
|
672
|
+
"name": {
|
|
673
|
+
"kind": "Name",
|
|
674
|
+
"value": "updateDataSilos"
|
|
675
|
+
},
|
|
676
|
+
"arguments": [{
|
|
677
|
+
"kind": "Argument",
|
|
678
|
+
"name": {
|
|
679
|
+
"kind": "Name",
|
|
680
|
+
"value": "input"
|
|
681
|
+
},
|
|
682
|
+
"value": {
|
|
683
|
+
"kind": "Variable",
|
|
684
|
+
"name": {
|
|
685
|
+
"kind": "Name",
|
|
686
|
+
"value": "input"
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
}],
|
|
690
|
+
"selectionSet": {
|
|
691
|
+
"kind": "SelectionSet",
|
|
692
|
+
"selections": [{
|
|
693
|
+
"kind": "Field",
|
|
694
|
+
"name": {
|
|
695
|
+
"kind": "Name",
|
|
696
|
+
"value": "dataSilos"
|
|
697
|
+
},
|
|
698
|
+
"selectionSet": {
|
|
699
|
+
"kind": "SelectionSet",
|
|
700
|
+
"selections": [
|
|
701
|
+
{
|
|
702
|
+
"kind": "Field",
|
|
703
|
+
"name": {
|
|
704
|
+
"kind": "Name",
|
|
705
|
+
"value": "id"
|
|
706
|
+
}
|
|
707
|
+
},
|
|
708
|
+
{
|
|
709
|
+
"kind": "Field",
|
|
710
|
+
"name": {
|
|
711
|
+
"kind": "Name",
|
|
712
|
+
"value": "title"
|
|
713
|
+
}
|
|
714
|
+
},
|
|
715
|
+
{
|
|
716
|
+
"kind": "Field",
|
|
717
|
+
"name": {
|
|
718
|
+
"kind": "Name",
|
|
719
|
+
"value": "type"
|
|
720
|
+
}
|
|
721
|
+
},
|
|
722
|
+
{
|
|
723
|
+
"kind": "Field",
|
|
724
|
+
"name": {
|
|
725
|
+
"kind": "Name",
|
|
726
|
+
"value": "description"
|
|
727
|
+
}
|
|
728
|
+
},
|
|
729
|
+
{
|
|
730
|
+
"kind": "Field",
|
|
731
|
+
"name": {
|
|
732
|
+
"kind": "Name",
|
|
733
|
+
"value": "isLive"
|
|
734
|
+
}
|
|
735
|
+
},
|
|
736
|
+
{
|
|
737
|
+
"kind": "Field",
|
|
738
|
+
"name": {
|
|
739
|
+
"kind": "Name",
|
|
740
|
+
"value": "createdAt"
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
]
|
|
744
|
+
}
|
|
745
|
+
}]
|
|
746
|
+
}
|
|
747
|
+
}]
|
|
748
|
+
}
|
|
749
|
+
}]
|
|
750
|
+
}
|
|
751
|
+
};
|
|
752
|
+
function graphql(source) {
|
|
753
|
+
return documents[source] ?? {};
|
|
754
|
+
}
|
|
755
|
+
//#endregion
|
|
342
756
|
//#region src/graphql.ts
|
|
757
|
+
const GetDataSiloDoc = graphql(`
|
|
758
|
+
query InventoryGetDataSilo($id: String!) {
|
|
759
|
+
dataSilo(id: $id) {
|
|
760
|
+
id
|
|
761
|
+
title
|
|
762
|
+
type
|
|
763
|
+
description
|
|
764
|
+
link
|
|
765
|
+
isLive
|
|
766
|
+
outerType
|
|
767
|
+
createdAt
|
|
768
|
+
connectionState
|
|
769
|
+
identifiers {
|
|
770
|
+
id
|
|
771
|
+
name
|
|
772
|
+
type
|
|
773
|
+
isRequiredInForm
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
`);
|
|
778
|
+
const CreateDataSilosDoc = graphql(`
|
|
779
|
+
mutation InventoryCreateDataSilos($input: [CreateDataSilosInput!]!) {
|
|
780
|
+
createDataSilos(input: $input) {
|
|
781
|
+
dataSilos {
|
|
782
|
+
id
|
|
783
|
+
title
|
|
784
|
+
type
|
|
785
|
+
description
|
|
786
|
+
isLive
|
|
787
|
+
createdAt
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
`);
|
|
792
|
+
const UpdateDataSilosDoc = graphql(`
|
|
793
|
+
mutation InventoryUpdateDataSilos($input: UpdateDataSilosInput!) {
|
|
794
|
+
updateDataSilos(input: $input) {
|
|
795
|
+
dataSilos {
|
|
796
|
+
id
|
|
797
|
+
title
|
|
798
|
+
type
|
|
799
|
+
description
|
|
800
|
+
isLive
|
|
801
|
+
createdAt
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
`);
|
|
806
|
+
function mapDataSilo(node) {
|
|
807
|
+
return {
|
|
808
|
+
id: node.id,
|
|
809
|
+
title: node.title,
|
|
810
|
+
type: node.type,
|
|
811
|
+
description: node.description ?? void 0,
|
|
812
|
+
isLive: node.isLive,
|
|
813
|
+
createdAt: node.createdAt
|
|
814
|
+
};
|
|
815
|
+
}
|
|
343
816
|
var InventoryMixin = class extends TranscendGraphQLBase {
|
|
344
817
|
async listDataSilos(options) {
|
|
345
818
|
return this.listConnection(`
|
|
@@ -351,6 +824,7 @@ var InventoryMixin = class extends TranscendGraphQLBase {
|
|
|
351
824
|
type
|
|
352
825
|
isLive
|
|
353
826
|
outerType
|
|
827
|
+
createdAt
|
|
354
828
|
}
|
|
355
829
|
totalCount
|
|
356
830
|
}
|
|
@@ -358,66 +832,33 @@ var InventoryMixin = class extends TranscendGraphQLBase {
|
|
|
358
832
|
`, "dataSilos", options);
|
|
359
833
|
}
|
|
360
834
|
async getDataSilo(id) {
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
`, { id })).dataSilo;
|
|
835
|
+
const silo = (await this.makeRequest(GetDataSiloDoc, { id })).dataSilo;
|
|
836
|
+
return {
|
|
837
|
+
id: silo.id,
|
|
838
|
+
title: silo.title,
|
|
839
|
+
type: silo.type,
|
|
840
|
+
description: silo.description ?? void 0,
|
|
841
|
+
link: silo.link ?? void 0,
|
|
842
|
+
isLive: silo.isLive,
|
|
843
|
+
outerType: silo.outerType ?? void 0,
|
|
844
|
+
createdAt: silo.createdAt,
|
|
845
|
+
identifiers: silo.identifiers?.map((idf) => ({
|
|
846
|
+
id: idf.id,
|
|
847
|
+
name: idf.name,
|
|
848
|
+
type: idf.type,
|
|
849
|
+
isRequiredInForm: idf.isRequiredInForm ?? void 0
|
|
850
|
+
}))
|
|
851
|
+
};
|
|
382
852
|
}
|
|
383
853
|
async createDataSilo(input) {
|
|
384
|
-
const created = (await this.makeRequest(
|
|
385
|
-
mutation CreateDataSilos($input: [CreateDataSilosInput!]!) {
|
|
386
|
-
createDataSilos(input: $input) {
|
|
387
|
-
dataSilos {
|
|
388
|
-
id
|
|
389
|
-
title
|
|
390
|
-
type
|
|
391
|
-
description
|
|
392
|
-
isLive
|
|
393
|
-
createdAt
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
`, { input: [input] })).createDataSilos.dataSilos[0];
|
|
854
|
+
const created = (await this.makeRequest(CreateDataSilosDoc, { input: [input] })).createDataSilos.dataSilos[0];
|
|
398
855
|
if (!created) throw new Error("createDataSilos returned an empty array");
|
|
399
|
-
return created;
|
|
856
|
+
return mapDataSilo(created);
|
|
400
857
|
}
|
|
401
858
|
async updateDataSilo(input) {
|
|
402
|
-
const
|
|
403
|
-
mutation UpdateDataSilos($input: UpdateDataSilosInput!) {
|
|
404
|
-
updateDataSilos(input: $input) {
|
|
405
|
-
dataSilos {
|
|
406
|
-
id
|
|
407
|
-
title
|
|
408
|
-
type
|
|
409
|
-
description
|
|
410
|
-
isLive
|
|
411
|
-
createdAt
|
|
412
|
-
updatedAt
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
`;
|
|
417
|
-
const wrappedInput = { dataSilos: [input] };
|
|
418
|
-
const updated = (await this.makeRequest(mutation, { input: wrappedInput })).updateDataSilos.dataSilos[0];
|
|
859
|
+
const updated = (await this.makeRequest(UpdateDataSilosDoc, { input: { dataSilos: [input] } })).updateDataSilos.dataSilos[0];
|
|
419
860
|
if (!updated) throw new Error("updateDataSilos returned an empty array");
|
|
420
|
-
return updated;
|
|
861
|
+
return mapDataSilo(updated);
|
|
421
862
|
}
|
|
422
863
|
async listVendors(options) {
|
|
423
864
|
return this.listConnection(`
|
|
@@ -505,6 +946,6 @@ var InventoryMixin = class extends TranscendGraphQLBase {
|
|
|
505
946
|
}
|
|
506
947
|
};
|
|
507
948
|
//#endregion
|
|
508
|
-
export {
|
|
949
|
+
export { ListVendorsSchema as a, ListDataSilosSchema as c, GetDataSiloSchema as d, CreateDataSiloSchema as f, UpdateDataSiloSchema as i, ListDataPointsSchema as l, INVENTORY_OAUTH_SCOPES as n, ListSubDataPointsSchema as o, getInventoryTools as r, ListIdentifiersSchema as s, InventoryMixin as t, ListCategoriesSchema as u };
|
|
509
950
|
|
|
510
|
-
//# sourceMappingURL=graphql-
|
|
951
|
+
//# sourceMappingURL=graphql-BJIrpomr.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql-BJIrpomr.mjs","names":["types.InventoryGetDataSiloDocument","types.InventoryCreateDataSilosDocument","types.InventoryUpdateDataSilosDocument"],"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/scopes.ts","../src/__generated__/graphql.ts","../src/__generated__/gql.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 dataSiloId: 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 ({ dataSiloId }) => {\n const result = await graphql.getDataSilo(dataSiloId);\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 dataPointId: 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 ({ dataPointId, limit, offset }) => {\n const result = await graphql.listSubDataPoints(dataPointId, {\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 dataSiloId: 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 ({ dataSiloId, title, description }) => {\n const result = await graphql.updateDataSilo({\n id: dataSiloId,\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 { ScopeName } from '@transcend-io/privacy-types';\n\n/** OAuth scopes required for Inventory MCP tools (offline_access added by base). */\nexport const INVENTORY_OAUTH_SCOPES = [\n ScopeName.ViewDataMap,\n ScopeName.ViewAssignedIntegrations,\n ScopeName.ManageDataMap,\n ScopeName.ManageAssignedIntegrations,\n ScopeName.ViewDataInventory,\n ScopeName.ViewAssignedDataInventory,\n ScopeName.ManageDataInventory,\n ScopeName.ManageAssignedDataInventory,\n] as const;\n","/* eslint-disable */\n/** Internal type. DO NOT USE DIRECTLY. */\ntype Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n/** Internal type. DO NOT USE DIRECTLY. */\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\nimport type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type AttributeInput = {\n key: string;\n values: Array<string>;\n};\n\nexport type ConsentManagerConnectionStatus =\n | 'DETECTED'\n | 'NOT_RECOMMENDED'\n | 'PARTIALLY_REGULATED'\n | 'PENDING_REGULATION'\n | 'POSSIBLE'\n | 'REGULATED'\n | 'UNDETERMINED'\n | 'VERY_LIKELY';\n\nexport type Controllership =\n | 'CONTROLLER'\n | 'JOINT_CONTROLLER'\n | 'PROCESSOR';\n\nexport type CreateDataSilosInput = {\n allowDsrProcessingEndTime?: string | null | undefined;\n allowDsrProcessingStartTime?: string | null | undefined;\n businessEntityIds?: Array<string | number> | null | undefined;\n businessEntityTitles?: Array<string> | null | undefined;\n controllerships?: Array<Controllership> | null | undefined;\n country?: string | null | undefined;\n countrySubDivision?: string | null | undefined;\n dataSiloDiscoveryResultId?: string | number | null | undefined;\n description?: string | null | undefined;\n name: string;\n plaintextContext?: string | null | undefined;\n pluginConfigurations?: string | null | undefined;\n pluginId?: string | number | null | undefined;\n region?: string | null | undefined;\n resourceId?: string | null | undefined;\n saaSCategoryIds?: Array<string | number> | null | undefined;\n sombraId?: string | number | null | undefined;\n title?: string | null | undefined;\n transferRegions?: Array<RegionInput> | null | undefined;\n};\n\nexport type CustomHeaderInput = {\n isSecret: boolean;\n name: string;\n value: string;\n};\n\nexport type CustomSiloConnectionStrategy =\n | 'CUSTOM_FUNCTION'\n | 'WEBHOOK';\n\nexport type DataProcessingAgreementStatus =\n | 'CUSTOM_DPA'\n | 'MISSING'\n | 'NOT_REQUIRED'\n | 'ONLINE_DPA'\n | 'REQUIRES_UPDATE';\n\nexport type DataSiloConnectionState =\n | 'CONNECTED'\n | 'EXPIRED'\n | 'INDEXING'\n | 'NOT_CONFIGURED'\n | 'PARTIAL'\n | 'PERMISSIONS_UPDATED';\n\nexport type DataSiloDeprecationState =\n | 'DEPRECATED'\n | 'IMPLEMENTATION'\n | 'IN_USE';\n\nexport type HasPersonalDataStatus =\n | 'LIKELY'\n | 'NO'\n | 'UNLIKELY'\n | 'UNSPECIFIED'\n | 'YES';\n\nexport type IdentifierType =\n | 'adobeAdvertisingCloudId'\n | 'adobeAudienceManagerId'\n | 'adobeExperienceCloudId'\n | 'adobeTargetId'\n | 'advertisingId'\n | 'amazonFireAdvertisingId'\n | 'braintreeCustomerId'\n | 'browserId'\n | 'chargebeeId'\n | 'coreIdentifier'\n | 'custom'\n | 'customerIoId'\n | 'email'\n | 'filestackHandle'\n | 'gaid'\n | 'idfa'\n | 'idfv'\n | 'linkedInURL'\n | 'microsoftAdvertisingId'\n | 'onfidoApplicantId'\n | 'personaReferenceId'\n | 'phone'\n | 'plaidProcessorToken'\n | 'recurlyId'\n | 'rida'\n | 'sprigVisitorId'\n | 'streamUserId'\n | 'stripeId'\n | 'talkableUUID'\n | 'thriveTrmContactId'\n | 'transcend'\n | 'veroUserId';\n\nexport type IsoCountryCode =\n | 'AD'\n | 'AE'\n | 'AF'\n | 'AG'\n | 'AI'\n | 'AL'\n | 'AM'\n | 'AO'\n | 'AQ'\n | 'AR'\n | 'AS'\n | 'AT'\n | 'AU'\n | 'AW'\n | 'AX'\n | 'AZ'\n | 'BA'\n | 'BB'\n | 'BD'\n | 'BE'\n | 'BF'\n | 'BG'\n | 'BH'\n | 'BI'\n | 'BJ'\n | 'BL'\n | 'BM'\n | 'BN'\n | 'BO'\n | 'BQ'\n | 'BR'\n | 'BS'\n | 'BT'\n | 'BV'\n | 'BW'\n | 'BY'\n | 'BZ'\n | 'CA'\n | 'CC'\n | 'CD'\n | 'CF'\n | 'CG'\n | 'CH'\n | 'CI'\n | 'CK'\n | 'CL'\n | 'CM'\n | 'CN'\n | 'CO'\n | 'CR'\n | 'CU'\n | 'CV'\n | 'CW'\n | 'CX'\n | 'CY'\n | 'CZ'\n | 'DE'\n | 'DJ'\n | 'DK'\n | 'DM'\n | 'DO'\n | 'DZ'\n | 'EC'\n | 'EE'\n | 'EG'\n | 'EH'\n | 'ER'\n | 'ES'\n | 'ET'\n | 'EU'\n | 'FI'\n | 'FJ'\n | 'FK'\n | 'FM'\n | 'FO'\n | 'FR'\n | 'GA'\n | 'GB'\n | 'GD'\n | 'GE'\n | 'GF'\n | 'GG'\n | 'GH'\n | 'GI'\n | 'GL'\n | 'GM'\n | 'GN'\n | 'GP'\n | 'GQ'\n | 'GR'\n | 'GS'\n | 'GT'\n | 'GU'\n | 'GW'\n | 'GY'\n | 'HK'\n | 'HM'\n | 'HN'\n | 'HR'\n | 'HT'\n | 'HU'\n | 'ID'\n | 'IE'\n | 'IL'\n | 'IM'\n | 'IN'\n | 'IO'\n | 'IQ'\n | 'IR'\n | 'IS'\n | 'IT'\n | 'JE'\n | 'JM'\n | 'JO'\n | 'JP'\n | 'KE'\n | 'KG'\n | 'KH'\n | 'KI'\n | 'KM'\n | 'KN'\n | 'KP'\n | 'KR'\n | 'KW'\n | 'KY'\n | 'KZ'\n | 'LA'\n | 'LB'\n | 'LC'\n | 'LI'\n | 'LK'\n | 'LR'\n | 'LS'\n | 'LT'\n | 'LU'\n | 'LV'\n | 'LY'\n | 'MA'\n | 'MC'\n | 'MD'\n | 'ME'\n | 'MF'\n | 'MG'\n | 'MH'\n | 'MK'\n | 'ML'\n | 'MM'\n | 'MN'\n | 'MO'\n | 'MP'\n | 'MQ'\n | 'MR'\n | 'MS'\n | 'MT'\n | 'MU'\n | 'MV'\n | 'MW'\n | 'MX'\n | 'MY'\n | 'MZ'\n | 'NA'\n | 'NC'\n | 'NE'\n | 'NF'\n | 'NG'\n | 'NI'\n | 'NL'\n | 'NO'\n | 'NP'\n | 'NR'\n | 'NU'\n | 'NZ'\n | 'OM'\n | 'PA'\n | 'PE'\n | 'PF'\n | 'PG'\n | 'PH'\n | 'PK'\n | 'PL'\n | 'PM'\n | 'PN'\n | 'PR'\n | 'PS'\n | 'PT'\n | 'PW'\n | 'PY'\n | 'QA'\n | 'RE'\n | 'RO'\n | 'RS'\n | 'RU'\n | 'RW'\n | 'SA'\n | 'SB'\n | 'SC'\n | 'SD'\n | 'SE'\n | 'SG'\n | 'SH'\n | 'SI'\n | 'SJ'\n | 'SK'\n | 'SL'\n | 'SM'\n | 'SN'\n | 'SO'\n | 'SR'\n | 'SS'\n | 'ST'\n | 'SV'\n | 'SX'\n | 'SY'\n | 'SZ'\n | 'TC'\n | 'TD'\n | 'TF'\n | 'TG'\n | 'TH'\n | 'TJ'\n | 'TK'\n | 'TL'\n | 'TM'\n | 'TN'\n | 'TO'\n | 'TR'\n | 'TT'\n | 'TV'\n | 'TW'\n | 'TZ'\n | 'UA'\n | 'UG'\n | 'UM'\n | 'US'\n | 'UY'\n | 'UZ'\n | 'VA'\n | 'VC'\n | 'VE'\n | 'VG'\n | 'VI'\n | 'VN'\n | 'VU'\n | 'WF'\n | 'WS'\n | 'YE'\n | 'YT'\n | 'ZA'\n | 'ZM'\n | 'ZW';\n\nexport type PlaintextContextInput = {\n name: string;\n value: string;\n};\n\nexport type PrivacyRequestConnectionStatus =\n | 'CONNECTED'\n | 'LIKELY'\n | 'NOT_RECOMMENDED'\n | 'PENDING_CONNECTION'\n | 'POSSIBLE'\n | 'UNDETERMINED'\n | 'VERY_LIKELY';\n\nexport type PromptAVendorEmailCompletionLinkType =\n | 'LOGGED_IN_USER'\n | 'NO_LINK_MARK_DATAPOINT_AS_RESOLVED'\n | 'UNAUTHENTICATED_EXTERNAL_USER';\n\nexport type PromptAVendorEmailSendType =\n | 'CROSS_DSR'\n | 'PER_DSR';\n\nexport type RegionInput = {\n country?: IsoCountryCode | null | undefined;\n countrySubDivision?: string | null | undefined;\n};\n\nexport type UpdateDataSiloInput = {\n allowDsrProcessingEndTime?: string | null | undefined;\n allowDsrProcessingStartTime?: string | null | undefined;\n apiKeyId?: string | number | null | undefined;\n attributes?: Array<AttributeInput> | null | undefined;\n businessEntityIds?: Array<string | number> | null | undefined;\n businessEntityTitles?: Array<string> | null | undefined;\n contactEmail?: string | null | undefined;\n contactName?: string | null | undefined;\n controllerships?: Array<Controllership> | null | undefined;\n country?: IsoCountryCode | null | undefined;\n countrySubDivision?: string | null | undefined;\n customSiloConnectionStrategy?: CustomSiloConnectionStrategy | null | undefined;\n dataProcessingAgreementLink?: string | null | undefined;\n dataProcessingAgreementStatus?: DataProcessingAgreementStatus | null | undefined;\n dataRetentionNote?: string | null | undefined;\n dataSubCategoryIds?: Array<string | number> | null | undefined;\n dataSubjectBlockListIds?: Array<string | number> | null | undefined;\n defaultAccessRequestVisibility?: boolean | null | undefined;\n dependedOnDataSiloIds?: Array<string | number> | null | undefined;\n dependedOnDataSiloTitles?: Array<string> | null | undefined;\n deprecationState?: DataSiloDeprecationState | null | undefined;\n description?: string | null | undefined;\n dsrProcessingDocumentation?: string | null | undefined;\n hasPersonalData?: HasPersonalDataStatus | null | undefined;\n headers?: Array<CustomHeaderInput> | null | undefined;\n id: string | number;\n identifiers?: Array<string> | null | undefined;\n isLive?: boolean | null | undefined;\n isPausedForDsrs?: boolean | null | undefined;\n manualWorkRetryFrequency?: string | null | undefined;\n manualWorkRetryStartAt?: string | null | undefined;\n notes?: string | null | undefined;\n notifyEmailAddress?: string | null | undefined;\n notifyWebhookUrl?: string | null | undefined;\n ownerEmails?: Array<string> | null | undefined;\n ownerIds?: Array<string | number> | null | undefined;\n plaintextContext?: Array<PlaintextContextInput> | null | undefined;\n processingActivityIds?: Array<string | number> | null | undefined;\n processingPurposeSubCategoryIds?: Array<string | number> | null | undefined;\n promptAVendorEmailCompletionLinkType?: PromptAVendorEmailCompletionLinkType | null | undefined;\n promptAVendorEmailIncludeIdentifiersAttachment?: boolean | null | undefined;\n promptAVendorEmailSendFrequency?: number | null | undefined;\n promptAVendorEmailSendType?: PromptAVendorEmailSendType | null | undefined;\n promptAVendorEmailStartAt?: string | null | undefined;\n promptEmailTemplateId?: string | number | null | undefined;\n receiverDataSiloIds?: Array<string | number> | null | undefined;\n recommendedForConsent?: ConsentManagerConnectionStatus | null | undefined;\n recommendedForPrivacy?: PrivacyRequestConnectionStatus | null | undefined;\n saaSCategoryIds?: Array<string | number> | null | undefined;\n sombraId?: string | number | null | undefined;\n teamNames?: Array<string> | null | undefined;\n teams?: Array<string | number> | null | undefined;\n title?: string | null | undefined;\n transferRegions?: Array<RegionInput> | null | undefined;\n url?: string | null | undefined;\n vendorId?: string | number | null | undefined;\n websiteUrl?: string | null | undefined;\n};\n\nexport type UpdateDataSilosInput = {\n dataSilos: Array<UpdateDataSiloInput>;\n};\n\nexport type InventoryGetDataSiloQueryVariables = Exact<{\n id: string;\n}>;\n\n\nexport type InventoryGetDataSiloQuery = { dataSilo: { id: string, title: string, type: string, description: string, link: string, isLive: boolean, outerType: string | null, createdAt: string, connectionState: DataSiloConnectionState, identifiers: Array<{ id: string, name: string, type: IdentifierType, isRequiredInForm: boolean }> } };\n\nexport type InventoryCreateDataSilosMutationVariables = Exact<{\n input: Array<CreateDataSilosInput> | CreateDataSilosInput;\n}>;\n\n\nexport type InventoryCreateDataSilosMutation = { createDataSilos: { dataSilos: Array<{ id: string, title: string, type: string, description: string, isLive: boolean, createdAt: string }> } };\n\nexport type InventoryUpdateDataSilosMutationVariables = Exact<{\n input: UpdateDataSilosInput;\n}>;\n\n\nexport type InventoryUpdateDataSilosMutation = { updateDataSilos: { dataSilos: Array<{ id: string, title: string, type: string, description: string, isLive: boolean, createdAt: string }> } };\n\n\nexport const InventoryGetDataSiloDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"InventoryGetDataSilo\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"dataSilo\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"link\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"isLive\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"outerType\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"createdAt\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"connectionState\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"identifiers\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"isRequiredInForm\"}}]}}]}}]}}]} as unknown as DocumentNode<InventoryGetDataSiloQuery, InventoryGetDataSiloQueryVariables>;\nexport const InventoryCreateDataSilosDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"InventoryCreateDataSilos\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"ListType\",\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"CreateDataSilosInput\"}}}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"createDataSilos\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"dataSilos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"isLive\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"createdAt\"}}]}}]}}]}}]} as unknown as DocumentNode<InventoryCreateDataSilosMutation, InventoryCreateDataSilosMutationVariables>;\nexport const InventoryUpdateDataSilosDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"InventoryUpdateDataSilos\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"UpdateDataSilosInput\"}}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updateDataSilos\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"dataSilos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"type\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"isLive\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"createdAt\"}}]}}]}}]}}]} as unknown as DocumentNode<InventoryUpdateDataSilosMutation, InventoryUpdateDataSilosMutationVariables>;","/* eslint-disable */\nimport * as types from './graphql.js';\nimport type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n \"\\n query InventoryGetDataSilo($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\": typeof types.InventoryGetDataSiloDocument,\n \"\\n mutation InventoryCreateDataSilos($input: [CreateDataSilosInput!]!) {\\n createDataSilos(input: $input) {\\n dataSilos {\\n id\\n title\\n type\\n description\\n isLive\\n createdAt\\n }\\n }\\n }\\n\": typeof types.InventoryCreateDataSilosDocument,\n \"\\n mutation InventoryUpdateDataSilos($input: UpdateDataSilosInput!) {\\n updateDataSilos(input: $input) {\\n dataSilos {\\n id\\n title\\n type\\n description\\n isLive\\n createdAt\\n }\\n }\\n }\\n\": typeof types.InventoryUpdateDataSilosDocument,\n};\nconst documents: Documents = {\n \"\\n query InventoryGetDataSilo($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\": types.InventoryGetDataSiloDocument,\n \"\\n mutation InventoryCreateDataSilos($input: [CreateDataSilosInput!]!) {\\n createDataSilos(input: $input) {\\n dataSilos {\\n id\\n title\\n type\\n description\\n isLive\\n createdAt\\n }\\n }\\n }\\n\": types.InventoryCreateDataSilosDocument,\n \"\\n mutation InventoryUpdateDataSilos($input: UpdateDataSilosInput!) {\\n updateDataSilos(input: $input) {\\n dataSilos {\\n id\\n title\\n type\\n description\\n isLive\\n createdAt\\n }\\n }\\n }\\n\": types.InventoryUpdateDataSilosDocument,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n *\n *\n * @example\n * ```ts\n * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);\n * ```\n *\n * The query argument is unknown!\n * Please regenerate the types.\n */\nexport function graphql(source: string): unknown;\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(source: \"\\n query InventoryGetDataSilo($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\"): (typeof documents)[\"\\n query InventoryGetDataSilo($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/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(source: \"\\n mutation InventoryCreateDataSilos($input: [CreateDataSilosInput!]!) {\\n createDataSilos(input: $input) {\\n dataSilos {\\n id\\n title\\n type\\n description\\n isLive\\n createdAt\\n }\\n }\\n }\\n\"): (typeof documents)[\"\\n mutation InventoryCreateDataSilos($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/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(source: \"\\n mutation InventoryUpdateDataSilos($input: UpdateDataSilosInput!) {\\n updateDataSilos(input: $input) {\\n dataSilos {\\n id\\n title\\n type\\n description\\n isLive\\n createdAt\\n }\\n }\\n }\\n\"): (typeof documents)[\"\\n mutation InventoryUpdateDataSilos($input: UpdateDataSilosInput!) {\\n updateDataSilos(input: $input) {\\n dataSilos {\\n id\\n title\\n type\\n description\\n isLive\\n createdAt\\n }\\n }\\n }\\n\"];\n\nexport function graphql(source: string) {\n return (documents as any)[source] ?? {};\n}\n\nexport type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode< infer TType, any> ? TType : never;","import {\n TranscendGraphQLBase,\n type DataCategory,\n type DataPoint,\n type DataSilo,\n type DataSiloCreateInput,\n type DataSiloDetails,\n type DataSiloType,\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\nimport { graphql } from './__generated__/gql.js';\n\n// The single-fetch operations (get/create/update) use the typed `graphql()`\n// tag so drift fails at compile time. The `list*` methods below intentionally\n// keep raw query strings because they route through `listConnection`, the\n// shared offset-pagination engine in mcp-server-base that also powers the\n// `all` (fetch-every-page) option.\nconst GetDataSiloDoc = graphql(/* GraphQL */ `\n query InventoryGetDataSilo($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\nconst CreateDataSilosDoc = graphql(/* GraphQL */ `\n mutation InventoryCreateDataSilos($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\n// `DataSilo.updatedAt` does not exist in the schema (only `createdAt` and\n// `deletedAt`). The previous selection requested it and would have errored\n// at runtime if Transcend's API used strict validation.\nconst UpdateDataSilosDoc = graphql(/* GraphQL */ `\n mutation InventoryUpdateDataSilos($input: UpdateDataSilosInput!) {\n updateDataSilos(input: $input) {\n dataSilos {\n id\n title\n type\n description\n isLive\n createdAt\n }\n }\n }\n`);\n\nfunction mapDataSilo<\n T extends {\n id: string;\n title: string;\n type: string;\n description?: string | null;\n isLive: boolean;\n createdAt: string;\n },\n>(node: T): DataSilo {\n return {\n id: node.id,\n title: node.title,\n type: node.type as DataSiloType,\n description: node.description ?? undefined,\n isLive: node.isLive,\n createdAt: node.createdAt,\n };\n}\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 createdAt\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 data = await this.makeRequest(GetDataSiloDoc, { id });\n const silo = data.dataSilo;\n return {\n id: silo.id,\n title: silo.title,\n type: silo.type as DataSiloType,\n description: silo.description ?? undefined,\n link: silo.link ?? undefined,\n isLive: silo.isLive,\n outerType: silo.outerType ?? undefined,\n createdAt: silo.createdAt,\n identifiers: silo.identifiers?.map((idf) => ({\n id: idf.id,\n name: idf.name,\n type: idf.type,\n isRequiredInForm: idf.isRequiredInForm ?? undefined,\n })),\n };\n }\n\n async createDataSilo(input: DataSiloCreateInput): Promise<DataSilo> {\n const data = await this.makeRequest(CreateDataSilosDoc, { input: [input as never] });\n const created = data.createDataSilos.dataSilos[0];\n if (!created) throw new Error('createDataSilos returned an empty array');\n return mapDataSilo(created);\n }\n\n async updateDataSilo(input: DataSiloUpdateInput): Promise<DataSilo> {\n const data = await this.makeRequest(UpdateDataSilosDoc, {\n input: { dataSilos: [input as never] },\n });\n const updated = data.updateDataSilos.dataSilos[0];\n if (!updated) throw new Error('updateDataSilos returned an empty array');\n return mapDataSilo(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
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { DataCategory, DataPoint, DataSilo, DataSiloCreateInput, DataSiloDetails, DataSiloUpdateInput, Identifier, ListOptions, PaginatedResponse, SubDataPoint, ToolClients, ToolDefinition, TranscendGraphQLBase, Vendor, z } from "@transcend-io/mcp-server-base";
|
|
2
|
+
import { ScopeName } from "@transcend-io/privacy-types";
|
|
2
3
|
|
|
3
4
|
//#region src/tools/index.d.ts
|
|
4
5
|
declare function getInventoryTools(clients: ToolClients): ToolDefinition[];
|
|
5
6
|
//#endregion
|
|
7
|
+
//#region src/scopes.d.ts
|
|
8
|
+
/** OAuth scopes required for Inventory MCP tools (offline_access added by base). */
|
|
9
|
+
declare const INVENTORY_OAUTH_SCOPES: readonly [ScopeName.ViewDataMap, ScopeName.ViewAssignedIntegrations, ScopeName.ManageDataMap, ScopeName.ManageAssignedIntegrations, ScopeName.ViewDataInventory, ScopeName.ViewAssignedDataInventory, ScopeName.ManageDataInventory, ScopeName.ManageAssignedDataInventory];
|
|
10
|
+
//#endregion
|
|
6
11
|
//#region src/graphql.d.ts
|
|
7
12
|
declare class InventoryMixin extends TranscendGraphQLBase {
|
|
8
13
|
listDataSilos(options?: ListOptions): Promise<PaginatedResponse<DataSilo>>;
|
|
@@ -24,7 +29,7 @@ type CreateDataSiloInput = z.infer<typeof CreateDataSiloSchema>;
|
|
|
24
29
|
//#endregion
|
|
25
30
|
//#region src/tools/inventory_get_data_silo.d.ts
|
|
26
31
|
declare const GetDataSiloSchema: z.ZodObject<{
|
|
27
|
-
|
|
32
|
+
dataSiloId: z.ZodString;
|
|
28
33
|
}, z.core.$strip>;
|
|
29
34
|
type GetDataSiloInput = z.infer<typeof GetDataSiloSchema>;
|
|
30
35
|
//#endregion
|
|
@@ -58,7 +63,7 @@ type ListIdentifiersInput = z.infer<typeof ListIdentifiersSchema>;
|
|
|
58
63
|
//#endregion
|
|
59
64
|
//#region src/tools/inventory_list_sub_data_points.d.ts
|
|
60
65
|
declare const ListSubDataPointsSchema: z.ZodObject<{
|
|
61
|
-
|
|
66
|
+
dataPointId: z.ZodString;
|
|
62
67
|
limit: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
|
|
63
68
|
offset: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
|
|
64
69
|
}, z.core.$strip>;
|
|
@@ -73,11 +78,11 @@ type ListVendorsInput = z.infer<typeof ListVendorsSchema>;
|
|
|
73
78
|
//#endregion
|
|
74
79
|
//#region src/tools/inventory_update_data_silo.d.ts
|
|
75
80
|
declare const UpdateDataSiloSchema: z.ZodObject<{
|
|
76
|
-
|
|
81
|
+
dataSiloId: z.ZodString;
|
|
77
82
|
title: z.ZodOptional<z.ZodString>;
|
|
78
83
|
description: z.ZodOptional<z.ZodString>;
|
|
79
84
|
}, z.core.$strip>;
|
|
80
85
|
type UpdateDataSiloInput = z.infer<typeof UpdateDataSiloSchema>;
|
|
81
86
|
//#endregion
|
|
82
|
-
export { type CreateDataSiloInput, CreateDataSiloSchema, type GetDataSiloInput, GetDataSiloSchema, InventoryMixin, type ListCategoriesInput, ListCategoriesSchema, type ListDataPointsInput, ListDataPointsSchema, type ListDataSilosInput, ListDataSilosSchema, type ListIdentifiersInput, ListIdentifiersSchema, type ListSubDataPointsInput, ListSubDataPointsSchema, type ListVendorsInput, ListVendorsSchema, type UpdateDataSiloInput, UpdateDataSiloSchema, getInventoryTools };
|
|
87
|
+
export { type CreateDataSiloInput, CreateDataSiloSchema, type GetDataSiloInput, GetDataSiloSchema, INVENTORY_OAUTH_SCOPES, InventoryMixin, type ListCategoriesInput, ListCategoriesSchema, type ListDataPointsInput, ListDataPointsSchema, type ListDataSilosInput, ListDataSilosSchema, type ListIdentifiersInput, ListIdentifiersSchema, type ListSubDataPointsInput, ListSubDataPointsSchema, type ListVendorsInput, ListVendorsSchema, type UpdateDataSiloInput, UpdateDataSiloSchema, getInventoryTools };
|
|
83
88
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -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":"
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/tools/index.ts","../src/scopes.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;;;;cCV5C,sBAAA,YAAsB,SAAA,CAAA,WAAA,EAAA,SAAA,CAAA,wBAAA,EAAA,SAAA,CAAA,aAAA,EAAA,SAAA,CAAA,0BAAA,EAAA,SAAA,CAAA,iBAAA,EAAA,SAAA,CAAA,yBAAA,EAAA,SAAA,CAAA,mBAAA,EAAA,SAAA,CAAA,2BAAA;;;cC+FtB,cAAA,SAAuB,oBAAA;EAC5B,aAAA,CAAc,OAAA,GAAU,WAAA,GAAc,OAAA,CAAQ,iBAAA,CAAkB,QAAA;EAmBhE,WAAA,CAAY,EAAA,WAAa,OAAA,CAAQ,eAAA;EAqBjC,cAAA,CAAe,KAAA,EAAO,mBAAA,GAAsB,OAAA,CAAQ,QAAA;EAOpD,cAAA,CAAe,KAAA,EAAO,mBAAA,GAAsB,OAAA,CAAQ,QAAA;EASpD,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;;;cCrPhE,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
|
|
2
|
-
export { CreateDataSiloSchema, GetDataSiloSchema, InventoryMixin, ListCategoriesSchema, ListDataPointsSchema, ListDataSilosSchema, ListIdentifiersSchema, ListSubDataPointsSchema, ListVendorsSchema, UpdateDataSiloSchema, getInventoryTools };
|
|
1
|
+
import { a as ListVendorsSchema, c as ListDataSilosSchema, d as GetDataSiloSchema, f as CreateDataSiloSchema, i as UpdateDataSiloSchema, l as ListDataPointsSchema, n as INVENTORY_OAUTH_SCOPES, o as ListSubDataPointsSchema, r as getInventoryTools, s as ListIdentifiersSchema, t as InventoryMixin, u as ListCategoriesSchema } from "./graphql-BJIrpomr.mjs";
|
|
2
|
+
export { CreateDataSiloSchema, GetDataSiloSchema, INVENTORY_OAUTH_SCOPES, 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
|
+
"version": "0.4.1",
|
|
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",
|
|
@@ -30,9 +30,12 @@
|
|
|
30
30
|
"access": "public"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
+
"@graphql-typed-document-node/core": "^3.2.0",
|
|
33
34
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
35
|
+
"graphql": "^16.14.0",
|
|
34
36
|
"zod": "^4.3.6",
|
|
35
|
-
"@transcend-io/mcp-server-base": "0.
|
|
37
|
+
"@transcend-io/mcp-server-base": "0.5.0",
|
|
38
|
+
"@transcend-io/privacy-types": "5.4.0"
|
|
36
39
|
},
|
|
37
40
|
"devDependencies": {
|
|
38
41
|
"@arethetypeswrong/cli": "^0.18.2",
|
|
@@ -1 +0,0 @@
|
|
|
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":";;AAUA,SAAgB,2BAA2B,SAAsB;CAC/D,MAAM,UAAU,QAAQ;AACxB,QAAO,WAAW;EAChB,MAAM;EACN,aACE;EACF,UAAU;EACV,UAAU;EACV,aAAa;GAAE,cAAc;GAAM,iBAAiB;GAAO,gBAAgB;GAAM;EACjF,WAAW;EACX,SAAS,OAAO,UAAU;GAGxB,MAAM,CAAC,iBAAiB,eAAe,mBAAmB,oBACxD,MAAM,QAAQ,IAAI;IAChB,QAAQ,cAAc,EAAE,KAAK,MAAM,CAAC;IACpC,QAAQ,YAAY,EAAE,KAAK,MAAM,CAAC;IAClC,QAAQ,gBAAgB,EAAE,KAAK,MAAM,CAAC;IACtC,QAAQ,mBAAmB,EAAE,KAAK,MAAM,CAAC;IAC1C,CAAC;GAEJ,MAAM,YAAY,gBAAgB;GAClC,MAAM,UAAU,cAAc;GAC9B,MAAM,cAAc,kBAAkB;GACtC,MAAM,aAAa,iBAAiB;GACpC,MAAM,kBAAkB,WAAW;GAEnC,MAAM,gBAAgB,UAAU,QAAQ,OAAO,GAAG,OAAO;AAEzD,UAAO,iBAAiB,MAAM;IAC5B,SAAS;KACP,gBAAgB,UAAU;KAC1B,eAAe,cAAc;KAC7B,cAAc,QAAQ;KACtB,kBAAkB,YAAY;KAC9B;KACD;IACD,WAAW;KACT,iBAAiB,QAAQ,WAAW,OAAO;KAC3C,sBAAsB,QACpB,UAAU,QAAQ,OAAO,GAAG,UAAU,EACtC,YACD;KACF;IACD,gBAAgB,YAAY,MAAM,GAAG,GAAG,CAAC,KAAK,QAAQ;KACpD,MAAM,GAAG;KACT,MAAM,GAAG;KACT,YAAY,GAAG;KAChB,EAAE;IACH,eAAe,WAAW,MAAM,GAAG,GAAG,CAAC,KAAK,SAAS;KACnD,MAAM,IAAI;KACV,UAAU,IAAI;KACf,EAAE;IACH,iBAAiB;KACf,UAAU,WAAW,IAAI,8CAA8C;KACvE,cAAc,SAAS,UAAU,SAC7B,GAAG,UAAU,SAAS,cAAc,OAAO,uDAC3C;KACJ,QAAQ,WAAW,IAAI,qDAAqD;KAC7E,CAAC,OAAO,QAAQ;IAClB,CAAC;;EAEL,CAAC;;;;ACpEJ,MAAa,uBAAuB,EAAE,OAAO,EAC3C,OAAO,EACJ,QAAQ,CACR,SACC,wHACD,EACJ,CAAC;AAGF,SAAgB,kCAAkC,SAAsB;CACtE,MAAM,UAAU,QAAQ;AACxB,QAAO,WAAW;EAChB,MAAM;EACN,aACE;EACF,UAAU;EACV,UAAU;EACV,kBAAkB;EAClB,aAAa;GAAE,cAAc;GAAO,iBAAiB;GAAM,gBAAgB;GAAO;EAClF,WAAW;EACX,SAAS,OAAO,EAAE,YAAY;AAI5B,UAAO,iBAAiB,MAAM;IAC5B,UAJa,MAAM,QAAQ,eAAe,EAC1C,MAAM,OACP,CAAC;IAGA,SAAS,cAAc,MAAM;IAC9B,CAAC;;EAEL,CAAC;;;;AC7BJ,MAAa,oBAAoB,EAAE,OAAO,EACxC,cAAc,EAAE,QAAQ,CAAC,SAAS,kCAAkC,EACrE,CAAC;AAGF,SAAgB,+BAA+B,SAAsB;CACnE,MAAM,UAAU,QAAQ;AACxB,QAAO,WAAW;EAChB,MAAM;EACN,aACE;EACF,UAAU;EACV,UAAU;EACV,aAAa;GAAE,cAAc;GAAM,iBAAiB;GAAO,gBAAgB;GAAM;EACjF,WAAW;EACX,SAAS,OAAO,EAAE,mBAAmB;AAEnC,UAAO,iBAAiB,MADT,MAAM,QAAQ,YAAY,aAAa,CACjB;;EAExC,CAAC;;;;ACnBJ,MAAa,uBAAuB,EAAE,OAAO;CAC3C,OAAO,EAAE,OACN,QAAQ,CACR,IAAI,EAAE,CACN,IAAI,IAAI,CACR,UAAU,CACV,QAAQ,GAAG,CACX,SAAS,wCAAwC;CACpD,QAAQ,EAAE,OACP,QAAQ,CACR,IAAI,EAAE,CACN,UAAU,CACV,QAAQ,EAAE,CACV,SAAS,wDAAwD;CACrE,CAAC;AAGF,SAAgB,kCAAkC,SAAsB;CACtE,MAAM,UAAU,QAAQ;AACxB,QAAO,WAAW;EAChB,MAAM;EACN,aACE;EACF,UAAU;EACV,UAAU;EACV,aAAa;GAAE,cAAc;GAAM,iBAAiB;GAAO,gBAAgB;GAAM;EACjF,WAAW;EACX,SAAS,OAAO,EAAE,OAAO,aAAa;GACpC,MAAM,SAAS,MAAM,QAAQ,mBAAmB;IAC9C,OAAO;IACP;IACD,CAAC;AAEF,UAAO,iBAAiB,OAAO,OAAO;IACpC,YAAY,OAAO;IACnB,aAAa,OAAO,UAAU;IAC/B,CAAC;;EAEL,CAAC;;;;ACtCJ,MAAa,uBAAuB,EAAE,OAAO;CAC3C,OAAO,EAAE,OACN,QAAQ,CACR,IAAI,EAAE,CACN,IAAI,IAAI,CACR,UAAU,CACV,QAAQ,GAAG,CACX,SAAS,wCAAwC;CACpD,QAAQ,EAAE,OACP,QAAQ,CACR,IAAI,EAAE,CACN,UAAU,CACV,QAAQ,EAAE,CACV,SAAS,wDAAwD;CACrE,CAAC;AAGF,SAAgB,kCAAkC,SAAsB;CACtE,MAAM,UAAU,QAAQ;AACxB,QAAO,WAAW;EAChB,MAAM;EACN,aACE;EACF,UAAU;EACV,UAAU;EACV,aAAa;GAAE,cAAc;GAAM,iBAAiB;GAAO,gBAAgB;GAAM;EACjF,WAAW;EACX,SAAS,OAAO,EAAE,OAAO,aAAa;GACpC,MAAM,SAAS,MAAM,QAAQ,eAC3B,KAAA,GACA;IACE,OAAO;IACP;IACD,CACF;AAED,UAAO,iBAAiB,OAAO,OAAO;IACpC,YAAY,OAAO;IACnB,aAAa,OAAO,UAAU;IAC/B,CAAC;;EAEL,CAAC;;;;ACzCJ,MAAa,sBAAsB,EAAE,OAAO;CAC1C,OAAO,EAAE,OACN,QAAQ,CACR,IAAI,EAAE,CACN,IAAI,IAAI,CACR,UAAU,CACV,QAAQ,GAAG,CACX,SAAS,wCAAwC;CACpD,QAAQ,EAAE,OACP,QAAQ,CACR,IAAI,EAAE,CACN,UAAU,CACV,QAAQ,EAAE,CACV,SAAS,wDAAwD;CACrE,CAAC;AAGF,SAAgB,iCAAiC,SAAsB;CACrE,MAAM,UAAU,QAAQ;AACxB,QAAO,WAAW;EAChB,MAAM;EACN,aACE;EACF,UAAU;EACV,UAAU;EACV,aAAa;GAAE,cAAc;GAAM,iBAAiB;GAAO,gBAAgB;GAAM;EACjF,WAAW;EACX,SAAS,OAAO,EAAE,OAAO,aAAa;GACpC,MAAM,SAAS,MAAM,QAAQ,cAAc;IACzC,OAAO;IACP;IACD,CAAC;AAEF,UAAO,iBAAiB,OAAO,OAAO;IACpC,YAAY,OAAO;IACnB,aAAa,OAAO,UAAU;IAC/B,CAAC;;EAEL,CAAC;;;;ACtCJ,MAAa,wBAAwB,EAAE,OAAO;CAC5C,OAAO,EAAE,OACN,QAAQ,CACR,IAAI,EAAE,CACN,IAAI,IAAI,CACR,UAAU,CACV,QAAQ,GAAG,CACX,SAAS,wCAAwC;CACpD,QAAQ,EAAE,OACP,QAAQ,CACR,IAAI,EAAE,CACN,UAAU,CACV,QAAQ,EAAE,CACV,SAAS,wDAAwD;CACrE,CAAC;AAGF,SAAgB,mCAAmC,SAAsB;CACvE,MAAM,UAAU,QAAQ;AACxB,QAAO,WAAW;EAChB,MAAM;EACN,aACE;EACF,UAAU;EACV,UAAU;EACV,aAAa;GAAE,cAAc;GAAM,iBAAiB;GAAO,gBAAgB;GAAM;EACjF,WAAW;EACX,SAAS,OAAO,EAAE,OAAO,aAAa;GACpC,MAAM,SAAS,MAAM,QAAQ,gBAAgB;IAC3C,OAAO;IACP;IACD,CAAC;AAEF,UAAO,iBAAiB,OAAO,OAAO;IACpC,YAAY,OAAO;IACnB,aAAa,OAAO,UAAU;IAC/B,CAAC;;EAEL,CAAC;;;;ACtCJ,MAAa,0BAA0B,EAAE,OAAO;CAC9C,eAAe,EAAE,QAAQ,CAAC,SAAS,8BAA8B;CACjE,OAAO,EAAE,OACN,QAAQ,CACR,IAAI,EAAE,CACN,IAAI,IAAI,CACR,UAAU,CACV,QAAQ,GAAG,CACX,SAAS,wCAAwC;CACpD,QAAQ,EAAE,OACP,QAAQ,CACR,IAAI,EAAE,CACN,UAAU,CACV,QAAQ,EAAE,CACV,SAAS,yCAAyC;CACtD,CAAC;AAGF,SAAgB,qCAAqC,SAAsB;CACzE,MAAM,UAAU,QAAQ;AACxB,QAAO,WAAW;EAChB,MAAM;EACN,aACE;EACF,UAAU;EACV,UAAU;EACV,aAAa;GAAE,cAAc;GAAM,iBAAiB;GAAO,gBAAgB;GAAM;EACjF,WAAW;EACX,SAAS,OAAO,EAAE,eAAe,OAAO,aAAa;GACnD,MAAM,SAAS,MAAM,QAAQ,kBAAkB,eAAe;IAC5D,OAAO;IACP;IACD,CAAC;AAEF,UAAO,iBAAiB,OAAO,OAAO;IACpC,YAAY,OAAO;IACnB,aAAa,OAAO,UAAU;IAC/B,CAAC;;EAEL,CAAC;;;;ACvCJ,MAAa,oBAAoB,EAAE,OAAO;CACxC,OAAO,EAAE,OACN,QAAQ,CACR,IAAI,EAAE,CACN,IAAI,IAAI,CACR,UAAU,CACV,QAAQ,GAAG,CACX,SAAS,wCAAwC;CACpD,QAAQ,EAAE,OACP,QAAQ,CACR,IAAI,EAAE,CACN,UAAU,CACV,QAAQ,EAAE,CACV,SAAS,wDAAwD;CACrE,CAAC;AAGF,SAAgB,+BAA+B,SAAsB;CACnE,MAAM,UAAU,QAAQ;AACxB,QAAO,WAAW;EAChB,MAAM;EACN,aACE;EACF,UAAU;EACV,UAAU;EACV,aAAa;GAAE,cAAc;GAAM,iBAAiB;GAAO,gBAAgB;GAAM;EACjF,WAAW;EACX,SAAS,OAAO,EAAE,OAAO,aAAa;GACpC,MAAM,SAAS,MAAM,QAAQ,YAAY;IACvC,OAAO;IACP;IACD,CAAC;AAEF,UAAO,iBAAiB,OAAO,OAAO;IACpC,YAAY,OAAO;IACnB,aAAa,OAAO,UAAU;IAC/B,CAAC;;EAEL,CAAC;;;;ACtCJ,MAAa,uBAAuB,EAAE,OAAO;CAC3C,cAAc,EAAE,QAAQ,CAAC,SAAS,gCAAgC;CAClE,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,8BAA8B;CACpE,aAAa,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,kBAAkB;CAC/D,CAAC;AAGF,SAAgB,kCAAkC,SAAsB;CACtE,MAAM,UAAU,QAAQ;AACxB,QAAO,WAAW;EAChB,MAAM;EACN,aAAa;EACb,UAAU;EACV,UAAU;EACV,kBAAkB;EAClB,aAAa;GAAE,cAAc;GAAO,iBAAiB;GAAO,gBAAgB;GAAM;EAClF,WAAW;EACX,SAAS,OAAO,EAAE,cAAc,OAAO,kBAAkB;AAMvD,UAAO,iBAAiB,MAAM;IAC5B,UANa,MAAM,QAAQ,eAAe;KAC1C,IAAI;KACJ;KACA;KACD,CAAC;IAGA,SAAS;IACV,CAAC;;EAEL,CAAC;;;;ACnBJ,SAAgB,kBAAkB,SAAwC;AACxE,QAAO;EACL,iCAAiC,QAAQ;EACzC,+BAA+B,QAAQ;EACvC,kCAAkC,QAAQ;EAC1C,kCAAkC,QAAQ;EAC1C,+BAA+B,QAAQ;EACvC,kCAAkC,QAAQ;EAC1C,qCAAqC,QAAQ;EAC7C,mCAAmC,QAAQ;EAC3C,kCAAkC,QAAQ;EAC1C,2BAA2B,QAAQ;EACpC;;;;ACVH,IAAa,iBAAb,cAAoC,qBAAqB;CACvD,MAAM,cAAc,SAA6D;AAe/E,SAAO,KAAK,eAdE;;;;;;;;;;;;;OAc8B,aAAa,QAAQ;;CAGnE,MAAM,YAAY,IAAsC;AAuBtD,UADa,MAAM,KAAK,YArBV;;;;;;;;;;;;;;;;;;;;OAqB4D,EAAE,IAAI,CAAC,EACrE;;CAGd,MAAM,eAAe,OAA+C;EAkBlE,MAAM,WAHO,MAAM,KAAK,YAdP;;;;;;;;;;;;;OAc6E,EAC5F,OAAO,CAAC,MAAM,EACf,CAAC,EACmB,gBAAgB,UAAU;AAC/C,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,0CAA0C;AACxE,SAAO;;CAGT,MAAM,eAAe,OAA+C;EAClE,MAAM,WAAW;;;;;;;;;;;;;;;EAejB,MAAM,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE;EAI3C,MAAM,WAHO,MAAM,KAAK,YAA4D,UAAU,EAC5F,OAAO,cACR,CAAC,EACmB,gBAAgB,UAAU;AAC/C,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,0CAA0C;AACxE,SAAO;;CAGT,MAAM,YAAY,SAA2D;AAY3E,SAAO,KAAK,eAXE;;;;;;;;;;OAW4B,WAAW,QAAQ;;CAG/D,MAAM,eACJ,aACA,SACuC;EACvC,MAAM,QAAQ;;;;;;;;;;;;;;;;;EAuBd,MAAM,eAAe,QAAiC;GACpD,IAAI,GAAG;GACP,MAAM,GAAG;GACT,OAAO,GAAG,OAAO;GACjB,aAAa,GAAG,aAAa;GAC7B,4BAAW,IAAI,MAAM,EAAC,aAAa;GACnC,4BAAW,IAAI,MAAM,EAAC,aAAa;GACpC;AACD,SAAO,KAAK,eAAwC,OAAO,cAAc,SAAS,EAChF,SAAS,aACV,CAAC;;CAGJ,MAAM,kBACJ,aACA,SAC0C;AAc1C,SAAO,KAAK,eAbE;;;;;;;;;;;;OAakC,iBAAiB,SAAS,EACxE,WAAW,EAAE,UAAU,EAAE,YAAY,CAAC,YAAY,EAAE,EAAE,EACvD,CAAC;;CAGJ,MAAM,gBAAgB,SAA+D;AAcnF,SAAO,KAAK,eAbE;;;;;;;;;;;;OAagC,eAAe,QAAQ;;CAGvE,MAAM,mBAAmB,SAAiE;AAYxF,SAAO,KAAK,eAXE;;;;;;;;;;OAWkC,kBAAkB,QAAQ"}
|