You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+31Lines changed: 31 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,6 +5,37 @@ Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) — [Semantic V
5
5
6
6
---
7
7
8
+
## [0.4.5] — 2026-03-06
9
+
10
+
### Fixed
11
+
12
+
-**BUG-033 — `dataverse_search`: `querytype` invalid as top-level parameter**: The `searchType: "full"` option was incorrectly sent as `body.querytype = "full"` (top-level). Per the Search API v2.0 spec, `querytype` belongs inside the serialized `options` string. `searchType: "full"` now maps to `body.options = '{"querytype":"lucene"}'`. `searchType: "simple"` (default) produces no `options` field.
13
+
-**BUG-034 — `dataverse_search`: `select` invalid as top-level parameter**: The `select` parameter was sent as a top-level field in the request body, which is not recognized by the v2.0 API. Selected columns must be per entity (`selectColumns`). `select` is now embedded inside each object of the `entities` array as `selectColumns`.
14
+
-**BUG-035 — `dataverse_search`: `entities` must be a JSON-serialized string**: The `entities` array was sent as a native JSON array. The Search API v2.0 requires `entities` to be a **JSON-serialized string** of entity objects (`"[{\"name\":\"account\",...}]"`), not a native array. Parameter is now serialized via `JSON.stringify(entityObjects)`.
15
+
-**BONUS — `facets` and `orderby` serialized as JSON strings**: Per the v2.0 API spec (both parameters typed as `string`), `facets` and `orderby` are now passed as `JSON.stringify(...)` of their arrays, not as native arrays.
16
+
17
+
---
18
+
19
+
## [0.4.4] — 2026-03-06
20
+
21
+
### Fixed
22
+
23
+
-**BUG-029 — `isError` absent from `content[0].text` body**: All tool errors returned `result.isError = true` at the MCP envelope level, but the inner `content[0].text` JSON body did not include `isError`. AI agents that parse the text body would not detect the error and could try to use the result as valid data. `output.utils.ts` now consistently sets `isError: true` inside the serialized text body whenever `errorCategory` is present.
24
+
-**BUG-032 — `dataverse_search`: `returntotalrecordcount` invalid in v2.0 payload**: The `returntotalrecordcount` parameter from the v1.0 API was still being sent in the v2.0 request body. The correct v2.0 parameter is `count` (boolean). Removed `returntotalrecordcount`; the v2.0 API already returns counts via `QueryContext.@Search.totalCount` in the response.
25
+
26
+
---
27
+
28
+
## [0.4.3] — 2026-03-06
29
+
30
+
### Fixed
31
+
32
+
-**BUG-025 — `dataverse_update_entity`: suggestions included non-modifiable attributes**: The suggestion list returned after a preflight failure or as guidance could include read-only system attributes. The suggestion generator now filters to modifiable attributes only.
33
+
-**BUG-028 — `dataverse_delete_attribute`: raw exception on protected columns**: Deleting OOB (out-of-box) attributes or columns with active dependencies raised an unhandled exception. The tool now catches `0x80048405` (managed attribute) and `HAS_DEPENDENCIES` codes and returns a structured error with `errorCategory: "SCHEMA_MISMATCH"` and an actionable message.
34
+
-**BUG-030 — `dataverse_update_entity`: missing preflight check**: Large metadata PATCH calls could fail mid-way if environment prerequisites were not met. A `hasSysAdmin` preflight check is now performed before executing any write.
35
+
-**BUG-031 — `dataverse_search`: `searchMode` invalid as top-level parameter in v2.0**: The `searchMode` parameter (valid in v1.0) is not a recognized top-level parameter in the v2.0 API. Removed from the request body to eliminate `0x80048d19` deserialization errors.
**Problem:**`PATCH /EntityDefinitions` and `PUT /EntityDefinitions(.../Attributes(...)` calls do not include the `MSCRM.MergeLabels: true` header. In multi-language environments, this causes non-primary-language labels (DisplayName, Description) to be erased on every update.
38
38
39
39
**Workaround:** After updating metadata, manually re-apply non-English labels via the Dataverse UI or a direct API call with the header set.
40
40
41
-
**Planned fix:**Add `MSCRM.MergeLabels: true` header to all metadata PATCH/PUT operations in the client layer.
41
+
**Fix:**`MSCRM.MergeLabels: true` header added to all metadata PATCH/PUT operations in v0.4.0.
42
42
43
43
---
44
44
@@ -75,38 +75,38 @@ Last updated: July 2025
75
75
---
76
76
77
77
### ISSUE-04 — Batch requests use `\n` instead of `\r\n`
78
-
{: .text-yellow-300 }
78
+
{: .text-grey-dk-000 }
79
79
80
80
|||
81
81
|:--|:--|
82
82
|**Priority**| 🟡 Medium-Low |
83
83
|**Affected tools**|`dataverse_batch_execute`|
84
-
|**Status**|🔜 Fix planned (v0.4)|
84
+
|**Status**|✅ Fixed in v0.4.0|
85
85
86
86
**Problem:** The batch request body uses Unix-style line endings (`\n`) instead of CRLF (`\r\n`) as required by RFC 2046 for MIME multipart messages. The Dataverse Web API currently accepts `\n`, but this violates the spec and may break with future API versions or stricter proxies.
87
87
88
88
**Workaround:** None needed — Dataverse currently tolerates `\n`.
89
89
90
-
**Planned fix:**Replace `\n` with `\r\n` in batch body construction in `dataverse-client.batch.ts`.
90
+
**Fix:**Batch request boundary now uses CRLF (`\r\n`) per RFC 2046 — resolved in v0.4.0.
91
91
92
92
---
93
93
94
94
### ISSUE-05 — `detect_duplicates` description is misleading
**Problem:** The tool description says "Uses Dataverse built-in duplicate detection rules", but the actual implementation uses FetchXML with field-level OR matching. This is a functional approximation — it does not invoke the real `RetrieveDuplicates` function or respect published duplicate detection rules in the environment.
104
104
105
105
**Impact:** Results may differ from what the Dataverse duplicate detection UI would return. Custom duplicate rules (e.g., fuzzy matching, compound keys) are not honored.
106
106
107
107
**Workaround:** For authoritative duplicate detection, use the Dataverse UI or call `RetrieveDuplicates` directly via the Web API.
108
108
109
-
**Planned fix:**Update the tool description to accurately reflect the FetchXML-based approach. Optionally, add a separate tool that calls the real `RetrieveDuplicates` function.
109
+
**Fix:**Tool description updated in v0.4.0 to accurately reflect the FetchXML field-OR matching approach. A future tool wrapping the real `RetrieveDuplicates` function remains in the ideas backlog.
110
110
111
111
---
112
112
@@ -177,7 +177,7 @@ These are not bugs — they are inherent limitations of the current implementati
177
177
| Tool | Constraint | Reason |
178
178
|:-----|:-----------|:-------|
179
179
|`dataverse_update_entity`| Boolean flag updates may fail with `0x80060888`| Environment-level restriction on managed metadata |
180
-
|`dataverse_search`| Returns a structured error with `errorCategory: "ENV_LIMITATION"` if Relevance Search is disabled or no entities are configured | Requires admin to enable org-wide Relevance Search and configure search entities|
180
+
|`dataverse_search`| Returns a structured error with `errorCategory: "ENV_LIMITATION"` if Relevance Search is disabled or no entities are configured for search | Enable via **Power Platform Admin Center → Environments → [env] → Settings → Product → Features → Dataverse Search = On** (requires System Administrator). Once enabled, allow 15–30 min for initial indexing.|
181
181
|`dataverse_batch_execute`| No `$<Content-ID>` cross-referencing | Would require changeset dependency parser — out of scope for now |
182
182
|`dataverse_execute_fetchxml`| No automatic pagination | FetchXML paging cookies must be handled manually |
183
183
|`dataverse_retrieve_multiple_with_paging`| Max 50,000 records | Safety cap to prevent runaway queries |
Copy file name to clipboardExpand all lines: package.json
+2-2Lines changed: 2 additions & 2 deletions
Original file line number
Diff line number
Diff line change
@@ -1,7 +1,7 @@
1
1
{
2
2
"name": "mcp-dataverse",
3
-
"version": "0.4.2",
4
-
"description": "The most complete MCP server for Microsoft Dataverse. 63 production-ready tools for AI agents: OData & FetchXML queries, CRUD, metadata, solutions, audit, batch operations and more. Zero-config Microsoft device code auth. Works with VS Code Copilot, Claude, Cursor, Windsurf and all MCP clients.",
3
+
"version": "0.4.5",
4
+
"description": "The most complete MCP server for Microsoft Dataverse. 67 production-ready tools for AI agents: OData & FetchXML queries, CRUD, metadata, solutions, audit, batch operations and more. Zero-config Microsoft device code auth. Works with VS Code Copilot, Claude, Cursor, Windsurf and all MCP clients.",
0 commit comments