Skip to content

Commit 228f505

Browse files
author
Dev Agent Amelia
committed
chore: release v0.7.5 — docs update, BUG-041/A/024/B fixes
1 parent bc8283f commit 228f505

20 files changed

Lines changed: 416 additions & 100 deletions
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Records run_in_terminal and appmod-* tool calls as JSONL for the extension to process.
2+
3+
$raw = [Console]::In.ReadToEnd()
4+
5+
if ($raw -notmatch '"tool_name"\s*:\s*"([^"]+)"') { exit 0 }
6+
$toolName = $Matches[1]
7+
8+
if ($toolName -ne 'run_in_terminal' -and $toolName -notlike 'appmod-*') { exit 0 }
9+
10+
if ($raw -notmatch '"session_id"\s*:\s*"([^"]+)"') { exit 0 }
11+
$sessionId = $Matches[1]
12+
13+
$hooksDir = '.github\java-upgrade\hooks'
14+
if (-not (Test-Path $hooksDir)) { New-Item -ItemType Directory -Path $hooksDir -Force | Out-Null }
15+
16+
$line = ($raw -replace '[\r\n]+', ' ').Trim() + "`n"
17+
[System.IO.File]::AppendAllText("$hooksDir\$sessionId.json", $line, [System.Text.UTF8Encoding]::new($false))
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#!/usr/bin/env bash
2+
# Records run_in_terminal and appmod-* tool calls as JSONL for the extension to process.
3+
4+
INPUT=$(cat)
5+
6+
TOOL_NAME="${INPUT#*\"tool_name\":\"}"
7+
TOOL_NAME="${TOOL_NAME%%\"*}"
8+
9+
case "$TOOL_NAME" in
10+
run_in_terminal|appmod-*) ;;
11+
*) exit 0 ;;
12+
esac
13+
14+
case "$INPUT" in
15+
*'"session_id":"'*) ;;
16+
*) exit 0 ;;
17+
esac
18+
19+
SESSION_ID="${INPUT#*\"session_id\":\"}"
20+
SESSION_ID="${SESSION_ID%%\"*}"
21+
[ -z "$SESSION_ID" ] && exit 0
22+
23+
HOOKS_DIR=".github/java-upgrade/hooks"
24+
mkdir -p "$HOOKS_DIR"
25+
26+
LINE=$(printf '%s' "$INPUT" | tr -d '\r\n')
27+
printf '%s\n' "$LINE" >> "$HOOKS_DIR/${SESSION_ID}.json"

CAPABILITIES.md

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
# MCP Dataverse Server — Complete Capabilities Reference
22

3-
> **Version**: 0.5.0 | **API Version**: Dataverse Web API v9.2 | **Transport**: stdio · HTTP/SSE
3+
> **Version**: 0.7.5 | **API Version**: Dataverse Web API v9.2 | **Transport**: stdio · HTTP/SSE
44
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.
5+
79 tools across 27 categories for full Dataverse lifecycle: schema, CRUD, FetchXML, solutions, plugins, audit, files, users, teams, RBAC, attribute management, environment variables, workflows, schema write, record access, and more.
66

77
---
88

99
## Table of Contents
1010

1111
- [Quick Start](#quick-start)
1212
- [Architecture Overview](#architecture-overview)
13-
- [Tool Reference (73 tools)](#tool-reference-73-tools)
13+
- [Tool Reference (79 tools)](#tool-reference-79-tools)
1414
- [1. Auth (1)](#1-auth-1-tool)
1515
- [2. Metadata (9)](#2-metadata-9-tools)
1616
- [3. Query (3)](#3-query-3-tools)
@@ -36,6 +36,8 @@
3636
- [23. Workflows (4)](#23-workflows-4-tools)
3737
- [24. Assistance (2)](#24-assistance-2-tools)
3838
- [25. Attributes (4)](#25-attributes-4-tools)
39+
- [26. Schema (write) (2)](#26-schema-write-2-tools)
40+
- [27. Record Access (4)](#27-record-access-4-tools)
3941
- [Error Handling & Retry Behavior](#error-handling--retry-behavior)
4042
- [Security](#security)
4143
- [Limitations & Known Constraints](#limitations--known-constraints)
@@ -95,7 +97,7 @@ Server communicates over **stdio** (MCP SDK `StdioServerTransport`). Connect fro
9597

9698
```mermaid
9799
graph LR
98-
MCP["MCP Dataverse Server<br/><i>73 tools · 25 categories</i>"]
100+
MCP["MCP Dataverse Server<br/><i>79 tools · 27 categories</i>"]
99101
100102
MCP --> AUTH["🔑 Auth (1)"]
101103
MCP --> META["📋 Metadata (9)"]
@@ -122,13 +124,15 @@ graph LR
122124
MCP --> WF["⚙️ Workflows (4)"]
123125
MCP --> ASSIST["🤖 Assistance (2)"]
124126
MCP --> ATTR["🏗️ Attributes (4)"]
127+
MCP --> SCHEMA["📐 Schema write (2)"]
128+
MCP --> ACCESS["🔐 Record Access (4)"]
125129
```
126130

127131
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.
128132

129133
---
130134

131-
## Tool Reference (73 tools)
135+
## Tool Reference (79 tools)
132136

133137
### 1. Auth (1 tool)
134138

CHANGELOG.md

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

66
---
77

8+
## [0.7.5] — 2026-04-14
9+
10+
### Fixed
11+
12+
- **BUG-041 — `dataverse_check_record_access` bound-function regression**: `RetrievePrincipalAccess` is a **bound** OData function on the principal entity (system user or team), not a standalone function. The previous implementation called it as an unbound function, causing runtime failures. Fixed: `executeBoundFunction(principalEntitySet, principalId, "RetrievePrincipalAccess", { Target })`. All 10 access-check tests now pass.
13+
- **BUG-A — `dataverse_merge_records` missing `@odata.type`**: The `updateContent` payload was missing the mandatory `@odata.type` annotation (`application/json;type=entry`), causing the Merge action to reject non-empty update bodies. `@odata.type` is now injected automatically before the OData POST.
14+
- **BUG-024 — `dataverse_create_relationship` lookup prefix**: The auto-generated lookup column name (`referencingEntity + "id"`) incorrectly reused the referencing entity schema name without deriving its publisher prefix. The prefix is now extracted directly from `referencingEntity` (first segment before `_`). Example: `account → new_testcr01` now correctly produces `new_accountid`.
15+
- **BUG-B — `dataverse_merge_records` custom entity error**: Merging custom entities returned an opaque OData stack trace. The tool now catches the unsupported-entity error and returns a clear, actionable message explaining that `Merge` is restricted to OOB entity types (Account, Contact, Lead, Incident).
16+
17+
---
18+
19+
## [0.7.0] — 2026-04-12
20+
21+
### Added
22+
23+
- **`dataverse_create_table`** — Create a new custom entity (table) in Dataverse by POSTing to `/EntityDefinitions`. Accepts schema name, display names, ownership type (`UserOwned` / `OrganizationOwned`), notes, activities, audit flags, and primary name column config. Returns the new `metadataId`.
24+
- **`dataverse_create_relationship`** — Create a One-to-Many or Many-to-Many relationship via `/RelationshipDefinitions`. Supports cascade delete configuration (1:N) and custom intersect entity names (N:N). Returns the new `metadataId`.
25+
- **`dataverse_check_record_access`** — Check which access rights a user or team holds on a specific record using the `RetrievePrincipalAccess` OData function. Returns parsed rights list (`ReadAccess`, `WriteAccess`, etc.).
26+
- **`dataverse_grant_access`** — Grant record-level sharing to a user or team via the `GrantAccess` Dataverse action. Supports all standard AccessMask rights.
27+
- **`dataverse_revoke_access`** — Revoke all shared access from a user or team via the `RevokeAccess` Dataverse action.
28+
- **`dataverse_merge_records`** — Merge two records of the same type via the `Merge` Dataverse action. The subordinate is deactivated and its data carried over to the target. Requires `confirm: true` to prevent accidental execution.
29+
30+
### Internal
31+
32+
- **`src/tools/schema.tools.ts`** — New module with `schemaTools` array and `handleSchemaTool` dispatcher.
33+
- **`src/tools/record-access.tools.ts`** — New module with `recordAccessTools` array and `handleRecordAccessTool` dispatcher.
34+
- **`src/dataverse/dataverse-client.metadata.ts`** — Added `createEntityDefinition(body)` method (POST `/EntityDefinitions`, extracts GUID from `OData-EntityId` response header).
35+
- **`src/tools/router.tools.ts`** — Added tags and descriptions for all 6 new tools.
36+
- **`tests/unit/schema-tools.test.ts`** and **`tests/unit/record-access-tools.test.ts`** — 25 new tests; total test suite: 691.
37+
38+
### Stats
39+
40+
- 79 tools (was 73) · 4 MCP resources · 5 MCP prompts · 27 categories
41+
42+
---
43+
44+
## [0.6.0] — 2026-04-12
45+
46+
### Added
47+
48+
- **MCP Prompts** — 5 pre-built workflow prompts exposed via the MCP `prompts/list` + `prompts/get` protocol endpoints. Clients that support MCP Prompts (Claude, Copilot) can invoke them as slash commands or one-click workflow starters:
49+
- `analyze-org-health` — Complete org health check: identity, table inventory, security roles, workflow health, plugin steps, audit logging.
50+
- `data-quality-check` — Data quality analysis for a table (required arg: `tableName`, optional: `sampleSize`): null rates, duplicates, stale records, referential integrity.
51+
- `schema-review` — Expert schema review for a table (required arg: `tableName`): columns, naming conventions, relationships, alternate keys, views.
52+
- `security-audit` — Security model audit: users, roles, over-privileged accounts, teams, business unit hierarchy.
53+
- `analyze-workflow` — Workflow/flow analysis (optional args: `workflowName`, `statusFilter`): ownership, execution traces, plugin overlap, modernisation candidates.
54+
- **`prompts: {}` capability**`server.ts` now advertises prompt support in the MCP server capabilities block.
55+
56+
### Internal
57+
58+
- **`src/prompts/prompt-provider.ts`** — Prompt catalogue (`PROMPTS` array) + `listPrompts()` / `getPrompt(name, args)` public API. Each builder function renders the step-by-step prompt text with the exact tool names the AI should call.
59+
- **`tests/unit/prompt-provider.test.ts`** — 28 unit tests covering: prompt count, argument definitions, error handling (unknown name, missing required arg), tool name references per prompt, and argument interpolation.
60+
61+
---
62+
863
## [0.5.0] — 2026-03-24
964

1065
### Added

README.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
**The most complete MCP server for Microsoft Dataverse.**
88

9-
73 tools · 4 resources · 10 guided workflows · Three auth modes
9+
79 tools · 4 resources · 10 guided workflows · Three auth modes
1010

1111
[![npm](https://img.shields.io/npm/v/mcp-dataverse)](https://www.npmjs.com/package/mcp-dataverse)
1212
[![npm downloads](https://img.shields.io/npm/dm/mcp-dataverse)](https://www.npmjs.com/package/mcp-dataverse)
@@ -85,6 +85,8 @@ For client credentials and managed identity setup, see [Authentication docs](htt
8585
| **Annotations** | 2 | Notes and file attachments |
8686
| **Customization** | 4 | Custom actions, plugins, env variables, connection references |
8787
| **Attributes** | 4 | Create, update, delete columns; lookup column type |
88+
| **Schema (write)** | 2 | Create custom tables and relationships |
89+
| **Record Access** | 4 | Check, grant, revoke record sharing; merge records |
8890
| **Assistance** | 2 | Tool router, tool tags |
8991
| **+ more** || Delta sync, impersonation, views, business units, duplicate detection |
9092

@@ -142,7 +144,8 @@ MCP Dataverse is designed to be comprehensive, but most AI models work best with
142144
| -------- | ----------------------------------------------------------------- | ----------- |
143145
| **v0.4** | HTTP transport + attribute management + schema consistency | ✅ Released |
144146
| **v0.5** | Enterprise auth (Client Credentials, Managed Identity, Entra JWT) | ✅ Released |
145-
| **v0.6** | MCP Prompts + ERD generator + API snippet generator | 🔜 Planned |
147+
| **v0.6** | MCP Prompts (5 templates) + MCP Resources (4) | ✅ Released |
148+
| **v0.7** | Schema write (create table/relationship) + Record Access (share, merge) | ✅ Released (v0.7.5) |
146149

147150
[→ Full Roadmap](https://codeurali.github.io/mcp-dataverse/roadmap)
148151

0 commit comments

Comments
 (0)