@softacus-software/elwis-docs-mcp 0.1.1 → 0.2.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 +122 -43
- package/dist/app-scope.js +92 -0
- package/dist/app-scope.js.map +1 -0
- package/dist/artifact-read.js +114 -0
- package/dist/artifact-read.js.map +1 -0
- package/dist/cli/client-configs.js +86 -0
- package/dist/cli/client-configs.js.map +1 -0
- package/dist/cli/login.js +64 -0
- package/dist/cli/login.js.map +1 -0
- package/dist/cli/prompter.js +85 -0
- package/dist/cli/prompter.js.map +1 -0
- package/dist/cli/setup.js +152 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/config.js +39 -0
- package/dist/config.js.map +1 -0
- package/dist/elwis-api.js +68 -0
- package/dist/elwis-api.js.map +1 -0
- package/dist/entity-read.js +192 -0
- package/dist/entity-read.js.map +1 -0
- package/dist/http-client.js +140 -0
- package/dist/http-client.js.map +1 -0
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/jwt.js +18 -0
- package/dist/jwt.js.map +1 -0
- package/dist/prune.js +9 -0
- package/dist/prune.js.map +1 -0
- package/dist/resolve.js +71 -0
- package/dist/resolve.js.map +1 -0
- package/dist/result.js +16 -0
- package/dist/result.js.map +1 -0
- package/dist/server.js +51 -0
- package/dist/server.js.map +1 -1
- package/dist/session-store.js +51 -0
- package/dist/session-store.js.map +1 -0
- package/dist/tools/explain-access.js +36 -0
- package/dist/tools/explain-access.js.map +1 -0
- package/dist/tools/get-entity.js +36 -0
- package/dist/tools/get-entity.js.map +1 -0
- package/dist/tools/get-page.js +75 -0
- package/dist/tools/get-page.js.map +1 -0
- package/dist/tools/list-apps.js +22 -0
- package/dist/tools/list-apps.js.map +1 -0
- package/dist/tools/list-entities.js +43 -0
- package/dist/tools/list-entities.js.map +1 -0
- package/dist/tools/read-artifacts.js +197 -0
- package/dist/tools/read-artifacts.js.map +1 -0
- package/dist/tools/resolve-entity.js +22 -0
- package/dist/tools/resolve-entity.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-page.js","sourceRoot":"","sources":["../../src/tools/get-page.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,aAAa,GAAG,GAAG,CAAC;AAE1B,SAAS,OAAO,CAAC,KAAc;IAC7B,MAAM,IAAI,GAAI,KAA6B,EAAE,KAAK,EAAE,IAAI,CAAC;IACzD,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACjH,OAAO,KAAK,CAAC,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;AACpF,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,MAAM,IAAI,GAAI,KAA6B,EAAE,KAAK,EAAE,IAAI,CAAC;IACzD,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,GAAa,EAAE,KAAe;IAC/E,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,8BAA8B;QACrC,WAAW,EAAE,6nBAA6nB;QAC1oB,WAAW,EAAE;YACX,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YACpC,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YACtC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;YAChE,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kFAAkF,CAAC;SACrJ;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;KACvG,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC3D,MAAM,KAAK,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;YACzC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1D,MAAM,SAAS,GAAa,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAsB,EAAE,EAAU,EAAE,EAAE,CAAC,CAAC;gBAClF,OAAO,EAAE,EAAE,GAAG,CAAC;gBACf,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE;gBACtB,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAsB,EAAE,EAAU,EAAE,EAAE,CAAC,CAAC;oBAChE,GAAG,EAAE,EAAE,GAAG,CAAC;oBACX,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAsB,EAAE,EAAU,EAAE,EAAE,CAAC,CAAC;wBACrE,MAAM,EAAE,EAAE,GAAG,CAAC;wBACd,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;6BACrB,MAAM,CAAC,CAAC,CAAsB,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;6BAC1G,GAAG,CAAC,CAAC,CAAsB,EAAE,EAAE;4BAC9B,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;4BAClC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,QAAkB,EAAE,CAAC;wBACnD,CAAC,CAAC;qBACL,CAAC,CAAC;iBACJ,CAAC,CAAC;aACJ,CAAC,CAAC,CAAC;YACJ,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;YACpD,MAAM,IAAI,GAAG,IAAI,GAAG,EAA8E,CAAC;YACnG,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClI,KAAK,MAAM,CAAC,IAAI,IAAkC,EAAE,CAAC;gBACnD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;oBACrB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;oBACzB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACvE,CAAC,CAAC;YACL,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,QAAQ;gBAAE,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI;oBAAE,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO;wBAAE,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAyC,EAAE,CAAC;4BACzI,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;wBACvF,CAAC;YACD,OAAO,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrI,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { Text, ErrorResult } from '../result.js';
|
|
3
|
+
export function RegisterListApps(server, api, scope) {
|
|
4
|
+
server.registerTool('list_elwis_apps', {
|
|
5
|
+
description: 'List ELWIS applications visible to the configured user. Optional name substring filter. When the server is configured with an application allowlist, only allowlisted applications are returned.',
|
|
6
|
+
inputSchema: { nameContains: z.string().optional(), limit: z.number().int().positive().max(100).optional() },
|
|
7
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
8
|
+
}, async ({ nameContains, limit }) => {
|
|
9
|
+
try {
|
|
10
|
+
await scope.assertTenant();
|
|
11
|
+
const filter = nameContains ? { name: { $regex: nameContains, $options: 'i' } } : {};
|
|
12
|
+
const rows = await api.list('application', filter, limit ?? 25);
|
|
13
|
+
const allowed = await scope.allowedIds();
|
|
14
|
+
const visible = allowed ? rows.filter(r => allowed.has(r.id)) : rows;
|
|
15
|
+
return Text(visible.map(r => ({ id: r.id, name: r.name, alias: r.alias, isActive: r.isActive ?? true })));
|
|
16
|
+
}
|
|
17
|
+
catch (e) {
|
|
18
|
+
return ErrorResult(e);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=list-apps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-apps.js","sourceRoot":"","sources":["../../src/tools/list-apps.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,GAAa,EAAE,KAAe;IAChF,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,WAAW,EAAE,kMAAkM;QAC/M,WAAW,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC5G,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;KAC/E,EACD,KAAK,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE;QAChC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,YAAY,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YAChE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACrE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5G,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { RequireApplicationId } from '../resolve.js';
|
|
3
|
+
import { EscapeRegex } from '../artifact-read.js';
|
|
4
|
+
import { Text, ErrorResult } from '../result.js';
|
|
5
|
+
const KIND = z.enum(['dataType', 'attribute', 'artifactType', 'linkType', 'folder', 'page', 'widget', 'workflow']);
|
|
6
|
+
const MAP = { dataType: 'data-type', attribute: 'attribute', artifactType: 'artifact-type', linkType: 'link-type', folder: 'folder', page: 'page', widget: 'widget', workflow: 'workflow' };
|
|
7
|
+
export function RegisterListEntities(server, api, scope) {
|
|
8
|
+
server.registerTool('list_elwis_entities', {
|
|
9
|
+
title: 'List ELWIS configuration entities',
|
|
10
|
+
description: 'Enumerate the configuration of an application: data types, attributes, artifact types, link types, folders, pages, widgets, or workflows (workflows are owner-scoped, not application-scoped, and are listed tenant-wide by name). Optional name substring filter. Returns compact {id, name, alias} rows with hasMore metadata; use resolve_elwis_entity when you already know the exact name.',
|
|
11
|
+
inputSchema: {
|
|
12
|
+
kind: KIND,
|
|
13
|
+
applicationId: z.string().optional(),
|
|
14
|
+
applicationName: z.string().optional(),
|
|
15
|
+
nameContains: z.string().optional().describe('Case-insensitive substring match on the name'),
|
|
16
|
+
limit: z.number().int().positive().max(200).optional().describe('Maximum rows (default 50)'),
|
|
17
|
+
},
|
|
18
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
19
|
+
}, async ({ kind, applicationId, applicationName, nameContains, limit }) => {
|
|
20
|
+
try {
|
|
21
|
+
const appId = await RequireApplicationId(api, { applicationId, applicationName });
|
|
22
|
+
await scope.assertAllowed(appId);
|
|
23
|
+
const filter = kind === 'workflow' ? {} : { applicationId: { $oid: appId } };
|
|
24
|
+
if (nameContains)
|
|
25
|
+
filter.name = { $regex: EscapeRegex(nameContains), $options: 'i' };
|
|
26
|
+
const max = limit ?? 50;
|
|
27
|
+
let rows;
|
|
28
|
+
try {
|
|
29
|
+
rows = await api.list(MAP[kind], filter, max + 1);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
const loose = await api.list(MAP[kind], nameContains ? { name: { $regex: EscapeRegex(nameContains), $options: 'i' } } : {}, 200);
|
|
33
|
+
rows = loose.filter(r => String(r.applicationId) === appId).slice(0, max + 1);
|
|
34
|
+
}
|
|
35
|
+
const results = rows.slice(0, max).map(r => ({ id: r.id, name: r.name, alias: r.alias }));
|
|
36
|
+
return Text({ status: 'ok', returned: results.length, hasMore: rows.length > max, results });
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
return ErrorResult(e);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=list-entities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-entities.js","sourceRoot":"","sources":["../../src/tools/list-entities.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { AppScopeError } from '../app-scope.js';
|
|
3
|
+
import { RequireApplicationId, ResolveOneId } from '../resolve.js';
|
|
4
|
+
import { LoadAttributeMap, ResolveAttributeId, ResolveUnknownAttributeNames, BuildWhereClauses, EscapeRegex, SummarizeArtifact, TranslateArtifact, PageMeta } from '../artifact-read.js';
|
|
5
|
+
import { Text, ErrorResult } from '../result.js';
|
|
6
|
+
const READ_ONLY = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true };
|
|
7
|
+
const MAP_CACHE_TTL_MS = 60000;
|
|
8
|
+
const WherePrimitive = z.union([z.string(), z.number(), z.boolean(), z.null()]);
|
|
9
|
+
const WhereInput = z.object({
|
|
10
|
+
attribute: z.string().describe('Attribute name or 24-char hex id'),
|
|
11
|
+
op: z.enum(['equals', 'contains', 'gt', 'gte', 'lt', 'lte', 'in']).optional().describe('Comparison operator (default equals)'),
|
|
12
|
+
value: z.union([WherePrimitive, z.array(WherePrimitive)]).describe('Primitive value, or an array of primitives for the in operator'),
|
|
13
|
+
});
|
|
14
|
+
class ReadContext {
|
|
15
|
+
api;
|
|
16
|
+
sysAttrs = null;
|
|
17
|
+
maps = new Map();
|
|
18
|
+
typeApps = new Map();
|
|
19
|
+
constructor(api) {
|
|
20
|
+
this.api = api;
|
|
21
|
+
}
|
|
22
|
+
systemAttributes() {
|
|
23
|
+
this.sysAttrs = this.sysAttrs ?? this.api.systemAttributes();
|
|
24
|
+
return this.sysAttrs;
|
|
25
|
+
}
|
|
26
|
+
attributeMap(applicationId) {
|
|
27
|
+
const hit = this.maps.get(applicationId);
|
|
28
|
+
if (hit && Date.now() - hit.at < MAP_CACHE_TTL_MS)
|
|
29
|
+
return hit.map;
|
|
30
|
+
const map = LoadAttributeMap(this.api, applicationId);
|
|
31
|
+
this.maps.set(applicationId, { at: Date.now(), map });
|
|
32
|
+
return map;
|
|
33
|
+
}
|
|
34
|
+
applicationOfType(artifactTypeId) {
|
|
35
|
+
let hit = this.typeApps.get(artifactTypeId);
|
|
36
|
+
if (!hit) {
|
|
37
|
+
hit = this.api.getOne('artifact-type', artifactTypeId)
|
|
38
|
+
.then(t => (t.applicationId ? String(t.applicationId) : null))
|
|
39
|
+
.catch(() => null);
|
|
40
|
+
this.typeApps.set(artifactTypeId, hit);
|
|
41
|
+
}
|
|
42
|
+
return hit;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async function AssertArtifactInScope(ctx, scope, artifact) {
|
|
46
|
+
const applicationId = await ctx.applicationOfType(String(artifact.artifactTypeId));
|
|
47
|
+
if (!scope.restricted)
|
|
48
|
+
return applicationId;
|
|
49
|
+
if (!applicationId)
|
|
50
|
+
throw new Error('The record has no resolvable owning application; a scoped deployment cannot serve it');
|
|
51
|
+
try {
|
|
52
|
+
await scope.assertAllowed(applicationId);
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
if (e instanceof AppScopeError)
|
|
56
|
+
throw new Error('The record is outside the configured application allowlist (ELWIS_ALLOWED_APPS)', { cause: e });
|
|
57
|
+
throw e;
|
|
58
|
+
}
|
|
59
|
+
return applicationId;
|
|
60
|
+
}
|
|
61
|
+
async function CounterpartInScope(ctx, scope, artifact) {
|
|
62
|
+
if (!scope.restricted || !artifact)
|
|
63
|
+
return true;
|
|
64
|
+
const applicationId = await ctx.applicationOfType(String(artifact.artifactTypeId));
|
|
65
|
+
if (!applicationId)
|
|
66
|
+
return false;
|
|
67
|
+
const allowed = await scope.allowedIds();
|
|
68
|
+
return allowed === null || allowed.has(applicationId);
|
|
69
|
+
}
|
|
70
|
+
export function RegisterReadArtifacts(server, api, scope) {
|
|
71
|
+
const ctx = new ReadContext(api);
|
|
72
|
+
server.registerTool('list_elwis_artifacts', {
|
|
73
|
+
title: 'List ELWIS artifacts',
|
|
74
|
+
description: 'List or search live data records (artifacts) the configured user can access. Scope by application (required) and optionally by artifact type, folder path, a name substring, and attribute-value conditions combined with AND (attribute names are resolved for you; values must be primitives). Returns compact summaries with total/hasMore pagination metadata; fetch full records with get_elwis_artifact.',
|
|
75
|
+
inputSchema: {
|
|
76
|
+
applicationId: z.string().optional(),
|
|
77
|
+
applicationName: z.string().optional(),
|
|
78
|
+
artifactType: z.string().optional().describe('Artifact type name or id; when omitted, all types of the application are searched'),
|
|
79
|
+
nameContains: z.string().optional().describe('Case-insensitive substring match on the record name'),
|
|
80
|
+
folderPathContains: z.string().optional().describe('Case-insensitive substring match on the folder path'),
|
|
81
|
+
where: z.array(WhereInput).optional().describe('Attribute-value conditions, combined with AND'),
|
|
82
|
+
sortBy: z.string().optional().describe('Attribute name or id to sort by'),
|
|
83
|
+
sortOrder: z.enum(['asc', 'desc']).optional(),
|
|
84
|
+
limit: z.number().int().positive().max(100).optional().describe('Page size (default 25)'),
|
|
85
|
+
skip: z.number().int().min(0).optional(),
|
|
86
|
+
},
|
|
87
|
+
annotations: READ_ONLY,
|
|
88
|
+
}, async (raw) => {
|
|
89
|
+
try {
|
|
90
|
+
const applicationId = await RequireApplicationId(api, raw);
|
|
91
|
+
await scope.assertAllowed(applicationId);
|
|
92
|
+
const map = await ctx.attributeMap(applicationId);
|
|
93
|
+
const sys = await ctx.systemAttributes();
|
|
94
|
+
const and = [];
|
|
95
|
+
if (raw.artifactType) {
|
|
96
|
+
and.push({ artifactTypeId: { $oid: await ResolveOneId(api, 'artifact-type', applicationId, raw.artifactType) } });
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
const types = await api.list('artifact-type', { applicationId: { $oid: applicationId } }, 501);
|
|
100
|
+
if (types.length > 500)
|
|
101
|
+
throw new Error('The application has more than 500 artifact types; pass an explicit artifactType');
|
|
102
|
+
and.push({ artifactTypeId: { $in: types.map(t => ({ $oid: t.id })) } });
|
|
103
|
+
}
|
|
104
|
+
if (raw.nameContains)
|
|
105
|
+
and.push({ [`attributes.${sys.nameAttributeId}.value`]: { $regex: EscapeRegex(raw.nameContains), $options: 'i' } });
|
|
106
|
+
if (raw.folderPathContains)
|
|
107
|
+
and.push({ 'folderData.path': { $regex: EscapeRegex(raw.folderPathContains), $options: 'i' } });
|
|
108
|
+
if (raw.where?.length)
|
|
109
|
+
and.push(...BuildWhereClauses(map, raw.where));
|
|
110
|
+
const sort = raw.sortBy
|
|
111
|
+
? { [`attributes.${ResolveAttributeId(map, raw.sortBy)}.value`]: raw.sortOrder === 'desc' ? -1 : 1 }
|
|
112
|
+
: undefined;
|
|
113
|
+
const page = await api.listRecords('artifact', { $and: and }, { sort, skip: raw.skip ?? 0, limit: raw.limit ?? 25 });
|
|
114
|
+
const results = page.data.map(a => SummarizeArtifact(a, sys.nameAttributeId));
|
|
115
|
+
return Text({ status: 'ok', ...PageMeta(page.meta, results.length), results });
|
|
116
|
+
}
|
|
117
|
+
catch (e) {
|
|
118
|
+
return ErrorResult(e);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
server.registerTool('get_elwis_artifact', {
|
|
122
|
+
title: 'Get one ELWIS artifact',
|
|
123
|
+
description: 'Get one data record (artifact) by id with its attribute values translated to attribute names. Long values and long arrays are truncated with explicit markers; values whose attribute name is unknown or collides stay addressable in unmappedValuesById.',
|
|
124
|
+
inputSchema: { id: z.string().describe('Artifact id from list_elwis_artifacts') },
|
|
125
|
+
annotations: READ_ONLY,
|
|
126
|
+
}, async ({ id }) => {
|
|
127
|
+
try {
|
|
128
|
+
const artifact = await api.getOne('artifact', id);
|
|
129
|
+
const applicationId = await AssertArtifactInScope(ctx, scope, artifact);
|
|
130
|
+
const artifactTypeName = applicationId === null ? null : (await api.getOne('artifact-type', String(artifact.artifactTypeId))).name;
|
|
131
|
+
const map = applicationId ? await ctx.attributeMap(applicationId) : { byId: new Map(), byName: new Map() };
|
|
132
|
+
await ResolveUnknownAttributeNames(api, map, Object.keys(artifact.attributes ?? {}));
|
|
133
|
+
return Text({ status: 'ok', applicationId, artifactTypeName, ...TranslateArtifact(artifact, map) });
|
|
134
|
+
}
|
|
135
|
+
catch (e) {
|
|
136
|
+
return ErrorResult(e);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
server.registerTool('list_elwis_artifact_links', {
|
|
140
|
+
title: 'List links of an ELWIS artifact',
|
|
141
|
+
description: 'List the links (relationships) of one artifact: link type, direction, and the record on the other side with its name. Counterparts living outside the configured application allowlist are redacted and marked outOfScope. Paginated.',
|
|
142
|
+
inputSchema: {
|
|
143
|
+
id: z.string().describe('Artifact id'),
|
|
144
|
+
direction: z.enum(['source', 'destination', 'both']).optional().describe('Restrict to links where this artifact is the source or the destination (default both)'),
|
|
145
|
+
limit: z.number().int().positive().max(100).optional(),
|
|
146
|
+
skip: z.number().int().min(0).optional(),
|
|
147
|
+
},
|
|
148
|
+
annotations: READ_ONLY,
|
|
149
|
+
}, async ({ id, direction, limit, skip }) => {
|
|
150
|
+
try {
|
|
151
|
+
const artifact = await api.getOne('artifact', id);
|
|
152
|
+
await AssertArtifactInScope(ctx, scope, artifact);
|
|
153
|
+
const clauses = [];
|
|
154
|
+
if (direction !== 'destination')
|
|
155
|
+
clauses.push({ sourceArtifactId: { $oid: id } });
|
|
156
|
+
if (direction !== 'source')
|
|
157
|
+
clauses.push({ destinationArtifactId: { $oid: id } });
|
|
158
|
+
const page = await api.listRecords('link', { $or: clauses }, { skip: skip ?? 0, limit: limit ?? 25 });
|
|
159
|
+
if (page.data.length === 0)
|
|
160
|
+
return Text({ status: 'ok', ...PageMeta(page.meta, 0), results: [] });
|
|
161
|
+
const sys = await ctx.systemAttributes();
|
|
162
|
+
const counterpartIds = [...new Set(page.data.map(l => String(String(l.sourceArtifactId) === id ? l.destinationArtifactId : l.sourceArtifactId)))];
|
|
163
|
+
const counterparts = new Map();
|
|
164
|
+
await Promise.all(counterpartIds.map(async (cid) => {
|
|
165
|
+
try {
|
|
166
|
+
counterparts.set(cid, await api.getOne('artifact', cid));
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
counterparts.set(cid, null);
|
|
170
|
+
}
|
|
171
|
+
}));
|
|
172
|
+
const linkTypeNames = new Map();
|
|
173
|
+
const results = await Promise.all(page.data.map(async (link) => {
|
|
174
|
+
const ltId = String(link.linkTypeId);
|
|
175
|
+
if (!linkTypeNames.has(ltId))
|
|
176
|
+
linkTypeNames.set(ltId, api.getOne('link-type', ltId).then(lt => lt.name).catch(() => ltId));
|
|
177
|
+
const isSource = String(link.sourceArtifactId) === id;
|
|
178
|
+
const otherId = String(isSource ? link.destinationArtifactId : link.sourceArtifactId);
|
|
179
|
+
const other = counterparts.get(otherId) ?? null;
|
|
180
|
+
const inScope = await CounterpartInScope(ctx, scope, other);
|
|
181
|
+
return {
|
|
182
|
+
linkId: link.id,
|
|
183
|
+
linkType: await linkTypeNames.get(ltId),
|
|
184
|
+
direction: isSource ? 'outgoing' : 'incoming',
|
|
185
|
+
...(inScope
|
|
186
|
+
? { otherArtifactId: otherId, otherArtifactName: other?.attributes?.[sys.nameAttributeId]?.value ?? null }
|
|
187
|
+
: { otherArtifactId: null, otherArtifactName: null, outOfScope: true }),
|
|
188
|
+
};
|
|
189
|
+
}));
|
|
190
|
+
return Text({ status: 'ok', ...PageMeta(page.meta, results.length), results });
|
|
191
|
+
}
|
|
192
|
+
catch (e) {
|
|
193
|
+
return ErrorResult(e);
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=read-artifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-artifacts.js","sourceRoot":"","sources":["../../src/tools/read-artifacts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,iBAAiB,EAAE,WAAW,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEzL,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,SAAS,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAW,CAAC;AACrH,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAChF,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IAClE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IAC9H,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,gEAAgE,CAAC;CACrI,CAAC,CAAC;AAEH,MAAM,WAAW;IAIc;IAHrB,QAAQ,GAAgD,IAAI,CAAC;IACpD,IAAI,GAAG,IAAI,GAAG,EAAsD,CAAC;IACrE,QAAQ,GAAG,IAAI,GAAG,EAAkC,CAAC;IACtE,YAA6B,GAAa;QAAb,QAAG,GAAH,GAAG,CAAU;IAAG,CAAC;IAE9C,gBAAgB;QACd,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC7D,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,YAAY,CAAC,aAAqB;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACzC,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,gBAAgB;YAAE,OAAO,GAAG,CAAC,GAAG,CAAC;QAClE,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACtD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,iBAAiB,CAAC,cAAsB;QACtC,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,cAAc,CAAC;iBACnD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAE,CAA6B,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAE,CAA6B,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;iBACvH,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YACrB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAED,KAAK,UAAU,qBAAqB,CAAC,GAAgB,EAAE,KAAe,EAAE,QAA6B;IACnG,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;IACnF,IAAI,CAAC,KAAK,CAAC,UAAU;QAAE,OAAO,aAAa,CAAC;IAC5C,IAAI,CAAC,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAC;IAC5H,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,aAAa;YAAE,MAAM,IAAI,KAAK,CAAC,iFAAiF,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACjJ,MAAM,CAAC,CAAC;IACV,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,GAAgB,EAAE,KAAe,EAAE,QAAoC;IACvG,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAChD,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;IACnF,IAAI,CAAC,aAAa;QAAE,OAAO,KAAK,CAAC;IACjC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;IACzC,OAAO,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,GAAa,EAAE,KAAe;IACrF,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;IAEjC,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,gZAAgZ;QAC7Z,WAAW,EAAE;YACX,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YACpC,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YACtC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mFAAmF,CAAC;YACjI,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;YACnG,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;YACzG,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;YAC/F,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YACzE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;YAC7C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YACzF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;SACzC;QACD,WAAW,EAAE,SAAS;KACvB,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC3D,MAAM,KAAK,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;YACzC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YAClD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACzC,MAAM,GAAG,GAAmC,EAAE,CAAC;YAC/C,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;gBACrB,GAAG,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC,GAAG,EAAE,eAAe,EAAE,aAAa,EAAE,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC;YACpH,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;gBAC/F,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG;oBAAE,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;gBAC3H,GAAG,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1E,CAAC;YACD,IAAI,GAAG,CAAC,YAAY;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,GAAG,CAAC,eAAe,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YAC1I,IAAI,GAAG,CAAC,kBAAkB;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,iBAAiB,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YAC5H,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM;gBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YACtE,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM;gBACrB,CAAC,CAAC,EAAE,CAAC,cAAc,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;gBACpG,CAAC,CAAC,SAAS,CAAC;YACd,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC;YACrH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;YAC9E,OAAO,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QACjF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE,2PAA2P;QACxQ,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC,EAAE;QACjF,WAAW,EAAE,SAAS;KACvB,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,MAAM,CAAsB,UAAU,EAAE,EAAE,CAAC,CAAC;YACvE,MAAM,aAAa,GAAG,MAAM,qBAAqB,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YACxE,MAAM,gBAAgB,GAAG,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACnI,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,EAAkB,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;YAC3H,MAAM,4BAA4B,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC;YACrF,OAAO,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAAG,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACtG,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,2BAA2B,EAC3B;QACE,KAAK,EAAE,iCAAiC;QACxC,WAAW,EAAE,uOAAuO;QACpP,WAAW,EAAE;YACX,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;YACtC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uFAAuF,CAAC;YACjK,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;YACtD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;SACzC;QACD,WAAW,EAAE,SAAS;KACvB,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,MAAM,CAAsB,UAAU,EAAE,EAAE,CAAC,CAAC;YACvE,MAAM,qBAAqB,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAClD,MAAM,OAAO,GAAG,EAAE,CAAC;YACnB,IAAI,SAAS,KAAK,aAAa;gBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAClF,IAAI,SAAS,KAAK,QAAQ;gBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,qBAAqB,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAClF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC;YACtG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;YAClG,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACzC,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;YAClJ,MAAM,YAAY,GAAG,IAAI,GAAG,EAAsC,CAAC;YACnE,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBACjD,IAAI,CAAC;oBAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,MAAM,CAAsB,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAAC,CAAC;YAC/H,CAAC,CAAC,CAAC,CAAC;YACJ,MAAM,aAAa,GAAG,IAAI,GAAG,EAA2B,CAAC;YACzD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;gBAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACrC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC3H,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;gBACtD,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBACtF,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;gBAChD,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBAC5D,OAAO;oBACL,MAAM,EAAE,IAAI,CAAC,EAAE;oBACf,QAAQ,EAAE,MAAM,aAAa,CAAC,GAAG,CAAC,IAAI,CAAE;oBACxC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU;oBAC7C,GAAG,CAAC,OAAO;wBACT,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,KAAK,IAAI,IAAI,EAAE;wBAC1G,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;iBAC1E,CAAC;YACJ,CAAC,CAAC,CAAC,CAAC;YACJ,OAAO,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QACjF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ResolveEntity, RequireApplicationId } from '../resolve.js';
|
|
3
|
+
import { Text, ErrorResult } from '../result.js';
|
|
4
|
+
const KIND = z.enum(['dataType', 'attribute', 'artifactType', 'linkType', 'folder', 'page']);
|
|
5
|
+
const MAP = { dataType: 'data-type', attribute: 'attribute', artifactType: 'artifact-type', linkType: 'link-type', folder: 'folder', page: 'page' };
|
|
6
|
+
export function RegisterResolveEntity(server, api, scope) {
|
|
7
|
+
server.registerTool('resolve_elwis_entity', {
|
|
8
|
+
description: 'Resolve a data type / attribute / artifact type / link type / folder / page by name or alias within an application to its stable id. Active records only.',
|
|
9
|
+
inputSchema: { applicationId: z.string().optional(), applicationName: z.string().optional(), kind: KIND, nameOrAlias: z.string() },
|
|
10
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
11
|
+
}, async ({ applicationId, applicationName, kind, nameOrAlias }) => {
|
|
12
|
+
try {
|
|
13
|
+
const appId = await RequireApplicationId(api, { applicationId, applicationName });
|
|
14
|
+
await scope.assertAllowed(appId);
|
|
15
|
+
return Text({ status: 'ok', ...(await ResolveEntity(api, MAP[kind], appId, nameOrAlias)) });
|
|
16
|
+
}
|
|
17
|
+
catch (e) {
|
|
18
|
+
return ErrorResult(e);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=resolve-entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-entity.js","sourceRoot":"","sources":["../../src/tools/resolve-entity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAEpE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AAC7F,MAAM,GAAG,GAA+B,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAEhL,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,GAAa,EAAE,KAAe;IACrF,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,WAAW,EAAE,2JAA2J;QACxK,WAAW,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;QAClI,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;KAC/E,EACD,KAAK,EAAE,EAAE,aAAa,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE;QAC9D,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC,CAAC;YAClF,MAAM,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACjC,OAAO,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9F,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@softacus-software/elwis-docs-mcp",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Read-only Model Context Protocol server for
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Read-only Model Context Protocol server for ELWIS: live data reads and API documentation, with no write tools at all.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"elwis-docs-mcp": "dist/index.js"
|