mcp-dataverse 0.3.9 → 0.4.7

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 CHANGED
@@ -1,8 +1,8 @@
1
1
  # MCP Dataverse Server — Complete Capabilities Reference
2
2
 
3
- > **Version**: 0.3.6 | **API Version**: Dataverse Web API v9.2 | **Transport**: stdio · HTTP/SSE
3
+ > **Version**: 0.4.6 | **API Version**: Dataverse Web API v9.2 | **Transport**: stdio · HTTP/SSE
4
4
 
5
- 63 tools across 24 categories for full Dataverse lifecycle: schema, CRUD, FetchXML, solutions, plugins, audit, files, users, teams, RBAC, environment variables, workflows, and more.
5
+ 73 tools across 25 categories for full Dataverse lifecycle: schema, CRUD, FetchXML, solutions, plugins, audit, files, users, teams, RBAC, attribute management, environment variables, workflows, and more.
6
6
 
7
7
  ---
8
8
 
@@ -10,19 +10,19 @@
10
10
 
11
11
  - [Quick Start](#quick-start)
12
12
  - [Architecture Overview](#architecture-overview)
13
- - [Tool Reference (63 tools)](#tool-reference-63-tools)
13
+ - [Tool Reference (73 tools)](#tool-reference-73-tools)
14
14
  - [1. Auth (1)](#1-auth-1-tool)
15
- - [2. Metadata (8)](#2-metadata-8-tools)
15
+ - [2. Metadata (9)](#2-metadata-9-tools)
16
16
  - [3. Query (3)](#3-query-3-tools)
17
- - [4. CRUD (5)](#4-crud-5-tools)
18
- - [5. Relations (2)](#5-relations-2-tools)
17
+ - [4. CRUD (6)](#4-crud-6-tools)
18
+ - [5. Relations (4)](#5-relations-4-tools)
19
19
  - [6. Actions & Functions (6)](#6-actions--functions-6-tools)
20
20
  - [7. Batch (1)](#7-batch-1-tool)
21
21
  - [8. Change Tracking (1)](#8-change-tracking-1-tool)
22
- - [9. Solutions (3)](#9-solutions-3-tools)
22
+ - [9. Solutions (2)](#9-solutions-2-tools)
23
23
  - [10. Impersonation (1)](#10-impersonation-1-tool)
24
- - [11. Customization (3)](#11-customization-3-tools)
25
- - [12. Environment (2)](#12-environment-2-tools)
24
+ - [11. Customization (4)](#11-customization-4-tools)
25
+ - [12. Environment (4)](#12-environment-4-tools)
26
26
  - [13. Trace (2)](#13-trace-2-tools)
27
27
  - [14. Search (1)](#14-search-1-tool)
28
28
  - [15. Audit (1)](#15-audit-1-tool)
@@ -31,7 +31,11 @@
31
31
  - [18. Users (2)](#18-users-2-tools)
32
32
  - [19. Views (1)](#19-views-1-tool)
33
33
  - [20. Files (2)](#20-files-2-tools)
34
- - [21. Org (1)](#21-org-1-tool)
34
+ - [21. Org (2)](#21-org-2-tools)
35
+ - [22. RBAC (7)](#22-rbac-7-tools)
36
+ - [23. Workflows (4)](#23-workflows-4-tools)
37
+ - [24. Assistance (2)](#24-assistance-2-tools)
38
+ - [25. Attributes (4)](#25-attributes-4-tools)
35
39
  - [Error Handling & Retry Behavior](#error-handling--retry-behavior)
36
40
  - [Security](#security)
37
41
  - [Limitations & Known Constraints](#limitations--known-constraints)
@@ -91,38 +95,40 @@ Server communicates over **stdio** (MCP SDK `StdioServerTransport`). Connect fro
91
95
 
92
96
  ```mermaid
93
97
  graph LR
94
- MCP["MCP Dataverse Server<br/><i>63 tools · 24 categories</i>"]
98
+ MCP["MCP Dataverse Server<br/><i>73 tools · 25 categories</i>"]
95
99
 
96
100
  MCP --> AUTH["🔑 Auth (1)"]
97
- MCP --> META["📋 Metadata (8)"]
101
+ MCP --> META["📋 Metadata (9)"]
98
102
  MCP --> QUERY["🔍 Query (3)"]
99
103
  MCP --> CRUD["✏️ CRUD (6)"]
100
- MCP --> REL["🔗 Relations (2)"]
104
+ MCP --> REL["🔗 Relations (4)"]
101
105
  MCP --> ACT["⚡ Actions & Functions (6)"]
102
106
  MCP --> BATCH["📦 Batch (1)"]
103
107
  MCP --> TRACK["🔄 Change Tracking (1)"]
104
- MCP --> SOL["🧩 Solutions (3)"]
108
+ MCP --> SOL["🧩 Solutions (2)"]
105
109
  MCP --> IMP["👤 Impersonation (1)"]
106
- MCP --> CUST["🔧 Customization (3)"]
107
- MCP --> ENV["⚙️ Environment (2)"]
110
+ MCP --> CUST["🔧 Customization (4)"]
111
+ MCP --> ENV["⚙️ Environment (4)"]
108
112
  MCP --> TRACE["🔎 Trace (2)"]
109
113
  MCP --> SRCH["🔍 Search (1)"]
110
114
  MCP --> AUDIT["📜 Audit (1)"]
111
115
  MCP --> QUAL["✅ Quality (1)"]
112
116
  MCP --> NOTE["📝 Annotations (2)"]
113
117
  MCP --> USR["👥 Users (2)"]
118
+ MCP --> RBAC["🛡️ RBAC (7)"]
114
119
  MCP --> VIEWS["👁️ Views (1)"]
115
120
  MCP --> FILES["📁 Files (2)"]
116
- MCP --> ORG["🏢 Org (1)"]
117
- MCP --> TEAMS["👥 Teams (1)"]
118
- MCP --> ASSIST["🤖 Assistance (4)"]
121
+ MCP --> ORG["🏢 Org (2)"]
122
+ MCP --> WF["⚙️ Workflows (4)"]
123
+ MCP --> ASSIST["🤖 Assistance (2)"]
124
+ MCP --> ATTR["🏗️ Attributes (4)"]
119
125
  ```
120
126
 
121
127
  All tool handlers validate inputs with **Zod** before calling the `DataverseAdvancedClient`. Auth tokens are cached and refreshed proactively; transient errors (429, 503, 504) are retried with exponential backoff.
122
128
 
123
129
  ---
124
130
 
125
- ## Tool Reference (63 tools)
131
+ ## Tool Reference (73 tools)
126
132
 
127
133
  ### 1. Auth (1 tool)
128
134
 
@@ -134,7 +140,7 @@ Returns the current authenticated user context (userId, businessUnitId, organiza
134
140
 
135
141
  ---
136
142
 
137
- ### 2. Metadata (8 tools)
143
+ ### 2. Metadata (9 tools)
138
144
 
139
145
  #### `dataverse_list_tables`
140
146
 
@@ -273,7 +279,7 @@ Retrieves ALL matching records by auto-following `@odata.nextLink` pages. Use wh
273
279
 
274
280
  ---
275
281
 
276
- ### 4. CRUD (5 tools)
282
+ ### 4. CRUD (6 tools)
277
283
 
278
284
  #### `dataverse_get`
279
285
 
@@ -354,7 +360,22 @@ Create-or-update via an alternate key (no GUID needed). Returns `"created"` or `
354
360
 
355
361
  ---
356
362
 
357
- ### 5. Relations (2 tools)
363
+ #### `dataverse_assign`
364
+
365
+ Assigns a Dataverse record to a different user or team owner. Sets the `ownerid` lookup field using OData bind syntax.
366
+
367
+ | Parameter | Type | Req | Notes |
368
+ | --------------- | ---------------------- | --- | ----------------------- |
369
+ | `entitySetName` | `string` | ✓ | OData entity set name |
370
+ | `id` | `string (UUID)` | ✓ | Record GUID to reassign |
371
+ | `ownerType` | `"systemuser"\|"team"` | ✓ | Target owner type |
372
+ | `ownerId` | `string (UUID)` | ✓ | GUID of user or team |
373
+
374
+ > "Reassign account a1b2c3d4 to user u1v2w3x4"
375
+
376
+ ---
377
+
378
+ ### 5. Relations (4 tools)
358
379
 
359
380
  #### `dataverse_associate`
360
381
 
@@ -514,7 +535,7 @@ Delta-query for incremental sync. Pass `deltaToken: null` for initial snapshot;
514
535
 
515
536
  ---
516
537
 
517
- ### 9. Solutions (3 tools)
538
+ ### 9. Solutions (2 tools)
518
539
 
519
540
  #### `dataverse_list_solutions`
520
541
 
@@ -591,7 +612,7 @@ Executes any other tool on behalf of a different Dataverse user by injecting `MS
591
612
 
592
613
  ---
593
614
 
594
- ### 11. Customization (3 tools)
615
+ ### 11. Customization (4 tools)
595
616
 
596
617
  #### `dataverse_list_custom_actions`
597
618
 
@@ -651,7 +672,7 @@ Activates or deactivates a classic Dataverse workflow (statecode/statuscode upda
651
672
 
652
673
  ---
653
674
 
654
- ### 12. Environment (2 tools)
675
+ ### 12. Environment (4 tools)
655
676
 
656
677
  #### `dataverse_get_environment_variable`
657
678
 
@@ -688,6 +709,24 @@ Sets or updates an environment variable's current value (creates or updates the
688
709
 
689
710
  ---
690
711
 
712
+ #### `dataverse_create_environment_variable`
713
+
714
+ Creates a new Dataverse environment variable definition and sets its initial value. Use when the variable does not yet exist.
715
+
716
+ | Parameter | Type | Req | Notes |
717
+ | -------------- | ---------------------------------------- | --- | ------------------------------------------------------- |
718
+ | `schemaName` | `string` | ✓ | Schema name (publisher prefix required, e.g. `new_MyVar`) |
719
+ | `displayName` | `string` | ✓ | Human-readable label |
720
+ | `type` | `"String"\|"Integer"\|"Boolean"\|"JSON"` | ✓ | Variable data type |
721
+ | `value` | `string` | ✓ | Initial value |
722
+ | `description` | `string` | — | Optional description |
723
+ | `defaultValue` | `string` | — | Optional default value |
724
+ | `confirm` | `true` | ✓ | Explicit confirmation required |
725
+
726
+ > "Create environment variable new_MaxRetries of type Integer with value 3"
727
+
728
+ ---
729
+
691
730
  ### 13. Trace (2 tools)
692
731
 
693
732
  #### `dataverse_get_plugin_trace_logs`
@@ -724,7 +763,7 @@ Retrieves AsyncOperation records for background/classic workflow executions. Not
724
763
 
725
764
  #### `dataverse_search`
726
765
 
727
- Full-text Relevance Search across all configured Dataverse tables. Returns ranked results with entity name, record ID, score, highlights, and matched fields. Requires **Relevance Search** enabled in Dataverse admin.
766
+ Full-text Relevance Search across all configured Dataverse tables. Returns ranked results with entity name, record ID, score, highlights, and matched fields. Uses the **Search API v2.0** endpoint. Requires **Relevance Search** enabled in Dataverse admin. If Relevance Search is disabled or no entities are configured for search, returns a structured error with `errorCategory: "ENV_LIMITATION"` and setup instructions.
728
767
 
729
768
  | Parameter | Type | Req | Notes |
730
769
  | ------------ | ------------------ | --- | --------------------------------------------------- |
@@ -801,7 +840,7 @@ Retrieves notes and file attachments linked to a record. Set `includeContent=tru
801
840
  | Parameter | Type | Req | Notes |
802
841
  | ---------------- | --------------- | --- | ---------------------------------------- |
803
842
  | `recordId` | `string (UUID)` | ✓ | Parent record GUID |
804
- | `includeContent` | `boolean` | — | Include `documentbody` (default `false`) |
843
+ | `includeContent` | `boolean` | — | Include `documentBody` (default `false`) |
805
844
  | `top` | `number` | — | Default `20`, max `100` |
806
845
  | `mimeTypeFilter` | `string` | — | e.g. `"application/pdf"` |
807
846
 
@@ -811,17 +850,17 @@ Retrieves notes and file attachments linked to a record. Set `includeContent=tru
811
850
 
812
851
  #### `dataverse_create_annotation`
813
852
 
814
- Creates a note or file attachment linked to a Dataverse record. Provide `notetext` for a text note, `documentbody` (base64) for a file, or both.
853
+ Creates a note or file attachment linked to a Dataverse record. Provide `noteText` for a text note, `documentBody` (base64) for a file, or both.
815
854
 
816
855
  | Parameter | Type | Req | Notes |
817
856
  | --------------- | --------------- | --- | ------------------------------------------------------- |
818
857
  | `recordId` | `string (UUID)` | ✓ | Parent record GUID |
819
858
  | `entitySetName` | `string` | ✓ | Parent entity set, e.g. `"accounts"` |
820
- | `notetext` | `string` | — | Text content (required if no `documentbody`) |
859
+ | `noteText` | `string` | — | Text content (required if no `documentBody`) |
821
860
  | `subject` | `string` | — | Note subject/title |
822
- | `filename` | `string` | — | File name (for attachments) |
823
- | `mimetype` | `string` | — | MIME type, e.g. `"application/pdf"` |
824
- | `documentbody` | `string` | — | Base64-encoded file content (required if no `notetext`) |
861
+ | `fileName` | `string` | — | File name (for attachments) |
862
+ | `mimeType` | `string` | — | MIME type, e.g. `"application/pdf"` |
863
+ | `documentBody` | `string` | — | Base64-encoded file content (required if no `noteText`) |
825
864
 
826
865
  > "Attach a PDF report to account a1b2c3d4"
827
866
 
@@ -942,7 +981,7 @@ Downloads a file from a Dataverse file-type column. Returns the file as a base64
942
981
 
943
982
  ---
944
983
 
945
- ### 21. Org (1 tool)
984
+ ### 21. Org (2 tools)
946
985
 
947
986
  #### `dataverse_list_business_units`
948
987
 
@@ -957,6 +996,281 @@ Lists business units in the environment with name, ID, parent BU ID, disabled st
957
996
 
958
997
  ---
959
998
 
999
+ #### `dataverse_list_teams`
1000
+
1001
+ Lists Dataverse teams (owner teams and access teams) within one or all business units.
1002
+
1003
+ | Parameter | Type | Req | Notes |
1004
+ | ---------------- | ------------------------- | --- | ---------------------------------------------- |
1005
+ | `top` | `number` | — | Default `50`, max `200` |
1006
+ | `teamType` | `"Owner"\|"Access"\|"AAD"` | — | Filter by team type; omit for all |
1007
+ | `businessUnitId` | `string (UUID)` | — | Filter by business unit |
1008
+
1009
+ > "List all owner teams in the environment"
1010
+
1011
+ ---
1012
+
1013
+ ### 22. RBAC (7 tools)
1014
+
1015
+ #### `dataverse_list_roles`
1016
+
1017
+ Lists security roles in the environment, optionally filtered by name.
1018
+
1019
+ | Parameter | Type | Req | Notes |
1020
+ | ------------ | -------- | --- | ---------------------------- |
1021
+ | `nameFilter` | `string` | — | Substring match on role name |
1022
+ | `top` | `number` | — | Default `50`, max `200` |
1023
+
1024
+ > "List all security roles that contain 'Sales'"
1025
+
1026
+ ```json
1027
+ {
1028
+ "total": 3,
1029
+ "roles": [{ "roleId": "...", "name": "Salesperson", "businessUnitId": "..." }]
1030
+ }
1031
+ ```
1032
+
1033
+ ---
1034
+
1035
+ #### `dataverse_assign_role_to_user`
1036
+
1037
+ Assigns a security role to a system user (idempotent — returns `"already_assigned"` if the role is already assigned).
1038
+
1039
+ | Parameter | Type | Req | Notes |
1040
+ | --------- | --------------- | --- | ----------------- |
1041
+ | `userId` | `string (UUID)` | ✓ | System user GUID |
1042
+ | `roleId` | `string (UUID)` | ✓ | Security role ID |
1043
+
1044
+ > "Assign role r1s2t3u4 to user u1v2w3x4"
1045
+
1046
+ ---
1047
+
1048
+ #### `dataverse_remove_role_from_user`
1049
+
1050
+ Removes a security role from a system user.
1051
+
1052
+ | Parameter | Type | Req | Notes |
1053
+ | --------- | --------------- | --- | ---------------- |
1054
+ | `userId` | `string (UUID)` | ✓ | System user GUID |
1055
+ | `roleId` | `string (UUID)` | ✓ | Security role ID |
1056
+
1057
+ > "Remove role r1s2t3u4 from user u1v2w3x4"
1058
+
1059
+ ---
1060
+
1061
+ #### `dataverse_assign_role_to_team`
1062
+
1063
+ Assigns a security role to a Dataverse team. All team members inherit the role permissions.
1064
+
1065
+ | Parameter | Type | Req | Notes |
1066
+ | --------- | --------------- | --- | ------------------------------ |
1067
+ | `teamId` | `string (UUID)` | ✓ | Team GUID |
1068
+ | `roleId` | `string (UUID)` | ✓ | Security role GUID |
1069
+ | `confirm` | `true` | ✓ | Explicit confirmation required |
1070
+
1071
+ > "Assign role r1s2t3u4 to team t1e2a3m4"
1072
+
1073
+ ---
1074
+
1075
+ ### 23. Workflows (4 tools)
1076
+
1077
+ #### `dataverse_list_workflows`
1078
+
1079
+ Lists classic Dataverse workflows and modern cloud flows registered in the environment.
1080
+
1081
+ | Parameter | Type | Req | Notes |
1082
+ | ------------- | --------- | --- | -------------------------------------------- |
1083
+ | `top` | `number` | — | Default `50`, max `200` |
1084
+ | `activeOnly` | `boolean` | — | Return only activated workflows (default `false`) |
1085
+ | `nameFilter` | `string` | — | Substring match on workflow name |
1086
+
1087
+ > "List all active workflows on the account table"
1088
+
1089
+ ---
1090
+
1091
+ #### `dataverse_get_workflow`
1092
+
1093
+ Retrieves a single workflow definition by ID, including its trigger, steps, and current state.
1094
+
1095
+ | Parameter | Type | Req | Notes |
1096
+ | ------------ | --------------- | --- | ------------- |
1097
+ | `workflowId` | `string (UUID)` | ✓ | Workflow GUID |
1098
+
1099
+ > "Get the definition of workflow w1x2y3z4"
1100
+
1101
+ ---
1102
+
1103
+ ### 24. Assistance (2 tools)
1104
+
1105
+ #### `dataverse_suggest_tools`
1106
+
1107
+ Returns a ranked list of MCP tools relevant to a natural-language task description. Use this when unsure which tool to call — it uses tag-based matching to surface the right tools.
1108
+
1109
+ | Parameter | Type | Req | Notes |
1110
+ | ------------- | -------- | --- | ---------------------------------- |
1111
+ | `task` | `string` | ✓ | Natural-language description of the task |
1112
+ | `top` | `number` | — | Max results (default `5`) |
1113
+
1114
+ > "Which tool should I use to create a new lookup column?"
1115
+
1116
+ ---
1117
+
1118
+ #### `dataverse_list_guides`
1119
+
1120
+ Lists available built-in guides that walk through common multi-step Dataverse tasks.
1121
+
1122
+ | Parameter | Type | Req | Notes |
1123
+ | --------- | ---- | --- | ----- |
1124
+ | — | — | — | No parameters |
1125
+
1126
+ > "What guides are available in this MCP server?"
1127
+
1128
+ ---
1129
+
1130
+ #### `dataverse_get_guide`
1131
+
1132
+ Retrieves the full step-by-step content for a specific guide by name.
1133
+
1134
+ | Parameter | Type | Req | Notes |
1135
+ | ----------- | -------- | --- | ------------------- |
1136
+ | `guideName` | `string` | ✓ | Guide name from `list_guides` |
1137
+
1138
+ > "Show me the steps for the entity-audit guide"
1139
+
1140
+ ---
1141
+
1142
+ #### `dataverse_list_connection_references`
1143
+
1144
+ Lists connection references used in solutions (Power Automate connectors).
1145
+
1146
+ | Parameter | Type | Req | Notes |
1147
+ | -------------- | -------- | --- | -------------------------------- |
1148
+ | `top` | `number` | — | Default `50`, max `200` |
1149
+ | `nameFilter` | `string` | — | Substring match on display name |
1150
+
1151
+ > "List all SharePoint connection references in my environment"
1152
+
1153
+ ---
1154
+
1155
+ #### `dataverse_list_tool_tags`
1156
+
1157
+ Lists all available tool tags with the number of tools in each category. Use this to discover what kinds of operations are available before calling `dataverse_suggest_tools`.
1158
+
1159
+ | Parameter | Type | Req | Notes |
1160
+ | --------- | ---- | --- | ------------- |
1161
+ | — | — | — | No parameters |
1162
+
1163
+ > "What categories of tools are available in this MCP server?"
1164
+
1165
+ ---
1166
+
1167
+ ### 25. Attributes (4 tools)
1168
+
1169
+ Attribute tools manage **column-level schema** in Dataverse tables. All write operations require `confirm: true` and auto-publish the entity definition by default.
1170
+
1171
+ #### `dataverse_create_attribute`
1172
+
1173
+ Creates a new column on an existing Dataverse table. Supports 11 attribute types with type-specific parameters.
1174
+
1175
+ | Parameter | Type | Req | Notes |
1176
+ | -------------------- | ---------------------------------------------------------------------------------------------------------------- | --- | --------------------------------------------------------------- |
1177
+ | `entityLogicalName` | `string` | ✓ | Target table (e.g. `"account"`) |
1178
+ | `schemaName` | `string` | ✓ | Must include publisher prefix (e.g. `"new_CustomField"`) |
1179
+ | `attributeType` | `"String"\|"Memo"\|"Integer"\|"Decimal"\|"Money"\|"DateTime"\|"Boolean"\|"Picklist"\|"MultiSelectPicklist"\|"AutoNumber"\|"Image"` | ✓ | Column type |
1180
+ | `displayName` | `string` | ✓ | Human-readable label |
1181
+ | `description` | `string` | — | Column description |
1182
+ | `requiredLevel` | `"None"\|"ApplicationRequired"\|"Recommended"` | — | Requirement level (default `"None"`) |
1183
+ | `maxLength` | `number` | — | String/Memo max chars |
1184
+ | `minValue`/`maxValue`| `number` | — | Integer/Decimal range bounds |
1185
+ | `precision` | `number` | — | Decimal/Money decimal places |
1186
+ | `dateTimeFormat` | `"DateOnly"\|"DateAndTime"` | — | DateTime display format |
1187
+ | `defaultBooleanValue`| `boolean` | — | Default for Boolean columns |
1188
+ | `picklistOptions` | `{value: number, label: string}[]` | — | Option values for Picklist/MultiSelectPicklist |
1189
+ | `autoNumberFormat` | `string` | — | Format string for AutoNumber, e.g. `"INV-{SEQNUM:5}"` |
1190
+ | `languageCode` | `number` | — | Label language code (default `1033` = English) |
1191
+ | `autoPublish` | `boolean` | — | Publish after create (default `true`) |
1192
+ | `confirm` | `true` | ✓ | Must be `true` |
1193
+
1194
+ > "Add a text column 'new_ExternalId' to the account table with max 100 characters"
1195
+
1196
+ ```json
1197
+ {
1198
+ "logicalName": "new_externalid",
1199
+ "schemaName": "new_ExternalId",
1200
+ "attributeType": "String",
1201
+ "entityLogicalName": "account",
1202
+ "published": true
1203
+ }
1204
+ ```
1205
+
1206
+ ---
1207
+
1208
+ #### `dataverse_update_attribute`
1209
+
1210
+ Updates properties of an existing column. Only columns with `IsCustomizable = true` can be modified.
1211
+
1212
+ | Parameter | Type | Req | Notes |
1213
+ | --------------------- | ----------------------------------------------- | --- | ------------------------------------------- |
1214
+ | `entityLogicalName` | `string` | ✓ | Table containing the column |
1215
+ | `attributeLogicalName`| `string` | ✓ | Column logical name (e.g. `"new_myfield"`) |
1216
+ | `displayName` | `string` | — | New display label |
1217
+ | `description` | `string` | — | New description |
1218
+ | `requiredLevel` | `"None"\|"ApplicationRequired"\|"Recommended"` | — | New requirement level |
1219
+ | `maxLength` | `number` | — | Increase only (cannot decrease) |
1220
+ | `isSearchable` | `boolean` | — | Include in Quick Find views |
1221
+ | `languageCode` | `number` | — | Default `1033` |
1222
+ | `autoPublish` | `boolean` | — | Default `true` |
1223
+ | `confirm` | `true` | ✓ | Must be `true` |
1224
+
1225
+ > "Update new_externalid on account to be required"
1226
+
1227
+ ---
1228
+
1229
+ #### `dataverse_delete_attribute`
1230
+
1231
+ ⚠️ **DESTRUCTIVE** — permanently deletes a custom column and all its data from all records.
1232
+
1233
+ | Parameter | Type | Req | Notes |
1234
+ | --------------------- | -------- | --- | ------------------------------------------------ |
1235
+ | `entityLogicalName` | `string` | ✓ | Table containing the column |
1236
+ | `attributeLogicalName`| `string` | ✓ | Column logical name (must be a custom column) |
1237
+ | `autoPublish` | `boolean`| — | Publish after delete (default `true`) |
1238
+ | `confirm` | `true` | ✓ | Must be `true` |
1239
+
1240
+ > "Delete the column new_externalid from account"
1241
+
1242
+ ---
1243
+
1244
+ #### `dataverse_create_lookup_attribute`
1245
+
1246
+ Creates a lookup (N:1) column on a table, simultaneously defining a 1:N relationship between two tables. This is the correct way to add a foreign-key-style reference to another table.
1247
+
1248
+ | Parameter | Type | Req | Notes |
1249
+ | --------------------- | -------- | --- | --------------------------------------------------------------------------- |
1250
+ | `entityLogicalName` | `string` | ✓ | Table that will contain the lookup column (the "many" side) |
1251
+ | `schemaName` | `string` | ✓ | Must include publisher prefix (e.g. `"new_ParentAccount"`) |
1252
+ | `displayName` | `string` | ✓ | Human-readable label |
1253
+ | `referencedEntity` | `string` | ✓ | Table being looked up (the "one" side, e.g. `"account"`) |
1254
+ | `description` | `string` | — | Column description |
1255
+ | `requiredLevel` | `"None"\|"ApplicationRequired"\|"Recommended"` | — | Default `"None"` |
1256
+ | `languageCode` | `number` | — | Default `1033` |
1257
+ | `autoPublish` | `boolean`| — | Default `true` |
1258
+ | `confirm` | `true` | ✓ | Must be `true` |
1259
+
1260
+ > "Add a lookup to 'account' on the contact table called new_PrimaryAccount"
1261
+
1262
+ ```json
1263
+ {
1264
+ "lookupLogicalName": "new_primaryaccount",
1265
+ "relationshipSchemaName": "new_contact_primaryaccount",
1266
+ "referencedEntity": "account",
1267
+ "referencingEntity": "contact",
1268
+ "published": true
1269
+ }
1270
+ ```
1271
+
1272
+ ---
1273
+
960
1274
  ## Error Handling & Retry Behavior
961
1275
 
962
1276
  All tool handlers return `{ isError: true, content: [{ type: "text", text: "Error: ..." }] }` on failure. Zod input validation runs before any network call.
@@ -971,6 +1285,16 @@ All tool handlers return `{ isError: true, content: [{ type: "text", text: "Erro
971
1285
 
972
1286
  Dataverse error bodies are formatted as `Dataverse error <code>: <message>`. Timeouts (`ECONNABORTED`) produce `Request timed out. Check your Dataverse environment URL.`
973
1287
 
1288
+ ### Error Categories
1289
+
1290
+ Certain tools include an `errorCategory` field in the error text when the failure has a well-known cause:
1291
+
1292
+ | `errorCategory` | Meaning | Example |
1293
+ | ----------------- | ------------------------------------------------------------ | --------------------------------------------------------- |
1294
+ | `ENV_LIMITATION` | Feature not enabled or unavailable in this environment | `dataverse_search` when Relevance Search is disabled |
1295
+ | `PERMISSIONS` | Operation denied due to insufficient privileges | Restricted table or action |
1296
+ | `SCHEMA_MISMATCH` | Supplied data conflicts with the table's metadata schema | Wrong attribute type in `dataverse_create_attribute` |
1297
+
974
1298
  ---
975
1299
 
976
1300
  ## Security
@@ -1036,4 +1360,4 @@ Dataverse error bodies are formatted as `Dataverse error <code>: <message>`. Tim
1036
1360
 
1037
1361
  ---
1038
1362
 
1039
- _This document reflects the MCP Dataverse server codebase as of v0.3.6 — 63 tools across 24 categories._
1363
+ _This document reflects the MCP Dataverse server codebase as of v0.4.6 — 73 tools across 25 categories._
package/README.md CHANGED
@@ -6,9 +6,7 @@
6
6
 
7
7
  **The most complete MCP server for Microsoft Dataverse.**
8
8
 
9
- Give your AI agents real-time access to Dataverse query records with OData & FetchXML, manage metadata, inspect solutions, run batch operations, audit changes, and more. Zero-config auth via Microsoft device code flow.
10
-
11
- 63 tools · 4 resources · 10 guided workflows · Zero config auth
9
+ 73 tools · 4 resources · 10 guided workflows · Zero config auth
12
10
 
13
11
  [![npm](https://img.shields.io/npm/v/mcp-dataverse)](https://www.npmjs.com/package/mcp-dataverse)
14
12
  [![npm downloads](https://img.shields.io/npm/dm/mcp-dataverse)](https://www.npmjs.com/package/mcp-dataverse)
@@ -80,6 +78,31 @@ Re-authenticate after ~90 days of inactivity: `npx mcp-dataverse-auth`
80
78
 
81
79
  ---
82
80
 
81
+ ## HTTP Transport
82
+
83
+ Run as an HTTP server for multi-client use:
84
+
85
+ ```bash
86
+ MCP_TRANSPORT=http MCP_HTTP_PORT=3000 MCP_HTTP_SECRET=mysecret node dist/server.js
87
+ ```
88
+
89
+ Connect using VS Code / Copilot with:
90
+ ```json
91
+ {
92
+ "servers": {
93
+ "dataverse": {
94
+ "type": "http",
95
+ "url": "http://localhost:3000/mcp",
96
+ "headers": {
97
+ "Authorization": "Bearer mysecret"
98
+ }
99
+ }
100
+ }
101
+ }
102
+ ```
103
+
104
+ ---
105
+
83
106
  ## Troubleshooting
84
107
 
85
108
  | Symptom | Fix |
@@ -102,8 +125,8 @@ MCP Dataverse is designed to be comprehensive, but most AI models work best with
102
125
 
103
126
  | Version | Feature | Status |
104
127
  | ------- | ------- | ------ |
105
- | **v0.4** | HTTP transport + schema consistency + new auth methods | 🟢 In progress |
106
- | **v0.5** | MCP Prompts workflow templates | 🔴 Planned |
128
+ | **v0.4** | HTTP transport + attribute management + schema consistency | Released |
129
+ | **v0.5** | Enterprise auth (Client Credentials, Managed Identity) + MCP Prompts | 🔴 Planned |
107
130
 
108
131
  [→ Full Roadmap](https://codeurali.github.io/mcp-dataverse/roadmap)
109
132