mcp-dataverse 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/.env.example +15 -0
  2. package/CAPABILITIES.md +992 -0
  3. package/LICENSE +21 -0
  4. package/README.md +277 -0
  5. package/config.example.json +11 -0
  6. package/dist/auth/auth-provider.factory.d.ts +4 -0
  7. package/dist/auth/auth-provider.factory.d.ts.map +1 -0
  8. package/dist/auth/auth-provider.factory.js +15 -0
  9. package/dist/auth/auth-provider.factory.js.map +1 -0
  10. package/dist/auth/auth-provider.interface.d.ts +21 -0
  11. package/dist/auth/auth-provider.interface.d.ts.map +1 -0
  12. package/dist/auth/auth-provider.interface.js +2 -0
  13. package/dist/auth/auth-provider.interface.js.map +1 -0
  14. package/dist/auth/msal-auth-provider.d.ts +14 -0
  15. package/dist/auth/msal-auth-provider.d.ts.map +1 -0
  16. package/dist/auth/msal-auth-provider.js +62 -0
  17. package/dist/auth/msal-auth-provider.js.map +1 -0
  18. package/dist/auth/pac-auth-provider.d.ts +19 -0
  19. package/dist/auth/pac-auth-provider.d.ts.map +1 -0
  20. package/dist/auth/pac-auth-provider.js +153 -0
  21. package/dist/auth/pac-auth-provider.js.map +1 -0
  22. package/dist/config/config.loader.d.ts +3 -0
  23. package/dist/config/config.loader.d.ts.map +1 -0
  24. package/dist/config/config.loader.js +52 -0
  25. package/dist/config/config.loader.js.map +1 -0
  26. package/dist/config/config.schema.d.ts +34 -0
  27. package/dist/config/config.schema.d.ts.map +1 -0
  28. package/dist/config/config.schema.js +25 -0
  29. package/dist/config/config.schema.js.map +1 -0
  30. package/dist/dataverse/dataverse-client-advanced.d.ts +47 -0
  31. package/dist/dataverse/dataverse-client-advanced.d.ts.map +1 -0
  32. package/dist/dataverse/dataverse-client-advanced.js +147 -0
  33. package/dist/dataverse/dataverse-client-advanced.js.map +1 -0
  34. package/dist/dataverse/dataverse-client.d.ts +49 -0
  35. package/dist/dataverse/dataverse-client.d.ts.map +1 -0
  36. package/dist/dataverse/dataverse-client.js +313 -0
  37. package/dist/dataverse/dataverse-client.js.map +1 -0
  38. package/dist/dataverse/dataverse-client.metadata.d.ts +40 -0
  39. package/dist/dataverse/dataverse-client.metadata.d.ts.map +1 -0
  40. package/dist/dataverse/dataverse-client.metadata.js +121 -0
  41. package/dist/dataverse/dataverse-client.metadata.js.map +1 -0
  42. package/dist/dataverse/dataverse-client.utils.d.ts +14 -0
  43. package/dist/dataverse/dataverse-client.utils.d.ts.map +1 -0
  44. package/dist/dataverse/dataverse-client.utils.js +65 -0
  45. package/dist/dataverse/dataverse-client.utils.js.map +1 -0
  46. package/dist/dataverse/http-client.d.ts +36 -0
  47. package/dist/dataverse/http-client.d.ts.map +1 -0
  48. package/dist/dataverse/http-client.js +103 -0
  49. package/dist/dataverse/http-client.js.map +1 -0
  50. package/dist/dataverse/types.d.ts +68 -0
  51. package/dist/dataverse/types.d.ts.map +1 -0
  52. package/dist/dataverse/types.js +2 -0
  53. package/dist/dataverse/types.js.map +1 -0
  54. package/dist/server.d.ts +3 -0
  55. package/dist/server.d.ts.map +1 -0
  56. package/dist/server.js +165 -0
  57. package/dist/server.js.map +1 -0
  58. package/dist/setup-auth.d.ts +2 -0
  59. package/dist/setup-auth.d.ts.map +1 -0
  60. package/dist/setup-auth.js +29 -0
  61. package/dist/setup-auth.js.map +1 -0
  62. package/dist/tools/actions.tools.d.ts +170 -0
  63. package/dist/tools/actions.tools.d.ts.map +1 -0
  64. package/dist/tools/actions.tools.js +179 -0
  65. package/dist/tools/actions.tools.js.map +1 -0
  66. package/dist/tools/annotations.tools.d.ts +82 -0
  67. package/dist/tools/annotations.tools.d.ts.map +1 -0
  68. package/dist/tools/annotations.tools.js +180 -0
  69. package/dist/tools/annotations.tools.js.map +1 -0
  70. package/dist/tools/audit.tools.d.ts +45 -0
  71. package/dist/tools/audit.tools.d.ts.map +1 -0
  72. package/dist/tools/audit.tools.js +163 -0
  73. package/dist/tools/audit.tools.js.map +1 -0
  74. package/dist/tools/auth.tools.d.ts +17 -0
  75. package/dist/tools/auth.tools.d.ts.map +1 -0
  76. package/dist/tools/auth.tools.js +30 -0
  77. package/dist/tools/auth.tools.js.map +1 -0
  78. package/dist/tools/batch.tools.d.ts +45 -0
  79. package/dist/tools/batch.tools.d.ts.map +1 -0
  80. package/dist/tools/batch.tools.js +71 -0
  81. package/dist/tools/batch.tools.js.map +1 -0
  82. package/dist/tools/crud.tools.d.ts +206 -0
  83. package/dist/tools/crud.tools.d.ts.map +1 -0
  84. package/dist/tools/crud.tools.js +213 -0
  85. package/dist/tools/crud.tools.js.map +1 -0
  86. package/dist/tools/customization.tools.d.ts +75 -0
  87. package/dist/tools/customization.tools.d.ts.map +1 -0
  88. package/dist/tools/customization.tools.js +187 -0
  89. package/dist/tools/customization.tools.js.map +1 -0
  90. package/dist/tools/environment.tools.d.ts +40 -0
  91. package/dist/tools/environment.tools.d.ts.map +1 -0
  92. package/dist/tools/environment.tools.js +145 -0
  93. package/dist/tools/environment.tools.js.map +1 -0
  94. package/dist/tools/file.tools.d.ts +61 -0
  95. package/dist/tools/file.tools.d.ts.map +1 -0
  96. package/dist/tools/file.tools.js +142 -0
  97. package/dist/tools/file.tools.js.map +1 -0
  98. package/dist/tools/impersonate.tools.d.ts +37 -0
  99. package/dist/tools/impersonate.tools.d.ts.map +1 -0
  100. package/dist/tools/impersonate.tools.js +85 -0
  101. package/dist/tools/impersonate.tools.js.map +1 -0
  102. package/dist/tools/metadata.tools.d.ts +156 -0
  103. package/dist/tools/metadata.tools.d.ts.map +1 -0
  104. package/dist/tools/metadata.tools.js +200 -0
  105. package/dist/tools/metadata.tools.js.map +1 -0
  106. package/dist/tools/org.tools.d.ts +26 -0
  107. package/dist/tools/org.tools.d.ts.map +1 -0
  108. package/dist/tools/org.tools.js +57 -0
  109. package/dist/tools/org.tools.js.map +1 -0
  110. package/dist/tools/quality.tools.d.ts +30 -0
  111. package/dist/tools/quality.tools.d.ts.map +1 -0
  112. package/dist/tools/quality.tools.js +69 -0
  113. package/dist/tools/quality.tools.js.map +1 -0
  114. package/dist/tools/query.tools.d.ts +120 -0
  115. package/dist/tools/query.tools.d.ts.map +1 -0
  116. package/dist/tools/query.tools.js +182 -0
  117. package/dist/tools/query.tools.js.map +1 -0
  118. package/dist/tools/relations.tools.d.ts +65 -0
  119. package/dist/tools/relations.tools.d.ts.map +1 -0
  120. package/dist/tools/relations.tools.js +64 -0
  121. package/dist/tools/relations.tools.js.map +1 -0
  122. package/dist/tools/search.tools.d.ts +68 -0
  123. package/dist/tools/search.tools.d.ts.map +1 -0
  124. package/dist/tools/search.tools.js +134 -0
  125. package/dist/tools/search.tools.js.map +1 -0
  126. package/dist/tools/solution.tools.d.ts +95 -0
  127. package/dist/tools/solution.tools.d.ts.map +1 -0
  128. package/dist/tools/solution.tools.js +130 -0
  129. package/dist/tools/solution.tools.js.map +1 -0
  130. package/dist/tools/teams.tools.d.ts +27 -0
  131. package/dist/tools/teams.tools.d.ts.map +1 -0
  132. package/dist/tools/teams.tools.js +67 -0
  133. package/dist/tools/teams.tools.js.map +1 -0
  134. package/dist/tools/trace.tools.d.ts +63 -0
  135. package/dist/tools/trace.tools.d.ts.map +1 -0
  136. package/dist/tools/trace.tools.js +218 -0
  137. package/dist/tools/trace.tools.js.map +1 -0
  138. package/dist/tools/tracking.tools.d.ts +35 -0
  139. package/dist/tools/tracking.tools.d.ts.map +1 -0
  140. package/dist/tools/tracking.tools.js +40 -0
  141. package/dist/tools/tracking.tools.js.map +1 -0
  142. package/dist/tools/users.tools.d.ts +57 -0
  143. package/dist/tools/users.tools.d.ts.map +1 -0
  144. package/dist/tools/users.tools.js +146 -0
  145. package/dist/tools/users.tools.js.map +1 -0
  146. package/dist/tools/views.tools.d.ts +30 -0
  147. package/dist/tools/views.tools.d.ts.map +1 -0
  148. package/dist/tools/views.tools.js +84 -0
  149. package/dist/tools/views.tools.js.map +1 -0
  150. package/package.json +81 -0
  151. package/server.json +30 -0
@@ -0,0 +1,163 @@
1
+ import { z } from 'zod';
2
+ const AUDIT_ACTION_NAMES = {
3
+ 1: 'Create',
4
+ 2: 'Update',
5
+ 3: 'Delete',
6
+ 4: 'Activate',
7
+ 5: 'Deactivate',
8
+ 11: 'Share',
9
+ 12: 'Unshare',
10
+ 13: 'Assign',
11
+ 104: 'Access',
12
+ };
13
+ const AUDIT_ACTION_CODES = Object.fromEntries(Object.entries(AUDIT_ACTION_NAMES).map(([code, name]) => [name, Number(code)]));
14
+ export const auditTools = [
15
+ {
16
+ name: 'dataverse_get_audit_log',
17
+ description: 'Retrieves audit log entries from Dataverse. Returns operation details, user info, and parsed change data for each entry. ' +
18
+ 'At least one filter (recordId, entityLogicalName, userId, fromDate, or operations) is recommended to avoid large result sets. ' +
19
+ 'Audit must be enabled on the environment and table — returns a clear error if auditing is disabled (HTTP 403).',
20
+ inputSchema: {
21
+ type: 'object',
22
+ properties: {
23
+ recordId: {
24
+ type: 'string',
25
+ description: 'GUID of a specific record to retrieve audit entries for',
26
+ },
27
+ entityLogicalName: {
28
+ type: 'string',
29
+ description: 'Logical name of the entity to filter audit entries (e.g., "account", "contact")',
30
+ },
31
+ userId: {
32
+ type: 'string',
33
+ description: 'GUID of the user who made the changes',
34
+ },
35
+ fromDate: {
36
+ type: 'string',
37
+ description: 'ISO 8601 date string — only return audit entries created on or after this date',
38
+ },
39
+ top: {
40
+ type: 'number',
41
+ description: 'Maximum number of audit entries to return (default: 50, max: 500)',
42
+ },
43
+ operations: {
44
+ type: 'array',
45
+ items: { type: 'string' },
46
+ description: 'Filter by operation names: "Create", "Update", "Delete", "Activate", "Deactivate", "Share", "Unshare", "Assign", "Access"',
47
+ },
48
+ },
49
+ required: [],
50
+ },
51
+ },
52
+ ];
53
+ const AuditInput = z.object({
54
+ recordId: z.string().uuid().optional(),
55
+ entityLogicalName: z.string().min(1).optional(),
56
+ userId: z.string().uuid().optional(),
57
+ fromDate: z.string().datetime({ offset: true }).optional(),
58
+ top: z.number().positive().max(500).optional().default(50),
59
+ operations: z.array(z.string().min(1)).optional(),
60
+ });
61
+ function parseChangeData(raw) {
62
+ if (!raw)
63
+ return {};
64
+ try {
65
+ return JSON.parse(raw);
66
+ }
67
+ catch {
68
+ return raw;
69
+ }
70
+ }
71
+ function mapAuditRecord(record) {
72
+ return {
73
+ auditId: record.auditid,
74
+ operation: record.operation,
75
+ operationName: AUDIT_ACTION_NAMES[record.operation] ?? `Unknown(${record.operation})`,
76
+ action: record.action,
77
+ actionName: AUDIT_ACTION_NAMES[record.action] ?? `Unknown(${record.action})`,
78
+ createdOn: record.createdon,
79
+ userId: record._userid_value,
80
+ userFullName: record.userid?.fullname ?? '',
81
+ userDomainName: record.userid?.domainname ?? '',
82
+ objectId: record._objectid_value,
83
+ objectTypeCode: record.objecttypecode,
84
+ changes: parseChangeData(record.changedata),
85
+ };
86
+ }
87
+ export async function handleAuditTool(name, args, client) {
88
+ switch (name) {
89
+ case 'dataverse_get_audit_log': {
90
+ const params = AuditInput.parse(args);
91
+ const filters = [];
92
+ if (params.recordId) {
93
+ filters.push(`_objectid_value eq ${params.recordId}`);
94
+ }
95
+ if (params.entityLogicalName) {
96
+ const escaped = params.entityLogicalName.replace(/'/g, "''");
97
+ filters.push(`objecttypecode eq '${escaped}'`);
98
+ }
99
+ if (params.userId) {
100
+ filters.push(`_userid_value eq ${params.userId}`);
101
+ }
102
+ if (params.fromDate) {
103
+ filters.push(`createdon ge ${params.fromDate}`);
104
+ }
105
+ if (params.operations?.length) {
106
+ const codes = params.operations
107
+ .map((op) => AUDIT_ACTION_CODES[op])
108
+ .filter((code) => code !== undefined);
109
+ if (codes.length > 0) {
110
+ const orClauses = codes.map((c) => `action eq ${c}`).join(' or ');
111
+ filters.push(`(${orClauses})`);
112
+ }
113
+ }
114
+ try {
115
+ const result = await client.query('audits', {
116
+ select: [
117
+ 'auditid',
118
+ 'action',
119
+ 'operation',
120
+ 'createdon',
121
+ '_objectid_value',
122
+ 'objecttypecode',
123
+ 'changedata',
124
+ '_userid_value',
125
+ ],
126
+ ...(filters.length > 0 ? { filter: filters.join(' and ') } : {}),
127
+ orderby: 'createdon desc',
128
+ top: params.top,
129
+ expand: 'userid($select=fullname,domainname)',
130
+ });
131
+ const entries = result.value.map(mapAuditRecord);
132
+ return {
133
+ content: [
134
+ {
135
+ type: 'text',
136
+ text: JSON.stringify({ entries, count: entries.length }, null, 2),
137
+ },
138
+ ],
139
+ };
140
+ }
141
+ catch (error) {
142
+ const message = error instanceof Error ? error.message : String(error);
143
+ if (message.includes('403') || message.includes('Forbidden')) {
144
+ return {
145
+ content: [
146
+ {
147
+ type: 'text',
148
+ text: JSON.stringify({
149
+ isError: true,
150
+ error: 'Audit log access denied (HTTP 403). Ensure auditing is enabled on the Dataverse environment and the target table, and that the authenticated user has sufficient privileges.',
151
+ }),
152
+ },
153
+ ],
154
+ };
155
+ }
156
+ throw error;
157
+ }
158
+ }
159
+ default:
160
+ throw new Error(`Unknown audit tool: ${name}`);
161
+ }
162
+ }
163
+ //# sourceMappingURL=audit.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.tools.js","sourceRoot":"","sources":["../../src/tools/audit.tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { DataverseClient } from '../dataverse/dataverse-client.js';
2
+ export declare const authTools: {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: {
6
+ type: "object";
7
+ properties: {};
8
+ required: never[];
9
+ };
10
+ }[];
11
+ export declare function handleAuthTool(name: string, _args: unknown, client: DataverseClient): Promise<{
12
+ content: Array<{
13
+ type: 'text';
14
+ text: string;
15
+ }>;
16
+ }>;
17
+ //# sourceMappingURL=auth.tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.tools.d.ts","sourceRoot":"","sources":["../../src/tools/auth.tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE,eAAO,MAAM,SAAS;;;;;;;;GAUrB,CAAC;AAEF,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAiB7D"}
@@ -0,0 +1,30 @@
1
+ export const authTools = [
2
+ {
3
+ name: 'dataverse_whoami',
4
+ description: 'Returns the current authenticated user context from Dataverse WhoAmI: userId, businessUnitId, organizationId, organizationName, and environmentUrl. Use this to verify authentication is working, retrieve the current user context, or obtain IDs needed for subsequent operations.',
5
+ inputSchema: {
6
+ type: 'object',
7
+ properties: {},
8
+ required: [],
9
+ },
10
+ },
11
+ ];
12
+ export async function handleAuthTool(name, _args, client) {
13
+ if (name === 'dataverse_whoami') {
14
+ const result = await client.whoAmI();
15
+ return {
16
+ content: [{
17
+ type: 'text',
18
+ text: JSON.stringify({
19
+ userId: result.UserId,
20
+ businessUnitId: result.BusinessUnitId,
21
+ organizationId: result.OrganizationId,
22
+ organizationName: result.OrganizationName,
23
+ environmentUrl: result.EnvironmentUrl,
24
+ }, null, 2),
25
+ }],
26
+ };
27
+ }
28
+ throw new Error(`Unknown auth tool: ${name}`);
29
+ }
30
+ //# sourceMappingURL=auth.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.tools.js","sourceRoot":"","sources":["../../src/tools/auth.tools.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,sRAAsR;QACnS,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,EAAE;SACb;KACF;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAY,EACZ,KAAc,EACd,MAAuB;IAEvB,IAAI,IAAI,KAAK,kBAAkB,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACrC,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,cAAc,EAAE,MAAM,CAAC,cAAc;wBACrC,cAAc,EAAE,MAAM,CAAC,cAAc;wBACrC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;wBACzC,cAAc,EAAE,MAAM,CAAC,cAAc;qBACtC,EAAE,IAAI,EAAE,CAAC,CAAC;iBACZ,CAAC;SACH,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { DataverseClient } from '../dataverse/dataverse-client.js';
2
+ export declare const batchTools: {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: {
6
+ type: "object";
7
+ properties: {
8
+ requests: {
9
+ type: string;
10
+ description: string;
11
+ items: {
12
+ type: string;
13
+ properties: {
14
+ method: {
15
+ type: string;
16
+ enum: string[];
17
+ description: string;
18
+ };
19
+ url: {
20
+ type: string;
21
+ description: string;
22
+ };
23
+ body: {
24
+ type: string;
25
+ description: string;
26
+ };
27
+ };
28
+ required: string[];
29
+ };
30
+ };
31
+ useChangeset: {
32
+ type: string;
33
+ description: string;
34
+ };
35
+ };
36
+ required: string[];
37
+ };
38
+ }[];
39
+ export declare function handleBatchTool(name: string, args: unknown, client: DataverseClient): Promise<{
40
+ content: Array<{
41
+ type: 'text';
42
+ text: string;
43
+ }>;
44
+ }>;
45
+ //# sourceMappingURL=batch.tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.tools.d.ts","sourceRoot":"","sources":["../../src/tools/batch.tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGxE,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCtB,CAAC;AA8BF,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAc7D"}
@@ -0,0 +1,71 @@
1
+ import { z } from 'zod';
2
+ export const batchTools = [
3
+ {
4
+ name: 'dataverse_batch_execute',
5
+ description: 'Executes multiple Dataverse operations in a single HTTP $batch request to reduce network round-trips and improve throughput. Accepts up to 1000 individual GET, POST, PATCH, or DELETE requests. Use for bulk creates, updates, or deletes that need to be grouped for performance. Set useChangeset=true to wrap all mutating operations (POST/PATCH/DELETE) in an atomic changeset — a failure rolls back ALL changeset operations. Individual per-operation results (status, body) are returned as an array in the same order as the input requests.',
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {
9
+ requests: {
10
+ type: 'array',
11
+ description: 'Array of batch requests to execute',
12
+ items: {
13
+ type: 'object',
14
+ properties: {
15
+ method: {
16
+ type: 'string',
17
+ enum: ['GET', 'POST', 'PATCH', 'DELETE'],
18
+ description: 'HTTP method',
19
+ },
20
+ url: {
21
+ type: 'string',
22
+ description: 'Relative URL (e.g., "accounts(guid)" or "contacts")',
23
+ },
24
+ body: {
25
+ type: 'object',
26
+ description: 'Request body for POST/PATCH operations',
27
+ },
28
+ },
29
+ required: ['method', 'url'],
30
+ },
31
+ },
32
+ useChangeset: {
33
+ type: 'boolean',
34
+ description: 'Wrap mutating operations (POST/PATCH/DELETE) in an atomic changeset. A failure rolls back ALL operations in the changeset. Defaults to false.',
35
+ },
36
+ },
37
+ required: ['requests'],
38
+ },
39
+ },
40
+ ];
41
+ const BatchRequestItemSchema = z.object({
42
+ method: z.enum(['GET', 'POST', 'PATCH', 'DELETE']),
43
+ url: z.string().min(1)
44
+ .refine(v => !/[\r\n]/.test(v), { message: 'Batch URL must not contain CR or LF characters' })
45
+ .refine(v => !v.startsWith('http'), { message: 'Batch URL must be a relative path, not an absolute URL' })
46
+ .refine(v => !/(\.\.[\/\\])|(^\.\.$)/.test(v), { message: 'Batch URL must not contain path traversal sequences' }),
47
+ body: z.record(z.unknown()).optional(),
48
+ });
49
+ const BatchExecuteInput = z.object({
50
+ requests: z.array(BatchRequestItemSchema).min(1).max(1000),
51
+ useChangeset: z
52
+ .boolean()
53
+ .default(false)
54
+ .describe('Wrap mutating operations (POST/PATCH/DELETE) in an atomic changeset. A failure rolls back ALL operations in the changeset.'),
55
+ });
56
+ export async function handleBatchTool(name, args, client) {
57
+ if (name === 'dataverse_batch_execute') {
58
+ const { requests, useChangeset } = BatchExecuteInput.parse(args);
59
+ const batchRequests = requests.map(r => ({
60
+ method: r.method,
61
+ url: r.url,
62
+ body: r.body,
63
+ }));
64
+ const results = await client.batchExecute(batchRequests, useChangeset);
65
+ return {
66
+ content: [{ type: 'text', text: JSON.stringify({ results, count: results.length }, null, 2) }],
67
+ };
68
+ }
69
+ throw new Error(`Unknown batch tool: ${name}`);
70
+ }
71
+ //# sourceMappingURL=batch.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.tools.js","sourceRoot":"","sources":["../../src/tools/batch.tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,206 @@
1
+ import type { DataverseClient } from '../dataverse/dataverse-client.js';
2
+ export declare const crudTools: ({
3
+ name: string;
4
+ description: string;
5
+ inputSchema: {
6
+ type: "object";
7
+ properties: {
8
+ entitySetName: {
9
+ type: string;
10
+ description: string;
11
+ };
12
+ id: {
13
+ type: string;
14
+ description: string;
15
+ };
16
+ select: {
17
+ type: string;
18
+ items: {
19
+ type: string;
20
+ };
21
+ description: string;
22
+ };
23
+ data?: never;
24
+ etag?: never;
25
+ confirm?: never;
26
+ alternateKey?: never;
27
+ alternateKeyValue?: never;
28
+ alternateKeys?: never;
29
+ mode?: never;
30
+ ownerType?: never;
31
+ ownerId?: never;
32
+ };
33
+ required: string[];
34
+ };
35
+ } | {
36
+ name: string;
37
+ description: string;
38
+ inputSchema: {
39
+ type: "object";
40
+ properties: {
41
+ entitySetName: {
42
+ type: string;
43
+ description: string;
44
+ };
45
+ data: {
46
+ type: string;
47
+ description: string;
48
+ };
49
+ id?: never;
50
+ select?: never;
51
+ etag?: never;
52
+ confirm?: never;
53
+ alternateKey?: never;
54
+ alternateKeyValue?: never;
55
+ alternateKeys?: never;
56
+ mode?: never;
57
+ ownerType?: never;
58
+ ownerId?: never;
59
+ };
60
+ required: string[];
61
+ };
62
+ } | {
63
+ name: string;
64
+ description: string;
65
+ inputSchema: {
66
+ type: "object";
67
+ properties: {
68
+ entitySetName: {
69
+ type: string;
70
+ description?: never;
71
+ };
72
+ id: {
73
+ type: string;
74
+ description: string;
75
+ };
76
+ data: {
77
+ type: string;
78
+ description: string;
79
+ };
80
+ etag: {
81
+ type: string;
82
+ description: string;
83
+ };
84
+ select?: never;
85
+ confirm?: never;
86
+ alternateKey?: never;
87
+ alternateKeyValue?: never;
88
+ alternateKeys?: never;
89
+ mode?: never;
90
+ ownerType?: never;
91
+ ownerId?: never;
92
+ };
93
+ required: string[];
94
+ };
95
+ } | {
96
+ name: string;
97
+ description: string;
98
+ inputSchema: {
99
+ type: "object";
100
+ properties: {
101
+ entitySetName: {
102
+ type: string;
103
+ description?: never;
104
+ };
105
+ id: {
106
+ type: string;
107
+ description: string;
108
+ };
109
+ confirm: {
110
+ type: string;
111
+ description: string;
112
+ };
113
+ select?: never;
114
+ data?: never;
115
+ etag?: never;
116
+ alternateKey?: never;
117
+ alternateKeyValue?: never;
118
+ alternateKeys?: never;
119
+ mode?: never;
120
+ ownerType?: never;
121
+ ownerId?: never;
122
+ };
123
+ required: string[];
124
+ };
125
+ } | {
126
+ name: string;
127
+ description: string;
128
+ inputSchema: {
129
+ type: "object";
130
+ properties: {
131
+ entitySetName: {
132
+ type: string;
133
+ description?: never;
134
+ };
135
+ alternateKey: {
136
+ type: string;
137
+ description: string;
138
+ };
139
+ alternateKeyValue: {
140
+ type: string;
141
+ description: string;
142
+ };
143
+ alternateKeys: {
144
+ type: string;
145
+ description: string;
146
+ };
147
+ data: {
148
+ type: string;
149
+ description: string;
150
+ };
151
+ mode: {
152
+ type: string;
153
+ enum: string[];
154
+ description: string;
155
+ };
156
+ id?: never;
157
+ select?: never;
158
+ etag?: never;
159
+ confirm?: never;
160
+ ownerType?: never;
161
+ ownerId?: never;
162
+ };
163
+ required: string[];
164
+ };
165
+ } | {
166
+ name: string;
167
+ description: string;
168
+ inputSchema: {
169
+ type: "object";
170
+ properties: {
171
+ entitySetName: {
172
+ type: string;
173
+ description: string;
174
+ };
175
+ id: {
176
+ type: string;
177
+ description: string;
178
+ };
179
+ ownerType: {
180
+ type: string;
181
+ enum: string[];
182
+ description: string;
183
+ };
184
+ ownerId: {
185
+ type: string;
186
+ description: string;
187
+ };
188
+ select?: never;
189
+ data?: never;
190
+ etag?: never;
191
+ confirm?: never;
192
+ alternateKey?: never;
193
+ alternateKeyValue?: never;
194
+ alternateKeys?: never;
195
+ mode?: never;
196
+ };
197
+ required: string[];
198
+ };
199
+ })[];
200
+ export declare function handleCrudTool(name: string, args: unknown, client: DataverseClient): Promise<{
201
+ content: Array<{
202
+ type: 'text';
203
+ text: string;
204
+ }>;
205
+ }>;
206
+ //# sourceMappingURL=crud.tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crud.tools.d.ts","sourceRoot":"","sources":["../../src/tools/crud.tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGxE,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAwGrB,CAAC;AA8CF,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAqE7D"}