@transcend-io/mcp 0.3.1 → 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 +3 -13
- package/dist/cli.mjs +5 -3
- package/dist/cli.mjs.map +1 -1
- package/dist/index.d.mts +1 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/{registry-Zwj3Opui.mjs → registry-DwQ6w9YS.mjs} +4 -3
- package/dist/registry-DwQ6w9YS.mjs.map +1 -0
- package/package.json +10 -10
- package/dist/registry-Zwj3Opui.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @transcend-io/mcp
|
|
2
2
|
|
|
3
|
-
> **
|
|
3
|
+
> **Beta** — this package is under active development. APIs may change without notice.
|
|
4
4
|
|
|
5
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
6
|
|
|
@@ -10,13 +10,13 @@ For local runs from this repository, copy [`secret.env.example`](../../../secret
|
|
|
10
10
|
|
|
11
11
|
## Install
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Install the CLI globally:
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
16
|
npm install -g @transcend-io/mcp
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
Or run from a checkout of this repository (see **Run from the monorepo** below).
|
|
20
20
|
|
|
21
21
|
## Usage
|
|
22
22
|
|
|
@@ -86,16 +86,6 @@ pnpm -F @transcend-io/mcp exec node ./dist/cli.mjs
|
|
|
86
86
|
|
|
87
87
|
See [CONTRIBUTING.md](../../../CONTRIBUTING.md#mcp-servers) for workspace layout and `pnpm --filter` workflows.
|
|
88
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://api.transcend.io` | GraphQL backend API URL (matches CLI convention) |
|
|
95
|
-
| `SOMBRA_URL` | No | `https://multi-tenant.sombra.transcend.io` | Sombra REST API URL (matches CLI / SDK convention) |
|
|
96
|
-
|
|
97
|
-
**Monorepo:** keep these in root **`secret.env`** (from [`secret.env.example`](../../../secret.env.example)); see **Run from the monorepo**.
|
|
98
|
-
|
|
99
89
|
## Architecture
|
|
100
90
|
|
|
101
91
|
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.
|
package/dist/cli.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { n as TranscendGraphQLClient, t as ToolRegistry } from "./registry-
|
|
2
|
+
import { n as TranscendGraphQLClient, t as ToolRegistry } from "./registry-DwQ6w9YS.mjs";
|
|
3
3
|
import { SimpleLogger, TranscendRestClient, buildMcpServer, parseTransportArgs, resolveAuth, runMcpHttp } from "@transcend-io/mcp-server-base";
|
|
4
4
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
5
|
//#region src/cli.ts
|
|
@@ -11,11 +11,13 @@ function createToolRegistry(auth, sombraUrl, graphqlUrl) {
|
|
|
11
11
|
});
|
|
12
12
|
}
|
|
13
13
|
async function main() {
|
|
14
|
-
const logger = new SimpleLogger();
|
|
15
14
|
const config = parseTransportArgs();
|
|
15
|
+
const isHttpTransport = config.transport === "http";
|
|
16
|
+
SimpleLogger.setInfoToStdout(isHttpTransport);
|
|
17
|
+
const logger = new SimpleLogger();
|
|
16
18
|
const sombraUrl = process.env.SOMBRA_URL || "https://multi-tenant.sombra.transcend.io";
|
|
17
19
|
const graphqlUrl = process.env.TRANSCEND_API_URL || "https://api.transcend.io";
|
|
18
|
-
if (
|
|
20
|
+
if (isHttpTransport) {
|
|
19
21
|
await runMcpHttp({
|
|
20
22
|
name: "transcend-mcp",
|
|
21
23
|
version: VERSION,
|
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +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-base';\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
|
|
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-base';\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 config = parseTransportArgs();\n const isHttpTransport = config.transport === 'http';\n SimpleLogger.setInfoToStdout(isHttpTransport);\n const logger = new SimpleLogger();\n const sombraUrl = process.env.SOMBRA_URL || 'https://multi-tenant.sombra.transcend.io';\n const graphqlUrl = process.env.TRANSCEND_API_URL || 'https://api.transcend.io';\n\n if (isHttpTransport) {\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,oBAAoB;CACnC,MAAM,kBAAkB,OAAO,cAAc;AAC7C,cAAa,gBAAgB,gBAAgB;CAC7C,MAAM,SAAS,IAAI,cAAc;CACjC,MAAM,YAAY,QAAQ,IAAI,cAAc;CAC5C,MAAM,aAAa,QAAQ,IAAI,qBAAqB;AAEpD,KAAI,iBAAiB;AACnB,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
CHANGED
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +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;;;
|
|
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;;;UC9EjC,mBAAA;;EAEf,IAAA,EAAM,mBAAA;;EAEN,OAAA,EAAS,sBAAA;AAAA;AAAA,cAGE,YAAA;EAAA,QACH,KAAA;EAAA,QACA,eAAA;EAAA,QACA,OAAA;EAAA,QACA,MAAA;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
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as TranscendGraphQLClient, t as ToolRegistry } from "./registry-
|
|
1
|
+
import { n as TranscendGraphQLClient, t as ToolRegistry } from "./registry-DwQ6w9YS.mjs";
|
|
2
2
|
export { ToolRegistry, TranscendGraphQLClient };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AdminMixin, getAdminTools } from "@transcend-io/mcp-server-admin";
|
|
2
2
|
import { AssessmentsMixin, getAssessmentTools } from "@transcend-io/mcp-server-assessment";
|
|
3
|
-
import { TranscendGraphQLBase, createErrorResult } from "@transcend-io/mcp-server-base";
|
|
3
|
+
import { SimpleLogger, TranscendGraphQLBase, createErrorResult } from "@transcend-io/mcp-server-base";
|
|
4
4
|
import { DiscoveryMixin, getDiscoveryTools } from "@transcend-io/mcp-server-discovery";
|
|
5
5
|
import { DSRMixin, getDSRTools } from "@transcend-io/mcp-server-dsr";
|
|
6
6
|
import { InventoryMixin, getInventoryTools } from "@transcend-io/mcp-server-inventory";
|
|
@@ -33,6 +33,7 @@ var ToolRegistry = class {
|
|
|
33
33
|
tools = /* @__PURE__ */ new Map();
|
|
34
34
|
jsonSchemaCache = /* @__PURE__ */ new Map();
|
|
35
35
|
clients;
|
|
36
|
+
logger = new SimpleLogger();
|
|
36
37
|
constructor(clients) {
|
|
37
38
|
this.clients = clients;
|
|
38
39
|
this.registerAllTools();
|
|
@@ -50,7 +51,7 @@ var ToolRegistry = class {
|
|
|
50
51
|
registerToolsFromModule(tools) {
|
|
51
52
|
for (const tool of tools) {
|
|
52
53
|
if (this.tools.has(tool.name)) {
|
|
53
|
-
|
|
54
|
+
this.logger.warn("Duplicate tool name - skipping", { toolName: tool.name });
|
|
54
55
|
continue;
|
|
55
56
|
}
|
|
56
57
|
this.tools.set(tool.name, tool);
|
|
@@ -103,4 +104,4 @@ var ToolRegistry = class {
|
|
|
103
104
|
//#endregion
|
|
104
105
|
export { TranscendGraphQLClient as n, ToolRegistry as t };
|
|
105
106
|
|
|
106
|
-
//# sourceMappingURL=registry-
|
|
107
|
+
//# sourceMappingURL=registry-DwQ6w9YS.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-DwQ6w9YS.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-assessment';\nimport {\n TranscendGraphQLBase,\n type AuthCredentials,\n type Logger,\n} from '@transcend-io/mcp-server-base';\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-assessment';\nimport {\n createErrorResult,\n SimpleLogger,\n type ToolDefinition,\n type TranscendRestClient,\n} from '@transcend-io/mcp-server-base';\nimport { getConsentTools } from '@transcend-io/mcp-server-consent';\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 private logger = new SimpleLogger();\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 this.logger.warn('Duplicate tool name - skipping', { toolName: tool.name });\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;;;AC/ElD,IAAa,eAAb,MAA0B;CACxB,wBAA6C,IAAI,KAAK;CACtD,kCAAgE,IAAI,KAAK;CACzE;CACA,SAAiB,IAAI,cAAc;CAEnC,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,SAAK,OAAO,KAAK,kCAAkC,EAAE,UAAU,KAAK,MAAM,CAAC;AAC3E;;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
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@transcend-io/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Transcend MCP Server — unified server with all domain tools.",
|
|
5
5
|
"homepage": "https://github.com/transcend-io/tools/tree/main/packages/mcp/mcp",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -32,15 +32,15 @@
|
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
34
34
|
"zod": "^4.3.6",
|
|
35
|
-
"@transcend-io/mcp-server-admin": "0.3.
|
|
36
|
-
"@transcend-io/mcp-server-assessment": "0.3.
|
|
37
|
-
"@transcend-io/mcp-server-base": "0.
|
|
38
|
-
"@transcend-io/mcp-server-consent": "0.2.
|
|
39
|
-
"@transcend-io/mcp-server-discovery": "0.3.
|
|
40
|
-
"@transcend-io/mcp-server-dsr": "0.3.
|
|
41
|
-
"@transcend-io/mcp-server-inventory": "0.3.
|
|
42
|
-
"@transcend-io/mcp-server-preferences": "0.3.
|
|
43
|
-
"@transcend-io/mcp-server-workflows": "0.3.
|
|
35
|
+
"@transcend-io/mcp-server-admin": "0.3.3",
|
|
36
|
+
"@transcend-io/mcp-server-assessment": "0.3.3",
|
|
37
|
+
"@transcend-io/mcp-server-base": "0.4.0",
|
|
38
|
+
"@transcend-io/mcp-server-consent": "0.2.3",
|
|
39
|
+
"@transcend-io/mcp-server-discovery": "0.3.1",
|
|
40
|
+
"@transcend-io/mcp-server-dsr": "0.3.3",
|
|
41
|
+
"@transcend-io/mcp-server-inventory": "0.3.1",
|
|
42
|
+
"@transcend-io/mcp-server-preferences": "0.3.1",
|
|
43
|
+
"@transcend-io/mcp-server-workflows": "0.3.1"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@arethetypeswrong/cli": "^0.18.2",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry-Zwj3Opui.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-assessment';\nimport {\n TranscendGraphQLBase,\n type AuthCredentials,\n type Logger,\n} from '@transcend-io/mcp-server-base';\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-assessment';\nimport {\n createErrorResult,\n type ToolDefinition,\n type TranscendRestClient,\n} from '@transcend-io/mcp-server-base';\nimport { getConsentTools } from '@transcend-io/mcp-server-consent';\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":"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"}
|