mcp-dataverse 0.3.7 → 0.3.9
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/CAPABILITIES.md +1039 -1039
- package/LICENSE +21 -21
- package/README.md +114 -113
- package/dist/auth-provider.factory-MSMLSOX3.js +1 -0
- package/dist/chunk-24RDOMG4.js +29 -0
- package/dist/chunk-OXKMMPM3.js +37 -0
- package/dist/chunk-PAX4NW5B.js +1 -0
- package/dist/chunk-SUDI4JM6.js +3 -0
- package/dist/config.loader-VTIKUDN7.js +1 -0
- package/dist/dataverse-client-advanced-T5ZJMRLK.js +1 -0
- package/dist/doctor.js +2 -102
- package/dist/http-server.js +3 -61
- package/dist/install.js +8 -233
- package/dist/server.js +43 -202
- package/dist/setup-auth.js +18 -41
- package/package.json +95 -94
- package/server.json +51 -50
- package/dist/auth/auth-provider.factory.d.ts +0 -4
- package/dist/auth/auth-provider.factory.d.ts.map +0 -1
- package/dist/auth/auth-provider.factory.js +0 -5
- package/dist/auth/auth-provider.factory.js.map +0 -1
- package/dist/auth/auth-provider.interface.d.ts +0 -21
- package/dist/auth/auth-provider.interface.d.ts.map +0 -1
- package/dist/auth/auth-provider.interface.js +0 -2
- package/dist/auth/auth-provider.interface.js.map +0 -1
- package/dist/auth/device-code-auth-provider.d.ts +0 -18
- package/dist/auth/device-code-auth-provider.d.ts.map +0 -1
- package/dist/auth/device-code-auth-provider.js +0 -167
- package/dist/auth/device-code-auth-provider.js.map +0 -1
- package/dist/config/config.loader.d.ts +0 -3
- package/dist/config/config.loader.d.ts.map +0 -1
- package/dist/config/config.loader.js +0 -39
- package/dist/config/config.loader.js.map +0 -1
- package/dist/config/config.schema.d.ts +0 -16
- package/dist/config/config.schema.d.ts.map +0 -1
- package/dist/config/config.schema.js +0 -20
- package/dist/config/config.schema.js.map +0 -1
- package/dist/dataverse/dataverse-client-advanced.d.ts +0 -53
- package/dist/dataverse/dataverse-client-advanced.d.ts.map +0 -1
- package/dist/dataverse/dataverse-client-advanced.js +0 -199
- package/dist/dataverse/dataverse-client-advanced.js.map +0 -1
- package/dist/dataverse/dataverse-client.actions.d.ts +0 -11
- package/dist/dataverse/dataverse-client.actions.d.ts.map +0 -1
- package/dist/dataverse/dataverse-client.actions.js +0 -25
- package/dist/dataverse/dataverse-client.actions.js.map +0 -1
- package/dist/dataverse/dataverse-client.batch.d.ts +0 -10
- package/dist/dataverse/dataverse-client.batch.d.ts.map +0 -1
- package/dist/dataverse/dataverse-client.batch.js +0 -74
- package/dist/dataverse/dataverse-client.batch.js.map +0 -1
- package/dist/dataverse/dataverse-client.d.ts +0 -46
- package/dist/dataverse/dataverse-client.d.ts.map +0 -1
- package/dist/dataverse/dataverse-client.js +0 -275
- package/dist/dataverse/dataverse-client.js.map +0 -1
- package/dist/dataverse/dataverse-client.metadata.d.ts +0 -41
- package/dist/dataverse/dataverse-client.metadata.d.ts.map +0 -1
- package/dist/dataverse/dataverse-client.metadata.js +0 -124
- package/dist/dataverse/dataverse-client.metadata.js.map +0 -1
- package/dist/dataverse/dataverse-client.utils.d.ts +0 -14
- package/dist/dataverse/dataverse-client.utils.d.ts.map +0 -1
- package/dist/dataverse/dataverse-client.utils.js +0 -65
- package/dist/dataverse/dataverse-client.utils.js.map +0 -1
- package/dist/dataverse/http-client.d.ts +0 -38
- package/dist/dataverse/http-client.d.ts.map +0 -1
- package/dist/dataverse/http-client.js +0 -111
- package/dist/dataverse/http-client.js.map +0 -1
- package/dist/dataverse/types.d.ts +0 -68
- package/dist/dataverse/types.d.ts.map +0 -1
- package/dist/dataverse/types.js +0 -2
- package/dist/dataverse/types.js.map +0 -1
- package/dist/doctor.d.ts +0 -7
- package/dist/doctor.d.ts.map +0 -1
- package/dist/doctor.js.map +0 -1
- package/dist/http-server.d.ts +0 -3
- package/dist/http-server.d.ts.map +0 -1
- package/dist/http-server.js.map +0 -1
- package/dist/install.d.ts +0 -3
- package/dist/install.d.ts.map +0 -1
- package/dist/install.js.map +0 -1
- package/dist/resources/resource-provider.d.ts +0 -11
- package/dist/resources/resource-provider.d.ts.map +0 -1
- package/dist/resources/resource-provider.js +0 -79
- package/dist/resources/resource-provider.js.map +0 -1
- package/dist/server.d.ts +0 -3
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js.map +0 -1
- package/dist/setup-auth.d.ts +0 -3
- package/dist/setup-auth.d.ts.map +0 -1
- package/dist/setup-auth.js.map +0 -1
- package/dist/tools/actions.tools.d.ts +0 -206
- package/dist/tools/actions.tools.d.ts.map +0 -1
- package/dist/tools/actions.tools.js +0 -256
- package/dist/tools/actions.tools.js.map +0 -1
- package/dist/tools/annotations.tools.d.ts +0 -94
- package/dist/tools/annotations.tools.d.ts.map +0 -1
- package/dist/tools/annotations.tools.js +0 -225
- package/dist/tools/annotations.tools.js.map +0 -1
- package/dist/tools/audit.tools.d.ts +0 -51
- package/dist/tools/audit.tools.d.ts.map +0 -1
- package/dist/tools/audit.tools.js +0 -170
- package/dist/tools/audit.tools.js.map +0 -1
- package/dist/tools/auth.tools.d.ts +0 -23
- package/dist/tools/auth.tools.d.ts.map +0 -1
- package/dist/tools/auth.tools.js +0 -36
- package/dist/tools/auth.tools.js.map +0 -1
- package/dist/tools/batch.tools.d.ts +0 -52
- package/dist/tools/batch.tools.d.ts.map +0 -1
- package/dist/tools/batch.tools.js +0 -89
- package/dist/tools/batch.tools.js.map +0 -1
- package/dist/tools/crud.tools.d.ts +0 -260
- package/dist/tools/crud.tools.d.ts.map +0 -1
- package/dist/tools/crud.tools.js +0 -290
- package/dist/tools/crud.tools.js.map +0 -1
- package/dist/tools/customization.tools.d.ts +0 -127
- package/dist/tools/customization.tools.d.ts.map +0 -1
- package/dist/tools/customization.tools.js +0 -285
- package/dist/tools/customization.tools.js.map +0 -1
- package/dist/tools/environment.tools.d.ts +0 -106
- package/dist/tools/environment.tools.d.ts.map +0 -1
- package/dist/tools/environment.tools.js +0 -274
- package/dist/tools/environment.tools.js.map +0 -1
- package/dist/tools/file.tools.d.ts +0 -73
- package/dist/tools/file.tools.d.ts.map +0 -1
- package/dist/tools/file.tools.js +0 -160
- package/dist/tools/file.tools.js.map +0 -1
- package/dist/tools/guardrails.d.ts +0 -22
- package/dist/tools/guardrails.d.ts.map +0 -1
- package/dist/tools/guardrails.js +0 -56
- package/dist/tools/guardrails.js.map +0 -1
- package/dist/tools/impersonate.tools.d.ts +0 -44
- package/dist/tools/impersonate.tools.d.ts.map +0 -1
- package/dist/tools/impersonate.tools.js +0 -87
- package/dist/tools/impersonate.tools.js.map +0 -1
- package/dist/tools/metadata.tools.d.ts +0 -279
- package/dist/tools/metadata.tools.d.ts.map +0 -1
- package/dist/tools/metadata.tools.js +0 -400
- package/dist/tools/metadata.tools.js.map +0 -1
- package/dist/tools/org.tools.d.ts +0 -32
- package/dist/tools/org.tools.d.ts.map +0 -1
- package/dist/tools/org.tools.js +0 -65
- package/dist/tools/org.tools.js.map +0 -1
- package/dist/tools/output.utils.d.ts +0 -63
- package/dist/tools/output.utils.d.ts.map +0 -1
- package/dist/tools/output.utils.js +0 -78
- package/dist/tools/output.utils.js.map +0 -1
- package/dist/tools/progress.d.ts +0 -15
- package/dist/tools/progress.d.ts.map +0 -1
- package/dist/tools/progress.js +0 -29
- package/dist/tools/progress.js.map +0 -1
- package/dist/tools/quality.tools.d.ts +0 -36
- package/dist/tools/quality.tools.d.ts.map +0 -1
- package/dist/tools/quality.tools.js +0 -97
- package/dist/tools/quality.tools.js.map +0 -1
- package/dist/tools/query.tools.d.ts +0 -151
- package/dist/tools/query.tools.d.ts.map +0 -1
- package/dist/tools/query.tools.js +0 -293
- package/dist/tools/query.tools.js.map +0 -1
- package/dist/tools/relations.tools.d.ts +0 -77
- package/dist/tools/relations.tools.d.ts.map +0 -1
- package/dist/tools/relations.tools.js +0 -96
- package/dist/tools/relations.tools.js.map +0 -1
- package/dist/tools/router.tools.d.ts +0 -5
- package/dist/tools/router.tools.d.ts.map +0 -1
- package/dist/tools/router.tools.js +0 -247
- package/dist/tools/router.tools.js.map +0 -1
- package/dist/tools/search.tools.d.ts +0 -74
- package/dist/tools/search.tools.d.ts.map +0 -1
- package/dist/tools/search.tools.js +0 -142
- package/dist/tools/search.tools.js.map +0 -1
- package/dist/tools/solution.tools.d.ts +0 -113
- package/dist/tools/solution.tools.d.ts.map +0 -1
- package/dist/tools/solution.tools.js +0 -176
- package/dist/tools/solution.tools.js.map +0 -1
- package/dist/tools/teams.tools.d.ts +0 -65
- package/dist/tools/teams.tools.d.ts.map +0 -1
- package/dist/tools/teams.tools.js +0 -127
- package/dist/tools/teams.tools.js.map +0 -1
- package/dist/tools/tool-registry.d.ts +0 -35
- package/dist/tools/tool-registry.d.ts.map +0 -1
- package/dist/tools/tool-registry.js +0 -31
- package/dist/tools/tool-registry.js.map +0 -1
- package/dist/tools/trace.tools.d.ts +0 -75
- package/dist/tools/trace.tools.d.ts.map +0 -1
- package/dist/tools/trace.tools.js +0 -233
- package/dist/tools/trace.tools.js.map +0 -1
- package/dist/tools/tracking.tools.d.ts +0 -41
- package/dist/tools/tracking.tools.d.ts.map +0 -1
- package/dist/tools/tracking.tools.js +0 -76
- package/dist/tools/tracking.tools.js.map +0 -1
- package/dist/tools/users.tools.d.ts +0 -141
- package/dist/tools/users.tools.d.ts.map +0 -1
- package/dist/tools/users.tools.js +0 -321
- package/dist/tools/users.tools.js.map +0 -1
- package/dist/tools/validation.utils.d.ts +0 -6
- package/dist/tools/validation.utils.d.ts.map +0 -1
- package/dist/tools/validation.utils.js +0 -14
- package/dist/tools/validation.utils.js.map +0 -1
- package/dist/tools/views.tools.d.ts +0 -36
- package/dist/tools/views.tools.d.ts.map +0 -1
- package/dist/tools/views.tools.js +0 -92
- package/dist/tools/views.tools.js.map +0 -1
- package/dist/tools/workflow.tools.d.ts +0 -111
- package/dist/tools/workflow.tools.d.ts.map +0 -1
- package/dist/tools/workflow.tools.js +0 -449
- package/dist/tools/workflow.tools.js.map +0 -1
- package/dist/transport.d.ts +0 -6
- package/dist/transport.d.ts.map +0 -1
- package/dist/transport.js +0 -21
- package/dist/transport.js.map +0 -1
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Wraps a structured output into the MCP tool result format.
|
|
3
|
-
* Every tool handler should use this for consistent, LLM-friendly responses.
|
|
4
|
-
*/
|
|
5
|
-
export function formatToolOutput(output) {
|
|
6
|
-
return {
|
|
7
|
-
content: [
|
|
8
|
-
{
|
|
9
|
-
type: "text",
|
|
10
|
-
text: JSON.stringify(output, null, 2),
|
|
11
|
-
},
|
|
12
|
-
],
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Convenience: wrap raw data with a summary line and optional suggestions.
|
|
17
|
-
*/
|
|
18
|
-
export function formatData(summary, data, suggestions, warnings) {
|
|
19
|
-
return formatToolOutput({ summary, data, suggestions, warnings });
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Format a count-based result (list of items).
|
|
23
|
-
*/
|
|
24
|
-
export function formatList(label, items, suggestions) {
|
|
25
|
-
return formatToolOutput({
|
|
26
|
-
summary: `${items.length} ${label} found.`,
|
|
27
|
-
data: items,
|
|
28
|
-
suggestions,
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Returns a structured "cannot proceed — environment prerequisite missing"
|
|
33
|
-
* response. The tool should RETURN this instead of throwing so that the
|
|
34
|
-
* agent receives a parseable JSON payload it can relay to the user.
|
|
35
|
-
*/
|
|
36
|
-
export function formatPrerequisiteError(prerequisite) {
|
|
37
|
-
return formatToolOutput({
|
|
38
|
-
summary: `Blocked: ${prerequisite.cannotProceedBecause}`,
|
|
39
|
-
data: null,
|
|
40
|
-
prerequisite,
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
// ── Formatted Value Annotation Merge ─────────────────────────────────────────
|
|
44
|
-
const FORMATTED_VALUE_SUFFIX = "@OData.Community.Display.V1.FormattedValue";
|
|
45
|
-
/**
|
|
46
|
-
* Merges OData formatted-value annotations into each record.
|
|
47
|
-
* Transforms `{ statuscode: 1, "statuscode@OData.Community.Display.V1.FormattedValue": "Active" }`
|
|
48
|
-
* into `{ statuscode: { value: 1, label: "Active" } }`.
|
|
49
|
-
*/
|
|
50
|
-
export function mergeFormattedValues(records) {
|
|
51
|
-
return records.map((record) => {
|
|
52
|
-
if (typeof record !== "object" || record === null)
|
|
53
|
-
return record;
|
|
54
|
-
const r = record;
|
|
55
|
-
const annotMap = {};
|
|
56
|
-
for (const key of Object.keys(r)) {
|
|
57
|
-
if (key.endsWith(FORMATTED_VALUE_SUFFIX)) {
|
|
58
|
-
const baseKey = key.slice(0, -FORMATTED_VALUE_SUFFIX.length);
|
|
59
|
-
annotMap[baseKey] = r[key];
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
if (Object.keys(annotMap).length === 0)
|
|
63
|
-
return record;
|
|
64
|
-
const merged = {};
|
|
65
|
-
for (const key of Object.keys(r)) {
|
|
66
|
-
if (key.endsWith(FORMATTED_VALUE_SUFFIX))
|
|
67
|
-
continue;
|
|
68
|
-
if (Object.prototype.hasOwnProperty.call(annotMap, key)) {
|
|
69
|
-
merged[key] = { value: r[key], label: annotMap[key] };
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
merged[key] = r[key];
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
return merged;
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
//# sourceMappingURL=output.utils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"output.utils.js","sourceRoot":"","sources":["../../src/tools/output.utils.ts"],"names":[],"mappings":"AA+CA;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAwB;IACvD,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;aACtC;SACF;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,OAAe,EACf,IAAa,EACb,WAAsB,EACtB,QAAmB;IAEnB,OAAO,gBAAgB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,KAAa,EACb,KAAgB,EAChB,WAAsB;IAEtB,OAAO,gBAAgB,CAAC;QACtB,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,SAAS;QAC1C,IAAI,EAAE,KAAK;QACX,WAAW;KACZ,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CACrC,YAAqC;IAErC,OAAO,gBAAgB,CAAC;QACtB,OAAO,EAAE,YAAY,YAAY,CAAC,oBAAoB,EAAE;QACxD,IAAI,EAAE,IAAI;QACV,YAAY;KACb,CAAC,CAAC;AACL,CAAC;AAED,gFAAgF;AAEhF,MAAM,sBAAsB,GAAG,4CAA4C,CAAC;AAE5E;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAI,OAAY;IAClD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QAC5B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,MAAM,CAAC;QACjE,MAAM,CAAC,GAAG,MAAiC,CAAC;QAC5C,MAAM,QAAQ,GAA4B,EAAE,CAAC;QAC7C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,IAAI,GAAG,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;gBACzC,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;gBAC7D,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;QACtD,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,IAAI,GAAG,CAAC,QAAQ,CAAC,sBAAsB,CAAC;gBAAE,SAAS;YACnD,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC;gBACxD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QACD,OAAO,MAAW,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/tools/progress.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
2
|
-
/**
|
|
3
|
-
* Optional progress reporter for long-running tool operations.
|
|
4
|
-
* When a server instance and progress token are available, sends
|
|
5
|
-
* MCP progress notifications. Otherwise, silently no-ops.
|
|
6
|
-
*/
|
|
7
|
-
export declare class ProgressReporter {
|
|
8
|
-
private server;
|
|
9
|
-
private token;
|
|
10
|
-
constructor(server?: Server, token?: string | number);
|
|
11
|
-
report(progress: number, total: number): Promise<void>;
|
|
12
|
-
}
|
|
13
|
-
/** Singleton no-op reporter for when progress is not available */
|
|
14
|
-
export declare const NO_PROGRESS: ProgressReporter;
|
|
15
|
-
//# sourceMappingURL=progress.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/tools/progress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAExE;;;;GAIG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,KAAK,CAAyB;gBAE1B,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAK9C,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAW7D;AAED,kEAAkE;AAClE,eAAO,MAAM,WAAW,kBAAyB,CAAC"}
|
package/dist/tools/progress.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Optional progress reporter for long-running tool operations.
|
|
3
|
-
* When a server instance and progress token are available, sends
|
|
4
|
-
* MCP progress notifications. Otherwise, silently no-ops.
|
|
5
|
-
*/
|
|
6
|
-
export class ProgressReporter {
|
|
7
|
-
server;
|
|
8
|
-
token;
|
|
9
|
-
constructor(server, token) {
|
|
10
|
-
this.server = server ?? null;
|
|
11
|
-
this.token = token ?? null;
|
|
12
|
-
}
|
|
13
|
-
async report(progress, total) {
|
|
14
|
-
if (!this.server || this.token == null)
|
|
15
|
-
return;
|
|
16
|
-
try {
|
|
17
|
-
await this.server.notification({
|
|
18
|
-
method: "notifications/progress",
|
|
19
|
-
params: { progressToken: this.token, progress, total },
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
catch {
|
|
23
|
-
// Swallow — progress is best-effort
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
/** Singleton no-op reporter for when progress is not available */
|
|
28
|
-
export const NO_PROGRESS = new ProgressReporter();
|
|
29
|
-
//# sourceMappingURL=progress.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/tools/progress.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,gBAAgB;IACnB,MAAM,CAAgB;IACtB,KAAK,CAAyB;IAEtC,YAAY,MAAe,EAAE,KAAuB;QAClD,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,IAAI,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAgB,EAAE,KAAa;QAC1C,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI;YAAE,OAAO;QAC/C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;gBAC7B,MAAM,EAAE,wBAAwB;gBAChC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE;aACvD,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;IACH,CAAC;CACF;AAED,kEAAkE;AAClE,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,gBAAgB,EAAE,CAAC"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import type { DataverseAdvancedClient } from "../dataverse/dataverse-client-advanced.js";
|
|
2
|
-
export declare const qualityTools: {
|
|
3
|
-
name: string;
|
|
4
|
-
description: string;
|
|
5
|
-
inputSchema: {
|
|
6
|
-
type: "object";
|
|
7
|
-
properties: {
|
|
8
|
-
entityLogicalName: {
|
|
9
|
-
type: string;
|
|
10
|
-
description: string;
|
|
11
|
-
};
|
|
12
|
-
record: {
|
|
13
|
-
type: string;
|
|
14
|
-
description: string;
|
|
15
|
-
};
|
|
16
|
-
top: {
|
|
17
|
-
type: string;
|
|
18
|
-
description: string;
|
|
19
|
-
};
|
|
20
|
-
};
|
|
21
|
-
required: string[];
|
|
22
|
-
};
|
|
23
|
-
annotations: {
|
|
24
|
-
readOnlyHint: boolean;
|
|
25
|
-
destructiveHint: boolean;
|
|
26
|
-
idempotentHint: boolean;
|
|
27
|
-
openWorldHint: boolean;
|
|
28
|
-
};
|
|
29
|
-
}[];
|
|
30
|
-
export declare function handleQualityTool(name: string, args: unknown, client: DataverseAdvancedClient): Promise<{
|
|
31
|
-
content: Array<{
|
|
32
|
-
type: "text";
|
|
33
|
-
text: string;
|
|
34
|
-
}>;
|
|
35
|
-
}>;
|
|
36
|
-
//# sourceMappingURL=quality.tools.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"quality.tools.d.ts","sourceRoot":"","sources":["../../src/tools/quality.tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AAGzF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BxB,CAAC;AAWF,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA6E7D"}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { formatData } from "./output.utils.js";
|
|
3
|
-
export const qualityTools = [
|
|
4
|
-
{
|
|
5
|
-
name: "dataverse_detect_duplicates",
|
|
6
|
-
description: "Checks for potential duplicate records before creating. Uses Dataverse built-in duplicate detection rules. Pass the prospective record fields to check against existing records. WHEN TO USE: Before creating a new record to check if a duplicate already exists. BEST PRACTICES: Duplicate detection rules must be configured in Dataverse admin; pass key identifying fields only. WORKFLOW: create_record.",
|
|
7
|
-
inputSchema: {
|
|
8
|
-
type: "object",
|
|
9
|
-
properties: {
|
|
10
|
-
entityLogicalName: {
|
|
11
|
-
type: "string",
|
|
12
|
-
description: 'Table to check, e.g., "account"',
|
|
13
|
-
},
|
|
14
|
-
record: {
|
|
15
|
-
type: "object",
|
|
16
|
-
description: "The prospective record fields to check for duplicates",
|
|
17
|
-
},
|
|
18
|
-
top: {
|
|
19
|
-
type: "number",
|
|
20
|
-
description: "Maximum number of duplicates to return (default 5, max 20)",
|
|
21
|
-
},
|
|
22
|
-
},
|
|
23
|
-
required: ["entityLogicalName", "record"],
|
|
24
|
-
},
|
|
25
|
-
annotations: {
|
|
26
|
-
readOnlyHint: true,
|
|
27
|
-
destructiveHint: false,
|
|
28
|
-
idempotentHint: true,
|
|
29
|
-
openWorldHint: true,
|
|
30
|
-
},
|
|
31
|
-
},
|
|
32
|
-
];
|
|
33
|
-
const DetectDuplicatesInput = z.object({
|
|
34
|
-
entityLogicalName: z
|
|
35
|
-
.string()
|
|
36
|
-
.min(1)
|
|
37
|
-
.regex(/^[a-z_][a-z0-9_]*$/i, "Must be a valid Dataverse logical name"),
|
|
38
|
-
record: z.record(z.string(), z.unknown()),
|
|
39
|
-
top: z.number().int().positive().max(20).optional().default(5),
|
|
40
|
-
});
|
|
41
|
-
export async function handleQualityTool(name, args, client) {
|
|
42
|
-
switch (name) {
|
|
43
|
-
case "dataverse_detect_duplicates": {
|
|
44
|
-
const params = DetectDuplicatesInput.parse(args);
|
|
45
|
-
function xmlEsc(v) {
|
|
46
|
-
return String(v)
|
|
47
|
-
.replace(/&/g, "&")
|
|
48
|
-
.replace(/</g, "<")
|
|
49
|
-
.replace(/>/g, ">")
|
|
50
|
-
.replace(/"/g, """)
|
|
51
|
-
.replace(/'/g, "'");
|
|
52
|
-
}
|
|
53
|
-
const conditions = Object.entries(params.record)
|
|
54
|
-
.filter(([, v]) => v !== null && v !== undefined)
|
|
55
|
-
.map(([key, value]) => `<condition attribute="${xmlEsc(key)}" operator="eq" value="${xmlEsc(String(value))}" />`)
|
|
56
|
-
.join("\n ");
|
|
57
|
-
if (!conditions) {
|
|
58
|
-
return formatData("No fields provided for duplicate detection", { hasDuplicates: false, duplicateCount: 0, duplicates: [] }, ["Provide at least one field value to check for duplicates"]);
|
|
59
|
-
}
|
|
60
|
-
const entitySetName = params.entityLogicalName + "s";
|
|
61
|
-
const fetchXml = `<fetch top="${params.top}" distinct="true">
|
|
62
|
-
<entity name="${xmlEsc(params.entityLogicalName)}">
|
|
63
|
-
<all-attributes />
|
|
64
|
-
<filter type="or">
|
|
65
|
-
${conditions}
|
|
66
|
-
</filter>
|
|
67
|
-
</entity>
|
|
68
|
-
</fetch>`;
|
|
69
|
-
const rawResult = await client.executeFetchXml(entitySetName, fetchXml);
|
|
70
|
-
const duplicates = (Array.isArray(rawResult)
|
|
71
|
-
? rawResult
|
|
72
|
-
: Array.isArray(rawResult?.value)
|
|
73
|
-
? rawResult.value
|
|
74
|
-
: []);
|
|
75
|
-
const cleaned = duplicates.map((d) => {
|
|
76
|
-
const clean = {};
|
|
77
|
-
for (const [key, val] of Object.entries(d)) {
|
|
78
|
-
if (!key.startsWith("@"))
|
|
79
|
-
clean[key] = val;
|
|
80
|
-
}
|
|
81
|
-
return clean;
|
|
82
|
-
});
|
|
83
|
-
return formatData(`Duplicate detection: ${cleaned.length > 0 ? `${cleaned.length} potential duplicate(s) found` : "no duplicates found"}`, {
|
|
84
|
-
hasDuplicates: cleaned.length > 0,
|
|
85
|
-
duplicateCount: cleaned.length,
|
|
86
|
-
duplicates: cleaned,
|
|
87
|
-
note: "Field exact-match candidates (OR across provided fields). Dataverse duplicate detection rules are not applied via REST API.",
|
|
88
|
-
}, [
|
|
89
|
-
"Review candidate records before creating",
|
|
90
|
-
"For rule-based duplicate detection, configure rules in Dataverse admin",
|
|
91
|
-
]);
|
|
92
|
-
}
|
|
93
|
-
default:
|
|
94
|
-
throw new Error(`Unknown quality tool: ${name}`);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
//# sourceMappingURL=quality.tools.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"quality.tools.js","sourceRoot":"","sources":["../../src/tools/quality.tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
import type { DataverseAdvancedClient } from "../dataverse/dataverse-client-advanced.js";
|
|
2
|
-
import type { ProgressReporter } from "./progress.js";
|
|
3
|
-
export declare const queryTools: ({
|
|
4
|
-
name: string;
|
|
5
|
-
description: string;
|
|
6
|
-
inputSchema: {
|
|
7
|
-
type: "object";
|
|
8
|
-
properties: {
|
|
9
|
-
entitySetName: {
|
|
10
|
-
type: string;
|
|
11
|
-
description: string;
|
|
12
|
-
};
|
|
13
|
-
select: {
|
|
14
|
-
type: string;
|
|
15
|
-
items: {
|
|
16
|
-
type: string;
|
|
17
|
-
};
|
|
18
|
-
description: string;
|
|
19
|
-
};
|
|
20
|
-
filter: {
|
|
21
|
-
type: string;
|
|
22
|
-
description: string;
|
|
23
|
-
};
|
|
24
|
-
orderby: {
|
|
25
|
-
type: string;
|
|
26
|
-
description: string;
|
|
27
|
-
};
|
|
28
|
-
top: {
|
|
29
|
-
type: string;
|
|
30
|
-
description: string;
|
|
31
|
-
};
|
|
32
|
-
expand: {
|
|
33
|
-
type: string;
|
|
34
|
-
description: string;
|
|
35
|
-
};
|
|
36
|
-
count: {
|
|
37
|
-
type: string;
|
|
38
|
-
description: string;
|
|
39
|
-
};
|
|
40
|
-
apply: {
|
|
41
|
-
type: string;
|
|
42
|
-
description: string;
|
|
43
|
-
};
|
|
44
|
-
formattedValues: {
|
|
45
|
-
type: string;
|
|
46
|
-
description: string;
|
|
47
|
-
};
|
|
48
|
-
fetchXml?: never;
|
|
49
|
-
maxTotal?: never;
|
|
50
|
-
};
|
|
51
|
-
required: string[];
|
|
52
|
-
};
|
|
53
|
-
annotations: {
|
|
54
|
-
readOnlyHint: boolean;
|
|
55
|
-
destructiveHint: boolean;
|
|
56
|
-
idempotentHint: boolean;
|
|
57
|
-
openWorldHint: boolean;
|
|
58
|
-
};
|
|
59
|
-
} | {
|
|
60
|
-
name: string;
|
|
61
|
-
description: string;
|
|
62
|
-
inputSchema: {
|
|
63
|
-
type: "object";
|
|
64
|
-
properties: {
|
|
65
|
-
entitySetName: {
|
|
66
|
-
type: string;
|
|
67
|
-
description: string;
|
|
68
|
-
};
|
|
69
|
-
fetchXml: {
|
|
70
|
-
type: string;
|
|
71
|
-
description: string;
|
|
72
|
-
};
|
|
73
|
-
formattedValues: {
|
|
74
|
-
type: string;
|
|
75
|
-
description: string;
|
|
76
|
-
};
|
|
77
|
-
select?: never;
|
|
78
|
-
filter?: never;
|
|
79
|
-
orderby?: never;
|
|
80
|
-
top?: never;
|
|
81
|
-
expand?: never;
|
|
82
|
-
count?: never;
|
|
83
|
-
apply?: never;
|
|
84
|
-
maxTotal?: never;
|
|
85
|
-
};
|
|
86
|
-
required: string[];
|
|
87
|
-
};
|
|
88
|
-
annotations: {
|
|
89
|
-
readOnlyHint: boolean;
|
|
90
|
-
destructiveHint: boolean;
|
|
91
|
-
idempotentHint: boolean;
|
|
92
|
-
openWorldHint: boolean;
|
|
93
|
-
};
|
|
94
|
-
} | {
|
|
95
|
-
name: string;
|
|
96
|
-
description: string;
|
|
97
|
-
inputSchema: {
|
|
98
|
-
type: "object";
|
|
99
|
-
properties: {
|
|
100
|
-
entitySetName: {
|
|
101
|
-
type: string;
|
|
102
|
-
description: string;
|
|
103
|
-
};
|
|
104
|
-
select: {
|
|
105
|
-
type: string;
|
|
106
|
-
items: {
|
|
107
|
-
type: string;
|
|
108
|
-
};
|
|
109
|
-
description?: never;
|
|
110
|
-
};
|
|
111
|
-
filter: {
|
|
112
|
-
type: string;
|
|
113
|
-
description?: never;
|
|
114
|
-
};
|
|
115
|
-
orderby: {
|
|
116
|
-
type: string;
|
|
117
|
-
description?: never;
|
|
118
|
-
};
|
|
119
|
-
expand: {
|
|
120
|
-
type: string;
|
|
121
|
-
description?: never;
|
|
122
|
-
};
|
|
123
|
-
maxTotal: {
|
|
124
|
-
type: string;
|
|
125
|
-
description: string;
|
|
126
|
-
};
|
|
127
|
-
formattedValues: {
|
|
128
|
-
type: string;
|
|
129
|
-
description: string;
|
|
130
|
-
};
|
|
131
|
-
top?: never;
|
|
132
|
-
count?: never;
|
|
133
|
-
apply?: never;
|
|
134
|
-
fetchXml?: never;
|
|
135
|
-
};
|
|
136
|
-
required: string[];
|
|
137
|
-
};
|
|
138
|
-
annotations: {
|
|
139
|
-
readOnlyHint: boolean;
|
|
140
|
-
destructiveHint: boolean;
|
|
141
|
-
idempotentHint: boolean;
|
|
142
|
-
openWorldHint: boolean;
|
|
143
|
-
};
|
|
144
|
-
})[];
|
|
145
|
-
export declare function handleQueryTool(name: string, args: unknown, client: DataverseAdvancedClient, progress?: ProgressReporter): Promise<{
|
|
146
|
-
content: Array<{
|
|
147
|
-
type: "text";
|
|
148
|
-
text: string;
|
|
149
|
-
}>;
|
|
150
|
-
}>;
|
|
151
|
-
//# sourceMappingURL=query.tools.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"query.tools.d.ts","sourceRoot":"","sources":["../../src/tools/query.tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAyBtD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA6HtB,CAAC;AAmCF,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,uBAAuB,EAC/B,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA8I7D"}
|