@transcend-io/mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +117 -0
- package/dist/cli.d.mts +1 -0
- package/dist/cli.mjs +71 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/index.d.mts +88 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +2 -0
- package/dist/registry-DFjwwbrC.mjs +106 -0
- package/dist/registry-DFjwwbrC.mjs.map +1 -0
- package/package.json +63 -0
package/README.md
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# @transcend-io/mcp
|
|
2
|
+
|
|
3
|
+
> **Alpha** — this package is under active development and has not yet been published to npm. APIs may change without notice.
|
|
4
|
+
|
|
5
|
+
Unified Transcend MCP Server that combines all domain tools into a single server. This is the "everything in one place" option — install this package when you want access to all 70+ Transcend tools at once.
|
|
6
|
+
|
|
7
|
+
Requires **Node.js ≥ 22.12** (see `engines` in `package.json`).
|
|
8
|
+
|
|
9
|
+
For local runs from this repository, copy [`secret.env.example`](../../../secret.env.example) to **`secret.env`** at the repo root (gitignored) and set your API key (see **Run from the monorepo**).
|
|
10
|
+
|
|
11
|
+
## Install
|
|
12
|
+
|
|
13
|
+
When the package is available on npm, install the CLI globally:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install -g @transcend-io/mcp
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Until then, run from a checkout of this repository (see **Run from the monorepo** below).
|
|
20
|
+
|
|
21
|
+
## Usage
|
|
22
|
+
|
|
23
|
+
### stdio (local, default)
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# With TRANSCEND_API_KEY in the environment; from the monorepo use secret.env (see Run from the monorepo)
|
|
27
|
+
TRANSCEND_API_KEY=your-api-key transcend-mcp
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
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.
|
|
31
|
+
|
|
32
|
+
### HTTP (remote hosting)
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
TRANSCEND_API_KEY=your-api-key transcend-mcp --transport http --port 3000
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
This starts a Streamable HTTP server at `http://127.0.0.1:3000/mcp` with a health check at `/health`. See [DEPLOYMENT.md](../DEPLOYMENT.md) for Docker, reverse proxy, and production deployment patterns.
|
|
39
|
+
|
|
40
|
+
### Environment variables
|
|
41
|
+
|
|
42
|
+
| Variable | Required | Default | Description |
|
|
43
|
+
| ------------------------------ | ----------- | ------------------------------------------ | ----------------------------------------------- |
|
|
44
|
+
| `TRANSCEND_API_KEY` | Yes (stdio) | — | Transcend API key (HTTP: fallback if no header) |
|
|
45
|
+
| `TRANSCEND_API_URL` | No | `https://multi-tenant.sombra.transcend.io` | Sombra API URL |
|
|
46
|
+
| `TRANSCEND_GRAPHQL_URL` | No | `https://api.transcend.io` | GraphQL API URL |
|
|
47
|
+
| `TRANSCEND_HTTP_PORT` | No | `3000` | HTTP listen port |
|
|
48
|
+
| `TRANSCEND_HTTP_HOST` | No | `127.0.0.1` | HTTP listen host |
|
|
49
|
+
| `TRANSCEND_MCP_CORS_ORIGINS` | No | — | Comma-separated allowed CORS origins |
|
|
50
|
+
| `TRANSCEND_MCP_SESSION_TTL_MS` | No | `1800000` | Idle session timeout (ms) |
|
|
51
|
+
|
|
52
|
+
### MCP client configuration (stdio)
|
|
53
|
+
|
|
54
|
+
`npx` runs the package’s `transcend-mcp` binary (see `bin` in `package.json`). Add to your MCP client config (for example Claude Desktop or Cursor):
|
|
55
|
+
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"mcpServers": {
|
|
59
|
+
"transcend": {
|
|
60
|
+
"command": "npx",
|
|
61
|
+
"args": ["-y", "@transcend-io/mcp"],
|
|
62
|
+
"env": {
|
|
63
|
+
"TRANSCEND_API_KEY": "your-api-key"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
When developing in this repository, reuse the same variable names from root **`secret.env`** in the `env` block, or use your client’s env-file support if it has one.
|
|
71
|
+
|
|
72
|
+
### Run from the monorepo
|
|
73
|
+
|
|
74
|
+
1. **Credentials** — From the repository root, copy [`secret.env.example`](../../../secret.env.example) to **`secret.env`** and set `TRANSCEND_API_KEY` (and optional URL overrides).
|
|
75
|
+
|
|
76
|
+
2. **Build and run** — `node ./dist/cli.mjs` matches the `transcend-mcp` `bin` (use `node` because `pnpm exec transcend-mcp` may not resolve this package’s own binary in a pnpm workspace):
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# from the repository root — builds the unified server, all domain packages, and mcp-server-core
|
|
80
|
+
pnpm exec turbo run build --filter="@transcend-io/mcp..."
|
|
81
|
+
set -a && source ./secret.env && set +a
|
|
82
|
+
pnpm -F @transcend-io/mcp exec node ./dist/cli.mjs
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Alternative:** `./scripts/mcp-run.sh ./packages/mcp/mcp/dist/cli.mjs` (sources `secret.env` when present; run after build).
|
|
86
|
+
|
|
87
|
+
See [CONTRIBUTING.md](../../../CONTRIBUTING.md#mcp-servers) for workspace layout and `pnpm --filter` workflows.
|
|
88
|
+
|
|
89
|
+
### Environment variables
|
|
90
|
+
|
|
91
|
+
| Variable | Required | Default | Description |
|
|
92
|
+
| ----------------------- | -------- | ------------------------------------------ | ----------------- |
|
|
93
|
+
| `TRANSCEND_API_KEY` | Yes | — | Transcend API key |
|
|
94
|
+
| `TRANSCEND_API_URL` | No | `https://multi-tenant.sombra.transcend.io` | Sombra API URL |
|
|
95
|
+
| `TRANSCEND_GRAPHQL_URL` | No | `https://api.transcend.io` | GraphQL API URL |
|
|
96
|
+
|
|
97
|
+
**Monorepo:** keep these in root **`secret.env`** (from [`secret.env.example`](../../../secret.env.example)); see **Run from the monorepo**.
|
|
98
|
+
|
|
99
|
+
## Architecture
|
|
100
|
+
|
|
101
|
+
This package composes all domain MCP packages via `ToolRegistry`, which aggregates tools from each domain (`getConsentTools`, `getDSRTools`, etc.) into a single tool namespace. A composed `TranscendGraphQLClient` mixes in all domain GraphQL capabilities so each tool has access to the API surface it needs.
|
|
102
|
+
|
|
103
|
+
If 70+ tools is too many for your AI agent, install individual domain packages instead — see the [MCP section of the root README](../../../README.md#mcp-servers).
|
|
104
|
+
|
|
105
|
+
## Related packages
|
|
106
|
+
|
|
107
|
+
| Package | Binary | Domain |
|
|
108
|
+
| -------------------------------------- | --------------------------- | --------------------------------- |
|
|
109
|
+
| `@transcend-io/mcp-server-admin` | `transcend-mcp-admin` | Organization, users, API keys |
|
|
110
|
+
| `@transcend-io/mcp-server-assessments` | `transcend-mcp-assessments` | Privacy assessments |
|
|
111
|
+
| `@transcend-io/mcp-server-consent` | `transcend-mcp-consent` | Consent management, cookie triage |
|
|
112
|
+
| `@transcend-io/mcp-server-core` | — | Shared infrastructure |
|
|
113
|
+
| `@transcend-io/mcp-server-discovery` | `transcend-mcp-discovery` | Data discovery, classification |
|
|
114
|
+
| `@transcend-io/mcp-server-dsr` | `transcend-mcp-dsr` | Data subject requests |
|
|
115
|
+
| `@transcend-io/mcp-server-inventory` | `transcend-mcp-inventory` | Data inventory, silos, vendors |
|
|
116
|
+
| `@transcend-io/mcp-server-preferences` | `transcend-mcp-preferences` | Privacy preferences |
|
|
117
|
+
| `@transcend-io/mcp-server-workflows` | `transcend-mcp-workflows` | Workflow configuration |
|
package/dist/cli.d.mts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
package/dist/cli.mjs
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { n as TranscendGraphQLClient, t as ToolRegistry } from "./registry-DFjwwbrC.mjs";
|
|
3
|
+
import { SimpleLogger, TranscendRestClient, buildMcpServer, parseTransportArgs, resolveAuth, runMcpHttp } from "@transcend-io/mcp-server-core";
|
|
4
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
|
+
//#region src/cli.ts
|
|
6
|
+
const VERSION = "3.0.2";
|
|
7
|
+
function createToolRegistry(auth, sombraUrl, graphqlUrl) {
|
|
8
|
+
return new ToolRegistry({
|
|
9
|
+
rest: new TranscendRestClient(auth, sombraUrl),
|
|
10
|
+
graphql: new TranscendGraphQLClient(auth, graphqlUrl)
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
async function main() {
|
|
14
|
+
const logger = new SimpleLogger();
|
|
15
|
+
const config = parseTransportArgs();
|
|
16
|
+
const sombraUrl = process.env.TRANSCEND_API_URL || "https://multi-tenant.sombra.transcend.io";
|
|
17
|
+
const graphqlUrl = process.env.TRANSCEND_GRAPHQL_URL || "https://api.transcend.io";
|
|
18
|
+
if (config.transport === "http") {
|
|
19
|
+
await runMcpHttp({
|
|
20
|
+
name: "transcend-mcp",
|
|
21
|
+
version: VERSION,
|
|
22
|
+
createServer: async (auth) => {
|
|
23
|
+
logger.info("Creating unified MCP server for new HTTP session...", {
|
|
24
|
+
sombraUrl,
|
|
25
|
+
graphqlUrl,
|
|
26
|
+
authType: auth?.type ?? "none"
|
|
27
|
+
});
|
|
28
|
+
return buildMcpServer({
|
|
29
|
+
name: "transcend-mcp",
|
|
30
|
+
version: VERSION,
|
|
31
|
+
tools: createToolRegistry(auth, sombraUrl, graphqlUrl).getAllTools()
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}, config);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const auth = resolveAuth();
|
|
38
|
+
logger.info("Initializing Transcend API clients...", {
|
|
39
|
+
sombraUrl,
|
|
40
|
+
graphqlUrl
|
|
41
|
+
});
|
|
42
|
+
const toolRegistry = createToolRegistry(auth, sombraUrl, graphqlUrl);
|
|
43
|
+
logger.info(`Registered ${toolRegistry.getToolCount()} tools across ${toolRegistry.getCategories().length} categories`, {
|
|
44
|
+
categories: toolRegistry.getCategories(),
|
|
45
|
+
toolCount: toolRegistry.getToolCount()
|
|
46
|
+
});
|
|
47
|
+
const server = buildMcpServer({
|
|
48
|
+
name: "transcend-mcp",
|
|
49
|
+
version: VERSION,
|
|
50
|
+
tools: toolRegistry.getAllTools()
|
|
51
|
+
});
|
|
52
|
+
logger.info(`Starting Transcend MCP Server v${VERSION}...`, {
|
|
53
|
+
toolCount: toolRegistry.getToolCount(),
|
|
54
|
+
categories: toolRegistry.getCategories()
|
|
55
|
+
});
|
|
56
|
+
const transport = new StdioServerTransport();
|
|
57
|
+
await server.connect(transport);
|
|
58
|
+
logger.info("Transcend MCP Server started successfully", {
|
|
59
|
+
sombraUrl,
|
|
60
|
+
graphqlUrl,
|
|
61
|
+
tools: toolRegistry.getToolCount()
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
main().catch((error) => {
|
|
65
|
+
new SimpleLogger().error("Failed to start server:", error);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
});
|
|
68
|
+
//#endregion
|
|
69
|
+
export {};
|
|
70
|
+
|
|
71
|
+
//# sourceMappingURL=cli.mjs.map
|
package/dist/cli.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.mjs","names":[],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n buildMcpServer,\n parseTransportArgs,\n resolveAuth,\n runMcpHttp,\n SimpleLogger,\n TranscendRestClient,\n type AuthCredentials,\n} from '@transcend-io/mcp-server-core';\n\nimport { TranscendGraphQLClient } from './graphql-client.js';\nimport { ToolRegistry } from './registry.js';\n\nconst VERSION = '3.0.2';\n\nfunction createToolRegistry(\n auth: AuthCredentials | null,\n sombraUrl: string,\n graphqlUrl: string,\n): ToolRegistry {\n const restClient = new TranscendRestClient(auth, sombraUrl);\n const graphqlClient = new TranscendGraphQLClient(auth, graphqlUrl);\n return new ToolRegistry({ rest: restClient, graphql: graphqlClient });\n}\n\nasync function main(): Promise<void> {\n const logger = new SimpleLogger();\n const config = parseTransportArgs();\n const sombraUrl = process.env.TRANSCEND_API_URL || 'https://multi-tenant.sombra.transcend.io';\n const graphqlUrl = process.env.TRANSCEND_GRAPHQL_URL || 'https://api.transcend.io';\n\n if (config.transport === 'http') {\n await runMcpHttp(\n {\n name: 'transcend-mcp',\n version: VERSION,\n createServer: async (auth) => {\n logger.info('Creating unified MCP server for new HTTP session...', {\n sombraUrl,\n graphqlUrl,\n authType: auth?.type ?? 'none',\n });\n const registry = createToolRegistry(auth, sombraUrl, graphqlUrl);\n return buildMcpServer({\n name: 'transcend-mcp',\n version: VERSION,\n tools: registry.getAllTools(),\n });\n },\n },\n config,\n );\n return;\n }\n\n // stdio mode\n const auth = resolveAuth();\n logger.info('Initializing Transcend API clients...', { sombraUrl, graphqlUrl });\n\n const toolRegistry = createToolRegistry(auth, sombraUrl, graphqlUrl);\n\n logger.info(\n `Registered ${toolRegistry.getToolCount()} tools across ${toolRegistry.getCategories().length} categories`,\n {\n categories: toolRegistry.getCategories(),\n toolCount: toolRegistry.getToolCount(),\n },\n );\n\n const server = buildMcpServer({\n name: 'transcend-mcp',\n version: VERSION,\n tools: toolRegistry.getAllTools(),\n });\n\n logger.info(`Starting Transcend MCP Server v${VERSION}...`, {\n toolCount: toolRegistry.getToolCount(),\n categories: toolRegistry.getCategories(),\n });\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n logger.info('Transcend MCP Server started successfully', {\n sombraUrl,\n graphqlUrl,\n tools: toolRegistry.getToolCount(),\n });\n}\n\nmain().catch((error) => {\n const logger = new SimpleLogger();\n logger.error('Failed to start server:', error);\n process.exit(1);\n});\n"],"mappings":";;;;;AAgBA,MAAM,UAAU;AAEhB,SAAS,mBACP,MACA,WACA,YACc;AAGd,QAAO,IAAI,aAAa;EAAE,MAFP,IAAI,oBAAoB,MAAM,UAAU;EAEf,SADtB,IAAI,uBAAuB,MAAM,WAAW;EACE,CAAC;;AAGvE,eAAe,OAAsB;CACnC,MAAM,SAAS,IAAI,cAAc;CACjC,MAAM,SAAS,oBAAoB;CACnC,MAAM,YAAY,QAAQ,IAAI,qBAAqB;CACnD,MAAM,aAAa,QAAQ,IAAI,yBAAyB;AAExD,KAAI,OAAO,cAAc,QAAQ;AAC/B,QAAM,WACJ;GACE,MAAM;GACN,SAAS;GACT,cAAc,OAAO,SAAS;AAC5B,WAAO,KAAK,uDAAuD;KACjE;KACA;KACA,UAAU,MAAM,QAAQ;KACzB,CAAC;AAEF,WAAO,eAAe;KACpB,MAAM;KACN,SAAS;KACT,OAJe,mBAAmB,MAAM,WAAW,WAAW,CAI9C,aAAa;KAC9B,CAAC;;GAEL,EACD,OACD;AACD;;CAIF,MAAM,OAAO,aAAa;AAC1B,QAAO,KAAK,yCAAyC;EAAE;EAAW;EAAY,CAAC;CAE/E,MAAM,eAAe,mBAAmB,MAAM,WAAW,WAAW;AAEpE,QAAO,KACL,cAAc,aAAa,cAAc,CAAC,gBAAgB,aAAa,eAAe,CAAC,OAAO,cAC9F;EACE,YAAY,aAAa,eAAe;EACxC,WAAW,aAAa,cAAc;EACvC,CACF;CAED,MAAM,SAAS,eAAe;EAC5B,MAAM;EACN,SAAS;EACT,OAAO,aAAa,aAAa;EAClC,CAAC;AAEF,QAAO,KAAK,kCAAkC,QAAQ,MAAM;EAC1D,WAAW,aAAa,cAAc;EACtC,YAAY,aAAa,eAAe;EACzC,CAAC;CAEF,MAAM,YAAY,IAAI,sBAAsB;AAC5C,OAAM,OAAO,QAAQ,UAAU;AAE/B,QAAO,KAAK,6CAA6C;EACvD;EACA;EACA,OAAO,aAAa,cAAc;EACnC,CAAC;;AAGJ,MAAM,CAAC,OAAO,UAAU;AACP,KAAI,cAAc,CAC1B,MAAM,2BAA2B,MAAM;AAC9C,SAAQ,KAAK,EAAE;EACf"}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { AdminMixin } from "@transcend-io/mcp-server-admin";
|
|
2
|
+
import { AssessmentsMixin } from "@transcend-io/mcp-server-assessments";
|
|
3
|
+
import { AuthCredentials, Logger, ToolDefinition, TranscendGraphQLBase, TranscendRestClient } from "@transcend-io/mcp-server-core";
|
|
4
|
+
import { DiscoveryMixin } from "@transcend-io/mcp-server-discovery";
|
|
5
|
+
import { DSRMixin } from "@transcend-io/mcp-server-dsr";
|
|
6
|
+
import { InventoryMixin } from "@transcend-io/mcp-server-inventory";
|
|
7
|
+
import { WorkflowsMixin } from "@transcend-io/mcp-server-workflows";
|
|
8
|
+
|
|
9
|
+
//#region src/graphql-client.d.ts
|
|
10
|
+
declare class TranscendGraphQLClient extends TranscendGraphQLBase {
|
|
11
|
+
constructor(auth: AuthCredentials | null, baseUrl?: string, logger?: Logger);
|
|
12
|
+
getOrganization: InstanceType<typeof AdminMixin>['getOrganization'];
|
|
13
|
+
getCurrentUser: InstanceType<typeof AdminMixin>['getCurrentUser'];
|
|
14
|
+
listUsers: InstanceType<typeof AdminMixin>['listUsers'];
|
|
15
|
+
listTeams: InstanceType<typeof AdminMixin>['listTeams'];
|
|
16
|
+
listApiKeys: InstanceType<typeof AdminMixin>['listApiKeys'];
|
|
17
|
+
createApiKey: InstanceType<typeof AdminMixin>['createApiKey'];
|
|
18
|
+
getPrivacyCenter: InstanceType<typeof AdminMixin>['getPrivacyCenter'];
|
|
19
|
+
listRequests: InstanceType<typeof DSRMixin>['listRequests'];
|
|
20
|
+
getRequest: InstanceType<typeof DSRMixin>['getRequest'];
|
|
21
|
+
employeeMakeDataSubjectRequest: InstanceType<typeof DSRMixin>['employeeMakeDataSubjectRequest'];
|
|
22
|
+
cancelRequest: InstanceType<typeof DSRMixin>['cancelRequest'];
|
|
23
|
+
listDataSilos: InstanceType<typeof InventoryMixin>['listDataSilos'];
|
|
24
|
+
getDataSilo: InstanceType<typeof InventoryMixin>['getDataSilo'];
|
|
25
|
+
createDataSilo: InstanceType<typeof InventoryMixin>['createDataSilo'];
|
|
26
|
+
updateDataSilo: InstanceType<typeof InventoryMixin>['updateDataSilo'];
|
|
27
|
+
listVendors: InstanceType<typeof InventoryMixin>['listVendors'];
|
|
28
|
+
listDataPoints: InstanceType<typeof InventoryMixin>['listDataPoints'];
|
|
29
|
+
listSubDataPoints: InstanceType<typeof InventoryMixin>['listSubDataPoints'];
|
|
30
|
+
listIdentifiers: InstanceType<typeof InventoryMixin>['listIdentifiers'];
|
|
31
|
+
listDataCategories: InstanceType<typeof InventoryMixin>['listDataCategories'];
|
|
32
|
+
listClassificationScans: InstanceType<typeof DiscoveryMixin>['listClassificationScans'];
|
|
33
|
+
startClassificationScan: InstanceType<typeof DiscoveryMixin>['startClassificationScan'];
|
|
34
|
+
getClassificationScan: InstanceType<typeof DiscoveryMixin>['getClassificationScan'];
|
|
35
|
+
listDiscoveryPlugins: InstanceType<typeof DiscoveryMixin>['listDiscoveryPlugins'];
|
|
36
|
+
listAssessments: InstanceType<typeof AssessmentsMixin>['listAssessments'];
|
|
37
|
+
getAssessment: InstanceType<typeof AssessmentsMixin>['getAssessment'];
|
|
38
|
+
selectAssessmentQuestionAnswers: InstanceType<typeof AssessmentsMixin>['selectAssessmentQuestionAnswers'];
|
|
39
|
+
updateAssessmentFormAssignees: InstanceType<typeof AssessmentsMixin>['updateAssessmentFormAssignees'];
|
|
40
|
+
listAssessmentGroups: InstanceType<typeof AssessmentsMixin>['listAssessmentGroups'];
|
|
41
|
+
createAssessmentGroup: InstanceType<typeof AssessmentsMixin>['createAssessmentGroup'];
|
|
42
|
+
createAssessment: InstanceType<typeof AssessmentsMixin>['createAssessment'];
|
|
43
|
+
updateAssessment: InstanceType<typeof AssessmentsMixin>['updateAssessment'];
|
|
44
|
+
listAssessmentTemplates: InstanceType<typeof AssessmentsMixin>['listAssessmentTemplates'];
|
|
45
|
+
submitAssessmentForReview: InstanceType<typeof AssessmentsMixin>['submitAssessmentForReview'];
|
|
46
|
+
createAssessmentFormTemplate: InstanceType<typeof AssessmentsMixin>['createAssessmentFormTemplate'];
|
|
47
|
+
createAssessmentSection: InstanceType<typeof AssessmentsMixin>['createAssessmentSection'];
|
|
48
|
+
createAssessmentQuestions: InstanceType<typeof AssessmentsMixin>['createAssessmentQuestions'];
|
|
49
|
+
getAssessmentFormTemplate: InstanceType<typeof AssessmentsMixin>['getAssessmentFormTemplate'];
|
|
50
|
+
listWorkflows: InstanceType<typeof WorkflowsMixin>['listWorkflows'];
|
|
51
|
+
updateWorkflowConfig: InstanceType<typeof WorkflowsMixin>['updateWorkflowConfig'];
|
|
52
|
+
listEmailTemplates: InstanceType<typeof WorkflowsMixin>['listEmailTemplates'];
|
|
53
|
+
}
|
|
54
|
+
//#endregion
|
|
55
|
+
//#region src/registry.d.ts
|
|
56
|
+
interface UmbrellaToolClients {
|
|
57
|
+
/** REST client for Sombra API */
|
|
58
|
+
rest: TranscendRestClient;
|
|
59
|
+
/** Composed GraphQL client with all domain mixins */
|
|
60
|
+
graphql: TranscendGraphQLClient;
|
|
61
|
+
}
|
|
62
|
+
declare class ToolRegistry {
|
|
63
|
+
private tools;
|
|
64
|
+
private jsonSchemaCache;
|
|
65
|
+
private clients;
|
|
66
|
+
constructor(clients: UmbrellaToolClients);
|
|
67
|
+
private registerAllTools;
|
|
68
|
+
private registerToolsFromModule;
|
|
69
|
+
getToolList(): Array<{
|
|
70
|
+
name: string;
|
|
71
|
+
description: string;
|
|
72
|
+
inputSchema: Record<string, unknown>;
|
|
73
|
+
annotations: {
|
|
74
|
+
readOnlyHint: boolean;
|
|
75
|
+
destructiveHint: boolean;
|
|
76
|
+
idempotentHint: boolean;
|
|
77
|
+
};
|
|
78
|
+
}>;
|
|
79
|
+
getTool(name: string): ToolDefinition | undefined;
|
|
80
|
+
executeTool(name: string, args: Record<string, unknown>): Promise<unknown>;
|
|
81
|
+
getToolsByCategory(category: string): ToolDefinition[];
|
|
82
|
+
getCategories(): string[];
|
|
83
|
+
getAllTools(): ToolDefinition[];
|
|
84
|
+
getToolCount(): number;
|
|
85
|
+
}
|
|
86
|
+
//#endregion
|
|
87
|
+
export { ToolRegistry, TranscendGraphQLClient };
|
|
88
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/graphql-client.ts","../src/registry.ts"],"mappings":";;;;;;;;;cAwBa,sBAAA,SAA+B,oBAAA;cAC9B,IAAA,EAAM,eAAA,SAAwB,OAAA,WAAkB,MAAA,GAAS,MAAA;EAK7D,eAAA,EAAiB,YAAA,QAAoB,UAAA;EACrC,cAAA,EAAgB,YAAA,QAAoB,UAAA;EACpC,SAAA,EAAW,YAAA,QAAoB,UAAA;EAC/B,SAAA,EAAW,YAAA,QAAoB,UAAA;EAC/B,WAAA,EAAa,YAAA,QAAoB,UAAA;EACjC,YAAA,EAAc,YAAA,QAAoB,UAAA;EAClC,gBAAA,EAAkB,YAAA,QAAoB,UAAA;EAGtC,YAAA,EAAc,YAAA,QAAoB,QAAA;EAClC,UAAA,EAAY,YAAA,QAAoB,QAAA;EAChC,8BAAA,EAAgC,YAAA,QAC/B,QAAA;EAED,aAAA,EAAe,YAAA,QAAoB,QAAA;EAGnC,aAAA,EAAe,YAAA,QAAoB,cAAA;EACnC,WAAA,EAAa,YAAA,QAAoB,cAAA;EACjC,cAAA,EAAgB,YAAA,QAAoB,cAAA;EACpC,cAAA,EAAgB,YAAA,QAAoB,cAAA;EACpC,WAAA,EAAa,YAAA,QAAoB,cAAA;EACjC,cAAA,EAAgB,YAAA,QAAoB,cAAA;EACpC,iBAAA,EAAmB,YAAA,QAAoB,cAAA;EACvC,eAAA,EAAiB,YAAA,QAAoB,cAAA;EACrC,kBAAA,EAAoB,YAAA,QAAoB,cAAA;EAKxC,uBAAA,EAAyB,YAAA,QAAoB,cAAA;EAC7C,uBAAA,EAAyB,YAAA,QAAoB,cAAA;EAC7C,qBAAA,EAAuB,YAAA,QAAoB,cAAA;EAC3C,oBAAA,EAAsB,YAAA,QAAoB,cAAA;EAG1C,eAAA,EAAiB,YAAA,QAAoB,gBAAA;EACrC,aAAA,EAAe,YAAA,QAAoB,gBAAA;EACnC,+BAAA,EAAiC,YAAA,QAChC,gBAAA;EAED,6BAAA,EAA+B,YAAA,QAC9B,gBAAA;EAED,oBAAA,EAAsB,YAAA,QAAoB,gBAAA;EAC1C,qBAAA,EAAuB,YAAA,QAAoB,gBAAA;EAC3C,gBAAA,EAAkB,YAAA,QAAoB,gBAAA;EACtC,gBAAA,EAAkB,YAAA,QAAoB,gBAAA;EACtC,uBAAA,EAAyB,YAAA,QAAoB,gBAAA;EAC7C,yBAAA,EAA2B,YAAA,QAC1B,gBAAA;EAED,4BAAA,EAA8B,YAAA,QAC7B,gBAAA;EAED,uBAAA,EAAyB,YAAA,QAAoB,gBAAA;EAC7C,yBAAA,EAA2B,YAAA,QAC1B,gBAAA;EAED,yBAAA,EAA2B,YAAA,QAC1B,gBAAA;EAID,aAAA,EAAe,YAAA,QAAoB,cAAA;EACnC,oBAAA,EAAsB,YAAA,QAAoB,cAAA;EAC1C,kBAAA,EAAoB,YAAA,QAAoB,cAAA;AAAA;;;UC/EjC,mBAAA;;EAEf,IAAA,EAAM,mBAAA;;EAEN,OAAA,EAAS,sBAAA;AAAA;AAAA,cAGE,YAAA;EAAA,QACH,KAAA;EAAA,QACA,eAAA;EAAA,QACA,OAAA;cAEI,OAAA,EAAS,mBAAA;EAAA,QAKb,gBAAA;EAAA,QAWA,uBAAA;EAcR,WAAA,CAAA,GAAe,KAAA;IACb,IAAA;IACA,WAAA;IACA,WAAA,EAAa,MAAA;IACb,WAAA;MACE,YAAA;MACA,eAAA;MACA,cAAA;IAAA;EAAA;EAWJ,OAAA,CAAQ,IAAA,WAAe,cAAA;EAIjB,WAAA,CAAY,IAAA,UAAc,IAAA,EAAM,MAAA,oBAA0B,OAAA;EAqBhE,kBAAA,CAAmB,QAAA,WAAmB,cAAA;EAItC,aAAA,CAAA;EAQA,WAAA,CAAA,GAAe,cAAA;EAIf,YAAA,CAAA;AAAA"}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { AdminMixin, getAdminTools } from "@transcend-io/mcp-server-admin";
|
|
2
|
+
import { AssessmentsMixin, getAssessmentTools } from "@transcend-io/mcp-server-assessments";
|
|
3
|
+
import { TranscendGraphQLBase, createErrorResult } from "@transcend-io/mcp-server-core";
|
|
4
|
+
import { DiscoveryMixin, getDiscoveryTools } from "@transcend-io/mcp-server-discovery";
|
|
5
|
+
import { DSRMixin, getDSRTools } from "@transcend-io/mcp-server-dsr";
|
|
6
|
+
import { InventoryMixin, getInventoryTools } from "@transcend-io/mcp-server-inventory";
|
|
7
|
+
import { WorkflowsMixin, getWorkflowTools } from "@transcend-io/mcp-server-workflows";
|
|
8
|
+
import { toJsonSchemaCompat } from "@modelcontextprotocol/sdk/server/zod-json-schema-compat.js";
|
|
9
|
+
import { getConsentTools } from "@transcend-io/mcp-server-consent";
|
|
10
|
+
import { getPreferenceTools } from "@transcend-io/mcp-server-preferences";
|
|
11
|
+
//#region src/graphql-client.ts
|
|
12
|
+
function applyMixin(target, mixin) {
|
|
13
|
+
Object.getOwnPropertyNames(mixin.prototype).forEach((name) => {
|
|
14
|
+
if (name === "constructor") return;
|
|
15
|
+
const descriptor = Object.getOwnPropertyDescriptor(mixin.prototype, name);
|
|
16
|
+
if (descriptor) Object.defineProperty(target.prototype, name, descriptor);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
var TranscendGraphQLClient = class extends TranscendGraphQLBase {
|
|
20
|
+
constructor(auth, baseUrl, logger) {
|
|
21
|
+
super(auth, baseUrl, logger);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
applyMixin(TranscendGraphQLClient, AdminMixin);
|
|
25
|
+
applyMixin(TranscendGraphQLClient, DSRMixin);
|
|
26
|
+
applyMixin(TranscendGraphQLClient, InventoryMixin);
|
|
27
|
+
applyMixin(TranscendGraphQLClient, DiscoveryMixin);
|
|
28
|
+
applyMixin(TranscendGraphQLClient, AssessmentsMixin);
|
|
29
|
+
applyMixin(TranscendGraphQLClient, WorkflowsMixin);
|
|
30
|
+
//#endregion
|
|
31
|
+
//#region src/registry.ts
|
|
32
|
+
var ToolRegistry = class {
|
|
33
|
+
tools = /* @__PURE__ */ new Map();
|
|
34
|
+
jsonSchemaCache = /* @__PURE__ */ new Map();
|
|
35
|
+
clients;
|
|
36
|
+
constructor(clients) {
|
|
37
|
+
this.clients = clients;
|
|
38
|
+
this.registerAllTools();
|
|
39
|
+
}
|
|
40
|
+
registerAllTools() {
|
|
41
|
+
this.registerToolsFromModule(getDSRTools(this.clients));
|
|
42
|
+
this.registerToolsFromModule(getConsentTools(this.clients));
|
|
43
|
+
this.registerToolsFromModule(getPreferenceTools(this.clients));
|
|
44
|
+
this.registerToolsFromModule(getInventoryTools(this.clients));
|
|
45
|
+
this.registerToolsFromModule(getDiscoveryTools(this.clients));
|
|
46
|
+
this.registerToolsFromModule(getAssessmentTools(this.clients));
|
|
47
|
+
this.registerToolsFromModule(getWorkflowTools(this.clients));
|
|
48
|
+
this.registerToolsFromModule(getAdminTools(this.clients));
|
|
49
|
+
}
|
|
50
|
+
registerToolsFromModule(tools) {
|
|
51
|
+
for (const tool of tools) {
|
|
52
|
+
if (this.tools.has(tool.name)) {
|
|
53
|
+
process.stderr.write(`Warning: Duplicate tool name "${tool.name}" - skipping\n`);
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
this.tools.set(tool.name, tool);
|
|
57
|
+
this.jsonSchemaCache.set(tool.name, toJsonSchemaCompat(tool.zodSchema));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
getToolList() {
|
|
61
|
+
return Array.from(this.tools.values()).map((tool) => ({
|
|
62
|
+
name: tool.name,
|
|
63
|
+
description: tool.description,
|
|
64
|
+
inputSchema: this.jsonSchemaCache.get(tool.name) || {
|
|
65
|
+
type: "object",
|
|
66
|
+
properties: {}
|
|
67
|
+
},
|
|
68
|
+
annotations: tool.annotations
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
getTool(name) {
|
|
72
|
+
return this.tools.get(name);
|
|
73
|
+
}
|
|
74
|
+
async executeTool(name, args) {
|
|
75
|
+
const tool = this.tools.get(name);
|
|
76
|
+
if (!tool) throw new Error(`Unknown tool: ${name}`);
|
|
77
|
+
const parseResult = tool.zodSchema.safeParse(args);
|
|
78
|
+
if (!parseResult.success) {
|
|
79
|
+
const issues = parseResult.error.issues.map((i) => `${i.path.join(".") || "input"}: ${i.message}`).join("; ");
|
|
80
|
+
throw new Error(`Invalid input: ${issues}`);
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
return await tool.handler(parseResult.data);
|
|
84
|
+
} catch (error) {
|
|
85
|
+
return createErrorResult(error);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
getToolsByCategory(category) {
|
|
89
|
+
return Array.from(this.tools.values()).filter((tool) => tool.category === category);
|
|
90
|
+
}
|
|
91
|
+
getCategories() {
|
|
92
|
+
const categories = /* @__PURE__ */ new Set();
|
|
93
|
+
for (const tool of this.tools.values()) categories.add(tool.category);
|
|
94
|
+
return Array.from(categories);
|
|
95
|
+
}
|
|
96
|
+
getAllTools() {
|
|
97
|
+
return Array.from(this.tools.values());
|
|
98
|
+
}
|
|
99
|
+
getToolCount() {
|
|
100
|
+
return this.tools.size;
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
//#endregion
|
|
104
|
+
export { TranscendGraphQLClient as n, ToolRegistry as t };
|
|
105
|
+
|
|
106
|
+
//# sourceMappingURL=registry-DFjwwbrC.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-DFjwwbrC.mjs","names":[],"sources":["../src/graphql-client.ts","../src/registry.ts"],"sourcesContent":["import { AdminMixin } from '@transcend-io/mcp-server-admin';\nimport { AssessmentsMixin } from '@transcend-io/mcp-server-assessments';\nimport {\n TranscendGraphQLBase,\n type AuthCredentials,\n type Logger,\n} from '@transcend-io/mcp-server-core';\nimport { DiscoveryMixin } from '@transcend-io/mcp-server-discovery';\nimport { DSRMixin } from '@transcend-io/mcp-server-dsr';\nimport { InventoryMixin } from '@transcend-io/mcp-server-inventory';\nimport { WorkflowsMixin } from '@transcend-io/mcp-server-workflows';\n\ntype Constructor<T = object> = new (...args: [AuthCredentials | null, string?, Logger?]) => T;\n\nfunction applyMixin(target: Constructor, mixin: Constructor): void {\n Object.getOwnPropertyNames(mixin.prototype).forEach((name) => {\n if (name === 'constructor') return;\n const descriptor = Object.getOwnPropertyDescriptor(mixin.prototype, name);\n if (descriptor) {\n Object.defineProperty(target.prototype, name, descriptor);\n }\n });\n}\n\nexport class TranscendGraphQLClient extends TranscendGraphQLBase {\n constructor(auth: AuthCredentials | null, baseUrl?: string, logger?: Logger) {\n super(auth, baseUrl, logger);\n }\n\n // Admin\n declare getOrganization: InstanceType<typeof AdminMixin>['getOrganization'];\n declare getCurrentUser: InstanceType<typeof AdminMixin>['getCurrentUser'];\n declare listUsers: InstanceType<typeof AdminMixin>['listUsers'];\n declare listTeams: InstanceType<typeof AdminMixin>['listTeams'];\n declare listApiKeys: InstanceType<typeof AdminMixin>['listApiKeys'];\n declare createApiKey: InstanceType<typeof AdminMixin>['createApiKey'];\n declare getPrivacyCenter: InstanceType<typeof AdminMixin>['getPrivacyCenter'];\n\n // DSR\n declare listRequests: InstanceType<typeof DSRMixin>['listRequests'];\n declare getRequest: InstanceType<typeof DSRMixin>['getRequest'];\n declare employeeMakeDataSubjectRequest: InstanceType<\n typeof DSRMixin\n >['employeeMakeDataSubjectRequest'];\n declare cancelRequest: InstanceType<typeof DSRMixin>['cancelRequest'];\n\n // Inventory\n declare listDataSilos: InstanceType<typeof InventoryMixin>['listDataSilos'];\n declare getDataSilo: InstanceType<typeof InventoryMixin>['getDataSilo'];\n declare createDataSilo: InstanceType<typeof InventoryMixin>['createDataSilo'];\n declare updateDataSilo: InstanceType<typeof InventoryMixin>['updateDataSilo'];\n declare listVendors: InstanceType<typeof InventoryMixin>['listVendors'];\n declare listDataPoints: InstanceType<typeof InventoryMixin>['listDataPoints'];\n declare listSubDataPoints: InstanceType<typeof InventoryMixin>['listSubDataPoints'];\n declare listIdentifiers: InstanceType<typeof InventoryMixin>['listIdentifiers'];\n declare listDataCategories: InstanceType<typeof InventoryMixin>['listDataCategories'];\n\n // Consent tools now call makeRequest directly (no mixin needed)\n\n // Discovery\n declare listClassificationScans: InstanceType<typeof DiscoveryMixin>['listClassificationScans'];\n declare startClassificationScan: InstanceType<typeof DiscoveryMixin>['startClassificationScan'];\n declare getClassificationScan: InstanceType<typeof DiscoveryMixin>['getClassificationScan'];\n declare listDiscoveryPlugins: InstanceType<typeof DiscoveryMixin>['listDiscoveryPlugins'];\n\n // Assessments\n declare listAssessments: InstanceType<typeof AssessmentsMixin>['listAssessments'];\n declare getAssessment: InstanceType<typeof AssessmentsMixin>['getAssessment'];\n declare selectAssessmentQuestionAnswers: InstanceType<\n typeof AssessmentsMixin\n >['selectAssessmentQuestionAnswers'];\n declare updateAssessmentFormAssignees: InstanceType<\n typeof AssessmentsMixin\n >['updateAssessmentFormAssignees'];\n declare listAssessmentGroups: InstanceType<typeof AssessmentsMixin>['listAssessmentGroups'];\n declare createAssessmentGroup: InstanceType<typeof AssessmentsMixin>['createAssessmentGroup'];\n declare createAssessment: InstanceType<typeof AssessmentsMixin>['createAssessment'];\n declare updateAssessment: InstanceType<typeof AssessmentsMixin>['updateAssessment'];\n declare listAssessmentTemplates: InstanceType<typeof AssessmentsMixin>['listAssessmentTemplates'];\n declare submitAssessmentForReview: InstanceType<\n typeof AssessmentsMixin\n >['submitAssessmentForReview'];\n declare createAssessmentFormTemplate: InstanceType<\n typeof AssessmentsMixin\n >['createAssessmentFormTemplate'];\n declare createAssessmentSection: InstanceType<typeof AssessmentsMixin>['createAssessmentSection'];\n declare createAssessmentQuestions: InstanceType<\n typeof AssessmentsMixin\n >['createAssessmentQuestions'];\n declare getAssessmentFormTemplate: InstanceType<\n typeof AssessmentsMixin\n >['getAssessmentFormTemplate'];\n\n // Workflows\n declare listWorkflows: InstanceType<typeof WorkflowsMixin>['listWorkflows'];\n declare updateWorkflowConfig: InstanceType<typeof WorkflowsMixin>['updateWorkflowConfig'];\n declare listEmailTemplates: InstanceType<typeof WorkflowsMixin>['listEmailTemplates'];\n}\n\napplyMixin(TranscendGraphQLClient, AdminMixin);\napplyMixin(TranscendGraphQLClient, DSRMixin);\napplyMixin(TranscendGraphQLClient, InventoryMixin);\napplyMixin(TranscendGraphQLClient, DiscoveryMixin);\napplyMixin(TranscendGraphQLClient, AssessmentsMixin);\napplyMixin(TranscendGraphQLClient, WorkflowsMixin);\n","import { toJsonSchemaCompat } from '@modelcontextprotocol/sdk/server/zod-json-schema-compat.js';\nimport { getAdminTools } from '@transcend-io/mcp-server-admin';\nimport { getAssessmentTools } from '@transcend-io/mcp-server-assessments';\nimport { getConsentTools } from '@transcend-io/mcp-server-consent';\nimport {\n createErrorResult,\n type ToolDefinition,\n type TranscendRestClient,\n} from '@transcend-io/mcp-server-core';\nimport { getDiscoveryTools } from '@transcend-io/mcp-server-discovery';\nimport { getDSRTools } from '@transcend-io/mcp-server-dsr';\nimport { getInventoryTools } from '@transcend-io/mcp-server-inventory';\nimport { getPreferenceTools } from '@transcend-io/mcp-server-preferences';\nimport { getWorkflowTools } from '@transcend-io/mcp-server-workflows';\n\nimport type { TranscendGraphQLClient } from './graphql-client.js';\n\nexport interface UmbrellaToolClients {\n /** REST client for Sombra API */\n rest: TranscendRestClient;\n /** Composed GraphQL client with all domain mixins */\n graphql: TranscendGraphQLClient;\n}\n\nexport class ToolRegistry {\n private tools: Map<string, ToolDefinition> = new Map();\n private jsonSchemaCache: Map<string, Record<string, unknown>> = new Map();\n private clients: UmbrellaToolClients;\n\n constructor(clients: UmbrellaToolClients) {\n this.clients = clients;\n this.registerAllTools();\n }\n\n private registerAllTools(): void {\n this.registerToolsFromModule(getDSRTools(this.clients));\n this.registerToolsFromModule(getConsentTools(this.clients));\n this.registerToolsFromModule(getPreferenceTools(this.clients));\n this.registerToolsFromModule(getInventoryTools(this.clients));\n this.registerToolsFromModule(getDiscoveryTools(this.clients));\n this.registerToolsFromModule(getAssessmentTools(this.clients));\n this.registerToolsFromModule(getWorkflowTools(this.clients));\n this.registerToolsFromModule(getAdminTools(this.clients));\n }\n\n private registerToolsFromModule(tools: ToolDefinition[]): void {\n for (const tool of tools) {\n if (this.tools.has(tool.name)) {\n process.stderr.write(`Warning: Duplicate tool name \"${tool.name}\" - skipping\\n`);\n continue;\n }\n this.tools.set(tool.name, tool);\n this.jsonSchemaCache.set(\n tool.name,\n toJsonSchemaCompat(tool.zodSchema as any) as Record<string, unknown>,\n );\n }\n }\n\n getToolList(): Array<{\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n annotations: {\n readOnlyHint: boolean;\n destructiveHint: boolean;\n idempotentHint: boolean;\n };\n }> {\n return Array.from(this.tools.values()).map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: this.jsonSchemaCache.get(tool.name) || { type: 'object', properties: {} },\n annotations: tool.annotations,\n }));\n }\n\n getTool(name: string): ToolDefinition | undefined {\n return this.tools.get(name);\n }\n\n async executeTool(name: string, args: Record<string, unknown>): Promise<unknown> {\n const tool = this.tools.get(name);\n if (!tool) {\n throw new Error(`Unknown tool: ${name}`);\n }\n\n const parseResult = tool.zodSchema.safeParse(args);\n if (!parseResult.success) {\n const issues = parseResult.error.issues\n .map((i: any) => `${i.path.join('.') || 'input'}: ${i.message}`)\n .join('; ');\n throw new Error(`Invalid input: ${issues}`);\n }\n\n try {\n return await tool.handler(parseResult.data);\n } catch (error) {\n return createErrorResult(error);\n }\n }\n\n getToolsByCategory(category: string): ToolDefinition[] {\n return Array.from(this.tools.values()).filter((tool) => tool.category === category);\n }\n\n getCategories(): string[] {\n const categories = new Set<string>();\n for (const tool of this.tools.values()) {\n categories.add(tool.category);\n }\n return Array.from(categories);\n }\n\n getAllTools(): ToolDefinition[] {\n return Array.from(this.tools.values());\n }\n\n getToolCount(): number {\n return this.tools.size;\n }\n}\n"],"mappings":";;;;;;;;;;;AAcA,SAAS,WAAW,QAAqB,OAA0B;AACjE,QAAO,oBAAoB,MAAM,UAAU,CAAC,SAAS,SAAS;AAC5D,MAAI,SAAS,cAAe;EAC5B,MAAM,aAAa,OAAO,yBAAyB,MAAM,WAAW,KAAK;AACzE,MAAI,WACF,QAAO,eAAe,OAAO,WAAW,MAAM,WAAW;GAE3D;;AAGJ,IAAa,yBAAb,cAA4C,qBAAqB;CAC/D,YAAY,MAA8B,SAAkB,QAAiB;AAC3E,QAAM,MAAM,SAAS,OAAO;;;AAyEhC,WAAW,wBAAwB,WAAW;AAC9C,WAAW,wBAAwB,SAAS;AAC5C,WAAW,wBAAwB,eAAe;AAClD,WAAW,wBAAwB,eAAe;AAClD,WAAW,wBAAwB,iBAAiB;AACpD,WAAW,wBAAwB,eAAe;;;AChFlD,IAAa,eAAb,MAA0B;CACxB,wBAA6C,IAAI,KAAK;CACtD,kCAAgE,IAAI,KAAK;CACzE;CAEA,YAAY,SAA8B;AACxC,OAAK,UAAU;AACf,OAAK,kBAAkB;;CAGzB,mBAAiC;AAC/B,OAAK,wBAAwB,YAAY,KAAK,QAAQ,CAAC;AACvD,OAAK,wBAAwB,gBAAgB,KAAK,QAAQ,CAAC;AAC3D,OAAK,wBAAwB,mBAAmB,KAAK,QAAQ,CAAC;AAC9D,OAAK,wBAAwB,kBAAkB,KAAK,QAAQ,CAAC;AAC7D,OAAK,wBAAwB,kBAAkB,KAAK,QAAQ,CAAC;AAC7D,OAAK,wBAAwB,mBAAmB,KAAK,QAAQ,CAAC;AAC9D,OAAK,wBAAwB,iBAAiB,KAAK,QAAQ,CAAC;AAC5D,OAAK,wBAAwB,cAAc,KAAK,QAAQ,CAAC;;CAG3D,wBAAgC,OAA+B;AAC7D,OAAK,MAAM,QAAQ,OAAO;AACxB,OAAI,KAAK,MAAM,IAAI,KAAK,KAAK,EAAE;AAC7B,YAAQ,OAAO,MAAM,iCAAiC,KAAK,KAAK,gBAAgB;AAChF;;AAEF,QAAK,MAAM,IAAI,KAAK,MAAM,KAAK;AAC/B,QAAK,gBAAgB,IACnB,KAAK,MACL,mBAAmB,KAAK,UAAiB,CAC1C;;;CAIL,cASG;AACD,SAAO,MAAM,KAAK,KAAK,MAAM,QAAQ,CAAC,CAAC,KAAK,UAAU;GACpD,MAAM,KAAK;GACX,aAAa,KAAK;GAClB,aAAa,KAAK,gBAAgB,IAAI,KAAK,KAAK,IAAI;IAAE,MAAM;IAAU,YAAY,EAAE;IAAE;GACtF,aAAa,KAAK;GACnB,EAAE;;CAGL,QAAQ,MAA0C;AAChD,SAAO,KAAK,MAAM,IAAI,KAAK;;CAG7B,MAAM,YAAY,MAAc,MAAiD;EAC/E,MAAM,OAAO,KAAK,MAAM,IAAI,KAAK;AACjC,MAAI,CAAC,KACH,OAAM,IAAI,MAAM,iBAAiB,OAAO;EAG1C,MAAM,cAAc,KAAK,UAAU,UAAU,KAAK;AAClD,MAAI,CAAC,YAAY,SAAS;GACxB,MAAM,SAAS,YAAY,MAAM,OAC9B,KAAK,MAAW,GAAG,EAAE,KAAK,KAAK,IAAI,IAAI,QAAQ,IAAI,EAAE,UAAU,CAC/D,KAAK,KAAK;AACb,SAAM,IAAI,MAAM,kBAAkB,SAAS;;AAG7C,MAAI;AACF,UAAO,MAAM,KAAK,QAAQ,YAAY,KAAK;WACpC,OAAO;AACd,UAAO,kBAAkB,MAAM;;;CAInC,mBAAmB,UAAoC;AACrD,SAAO,MAAM,KAAK,KAAK,MAAM,QAAQ,CAAC,CAAC,QAAQ,SAAS,KAAK,aAAa,SAAS;;CAGrF,gBAA0B;EACxB,MAAM,6BAAa,IAAI,KAAa;AACpC,OAAK,MAAM,QAAQ,KAAK,MAAM,QAAQ,CACpC,YAAW,IAAI,KAAK,SAAS;AAE/B,SAAO,MAAM,KAAK,WAAW;;CAG/B,cAAgC;AAC9B,SAAO,MAAM,KAAK,KAAK,MAAM,QAAQ,CAAC;;CAGxC,eAAuB;AACrB,SAAO,KAAK,MAAM"}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@transcend-io/mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Transcend MCP Server — unified server with all domain tools.",
|
|
5
|
+
"homepage": "https://github.com/transcend-io/tools/tree/main/packages/mcp/mcp",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"author": "Transcend Inc.",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/transcend-io/tools.git",
|
|
11
|
+
"directory": "packages/mcp/mcp"
|
|
12
|
+
},
|
|
13
|
+
"bin": {
|
|
14
|
+
"transcend-mcp": "./dist/cli.mjs"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"type": "module",
|
|
20
|
+
"sideEffects": false,
|
|
21
|
+
"types": "./dist/index.d.mts",
|
|
22
|
+
"exports": {
|
|
23
|
+
".": {
|
|
24
|
+
"@transcend-io/source": "./src/index.ts",
|
|
25
|
+
"types": "./dist/index.d.mts",
|
|
26
|
+
"default": "./dist/index.mjs"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"publishConfig": {
|
|
30
|
+
"access": "public"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "tsdown",
|
|
34
|
+
"test": "vitest run",
|
|
35
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
36
|
+
"check:exports": "attw --pack . --ignore-rules cjs-resolves-to-esm",
|
|
37
|
+
"check:publint": "publint --level warning --strict --pack pnpm"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@modelcontextprotocol/sdk": "catalog:",
|
|
41
|
+
"@transcend-io/mcp-server-admin": "workspace:*",
|
|
42
|
+
"@transcend-io/mcp-server-assessments": "workspace:*",
|
|
43
|
+
"@transcend-io/mcp-server-consent": "workspace:*",
|
|
44
|
+
"@transcend-io/mcp-server-core": "workspace:*",
|
|
45
|
+
"@transcend-io/mcp-server-discovery": "workspace:*",
|
|
46
|
+
"@transcend-io/mcp-server-dsr": "workspace:*",
|
|
47
|
+
"@transcend-io/mcp-server-inventory": "workspace:*",
|
|
48
|
+
"@transcend-io/mcp-server-preferences": "workspace:*",
|
|
49
|
+
"@transcend-io/mcp-server-workflows": "workspace:*",
|
|
50
|
+
"zod": "catalog:"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@arethetypeswrong/cli": "catalog:",
|
|
54
|
+
"@types/node": "catalog:",
|
|
55
|
+
"publint": "catalog:",
|
|
56
|
+
"tsdown": "catalog:",
|
|
57
|
+
"typescript": "catalog:",
|
|
58
|
+
"vitest": "catalog:"
|
|
59
|
+
},
|
|
60
|
+
"engines": {
|
|
61
|
+
"node": ">=22.12.0"
|
|
62
|
+
}
|
|
63
|
+
}
|