Skip to content

Commit 086e97a

Browse files
author
Dev Agent Amelia
committed
fix: A1-A4 post-release anomalies (v0.4.1)
- A1: retry 0x80071151 customization lock with exponential backoff (5s*2^n, max 5) - A2: create_lookup_attribute verifies attribute after timeout; success with warning if found - A3: get_relationships follows @odata.nextLink — custom lookups no longer missed on large tables - A4: get_attribute_option_set now supports MultiSelectPicklist attributes Tests: 549 passed (8 new tests added for A1-A4)
1 parent 8958d7f commit 086e97a

9 files changed

Lines changed: 92 additions & 43 deletions

CHANGELOG.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,55 @@ Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) — [Semantic V
55

66
---
77

8+
## [0.4.1] — 2026-03-06
9+
10+
### Fixed
11+
12+
- **A1 — Customization lock retry**: `requestWithRetry` now detects HTTP 400 responses with Dataverse error code `0x80071151` (import-job lock) and automatically retries up to 5 times with exponential backoff (5 s → 10 s → 20 s → 40 s → 80 s). Prevents all write tools from failing during concurrent deployments.
13+
- **A2 — Timeout masking success on `dataverse_create_lookup_attribute`**: A network timeout on the relationship creation POST no longer results in a confusing error. The tool now verifies via `getTableMetadata` whether the attribute was actually created; if found, it returns a success response with a warning and skips publish (the operation was committed server-side).
14+
- **A3 — `dataverse_get_relationships` missing custom lookups on large tables**: The three relationship navigation properties (`OneToManyRelationships`, `ManyToOneRelationships`, `ManyToManyRelationships`) now follow `@odata.nextLink` pagination. Previously only the first page was fetched; on tables with 100+ relationships (e.g. `lead`) custom lookup columns from page 2 were silently dropped.
15+
- **A4 — `dataverse_get_attribute_option_set` unsupported on MultiSelectPicklist**: The metadata type list now includes `MultiSelectPicklistAttributeMetadata`, allowing option retrieval for multi-select columns (previously returned a "not a valid option-set attribute" error).
16+
17+
---
18+
19+
## [0.4.0] — 2026-03-05
20+
21+
### Added
22+
23+
- **Attribute Management** — 4 new tools:
24+
- `dataverse_create_attribute` — create columns for String, Memo, Integer, Decimal, Money, DateTime, Boolean, Picklist, MultiSelectPicklist, AutoNumber, Image types with full type-specific parameters (maxLength, precision, picklistOptions, autoNumberFormat, etc.)
25+
- `dataverse_update_attribute` — update column properties (display name, description, requirement level, searchability)
26+
- `dataverse_delete_attribute` — remove custom columns with a `confirm: true` guardrail (⚠️ permanent — deletes all data in the column)
27+
- `dataverse_create_lookup_attribute` — create a lookup (N:1) column that defines a 1:N relationship between two tables
28+
- **HTTP Transport hardening**:
29+
- Bearer token auth with HMAC-SHA256 timing-safe verification (eliminates length timing oracle)
30+
- `WWW-Authenticate: Bearer realm="MCP Dataverse"` header auto-sent on 401
31+
- Configurable CORS via `MCP_HTTP_CORS_ORIGIN` env var
32+
- GET/DELETE requests without a `sessionId` now return 400 instead of silently failing
33+
- `enableJsonResponse` toggle via `MCP_HTTP_JSON_RESPONSE` env var for non-streaming clients
34+
35+
### Changed
36+
37+
- Schema: `confirm` parameter uses `const: true` on all destructive tools (uniform guardrail)
38+
- Preflight: `hasSysAdmin` environment flag now handled in `checkPrerequisites` before tool dispatch
39+
- Quality: `detect_duplicates` caches `EntitySetName` to eliminate redundant metadata calls per invocation
40+
- Code: `attribute.tools.ts` split into `attribute.definitions.ts` (JSON schemas, 253 lines) + `attribute.tools.ts` (handlers, 202 lines) — both under the 400-line file limit
41+
- `config.example.json` renamed to `config.example.jsonc` (supports comments)
42+
43+
### Fixed
44+
45+
- `MultiSelectPicklist` attribute type now correctly uses `OptionSetType: "MultiSelect"` (not `"Picklist"`)
46+
- Batch executor: request body boundary now uses CRLF (`\r\n`) per RFC 2046 spec
47+
- `dataverse_search`: URL now constructed from `environmentUrl` config (eliminates relative `../../` path hack)
48+
- `dataverse_execute_function`: aliased typed parameters now correctly passed (not coerced to strings)
49+
- `dataverse_execute_bound_function`: namespace prefix correctly applied when calling bound functions
50+
- Metadata write operations: `MSCRM.MergeLabels: true` header added on all PUT/PATCH calls to preserve multi-language label translations
51+
- `createRelationship`: reads `OData-EntityId` response header (metadata POST returns 204 No Content with no body)
52+
- `buildLookupRelationshipBody`: SchemaName formula no longer generates double publisher prefix; 100-char length guard added
53+
- `suggest_tools`: no longer surfaces non-callable internal tools to the AI agent
54+
55+
---
56+
857
## [0.3.8] — 2026-03-02
958

1059
### Changed

dist/chunk-75JPRQKI.js

Lines changed: 0 additions & 35 deletions
This file was deleted.

dist/chunk-TIRFQN3L.js

Lines changed: 35 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import{b as a}from"./chunk-TIRFQN3L.js";export{a as DataverseAdvancedClient};

dist/dataverse-client-advanced-MBZSV4CI.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

dist/doctor.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/server.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "mcp-dataverse",
3-
"version": "0.4.0",
3+
"version": "0.4.1",
44
"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.",
55
"type": "module",
66
"main": "dist/server.js",

0 commit comments

Comments
 (0)