mcp-dataverse 0.2.0 → 0.2.1

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/README.md CHANGED
@@ -63,33 +63,6 @@ Create or edit `.vscode/mcp.json` in your project (workspace scope) or the user-
63
63
 
64
64
  ---
65
65
 
66
- ### Command line (`code --add-mcp`)
67
-
68
- > ⚠️ **PowerShell on Windows**: The single-quote JSON syntax is broken in PowerShell 5.1 (double quotes get stripped). Use one of the workarounds below.
69
-
70
- **Bash / Git Bash / macOS / Linux:**
71
-
72
- ```bash
73
- code --add-mcp '{"name":"dataverse","type":"stdio","command":"npx","args":["-y","mcp-dataverse"],"env":{"DATAVERSE_ENV_URL":"https://yourorg.crm.dynamics.com"}}'
74
- ```
75
-
76
- **PowerShell (Windows) — use escaped quotes:**
77
-
78
- ```powershell
79
- code --add-mcp '{\"name\":\"dataverse\",\"type\":\"stdio\",\"command\":\"npx\",\"args\":[\"-y\",\"mcp-dataverse\"],\"env\":{\"DATAVERSE_ENV_URL\":\"https://yourorg.crm.dynamics.com\"}}'
80
- ```
81
-
82
- **PowerShell — alternative using a variable:**
83
-
84
- ```powershell
85
- $cfg = '{"name":"dataverse","type":"stdio","command":"npx","args":["-y","mcp-dataverse"],"env":{"DATAVERSE_ENV_URL":"https://yourorg.crm.dynamics.com"}}'
86
- code --add-mcp $cfg
87
- ```
88
-
89
- Replace `https://yourorg.crm.dynamics.com` with your actual Dataverse environment URL.
90
-
91
- ---
92
-
93
66
  ## Authentication — automatic, no setup required
94
67
 
95
68
  **No PAC CLI, no Azure AD app registration, no credentials to configure.**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-dataverse",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "MCP Server for Microsoft Dataverse Web API",
5
5
  "type": "module",
6
6
  "main": "dist/server.js",
@@ -38,7 +38,8 @@
38
38
  "publish:npm": "node scripts/publish.mjs --npm",
39
39
  "publish:mcp": "node scripts/publish.mjs --mcp",
40
40
  "publish:dry": "node scripts/publish.mjs --dry",
41
- "build": "tsc",
41
+ "clean": "node -e \"const {rmSync}=require('fs'); try{rmSync('dist',{recursive:true})}catch{}\"",
42
+ "build": "npm run clean && tsc",
42
43
  "dev": "tsx watch src/server.ts",
43
44
  "start": "node dist/server.js",
44
45
  "auth:setup": "node dist/setup-auth.js",
@@ -1,14 +0,0 @@
1
- import type { AuthProvider } from "./auth-provider.interface.js";
2
- import type { Config } from "../config/config.schema.js";
3
- export declare class MsalAuthProvider implements AuthProvider {
4
- readonly environmentUrl: string;
5
- private readonly msalApp;
6
- private readonly scope;
7
- private cachedToken;
8
- private tokenExpiresAt;
9
- constructor(config: Config);
10
- getToken(): Promise<string>;
11
- invalidateToken(): void;
12
- isAuthenticated(): Promise<boolean>;
13
- }
14
- //# sourceMappingURL=msal-auth-provider.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"msal-auth-provider.d.ts","sourceRoot":"","sources":["../../src/auth/msal-auth-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEzD,qBAAa,gBAAiB,YAAW,YAAY;IACnD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IACxD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,cAAc,CAAqB;gBAE/B,MAAM,EAAE,MAAM;IAgCpB,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IA6BjC,eAAe,IAAI,IAAI;IAKjB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;CAQ1C"}
@@ -1,64 +0,0 @@
1
- import { ConfidentialClientApplication } from "@azure/msal-node";
2
- export class MsalAuthProvider {
3
- environmentUrl;
4
- msalApp;
5
- scope;
6
- cachedToken = null;
7
- tokenExpiresAt = null;
8
- constructor(config) {
9
- this.environmentUrl = config.environmentUrl;
10
- if (!config.tenantId) {
11
- throw new Error("MsalAuthProvider requires config.tenantId for client_credentials flow");
12
- }
13
- if (!config.clientId) {
14
- throw new Error("MsalAuthProvider requires config.clientId for client_credentials flow");
15
- }
16
- if (!config.clientSecret) {
17
- throw new Error("MsalAuthProvider requires config.clientSecret for client_credentials flow");
18
- }
19
- this.msalApp = new ConfidentialClientApplication({
20
- auth: {
21
- clientId: config.clientId,
22
- clientSecret: config.clientSecret,
23
- authority: `https://login.microsoftonline.com/${config.tenantId}`,
24
- },
25
- });
26
- // Scope for Dataverse client_credentials: <environmentUrl>/.default
27
- const baseUrl = config.environmentUrl.replace(/\/$/, "");
28
- this.scope = `${baseUrl}/.default`;
29
- }
30
- async getToken() {
31
- // Return cached token if still valid (60-second buffer before expiry)
32
- if (this.cachedToken !== null &&
33
- this.tokenExpiresAt !== null &&
34
- new Date() < this.tokenExpiresAt) {
35
- return this.cachedToken;
36
- }
37
- const result = await this.msalApp.acquireTokenByClientCredential({
38
- scopes: [this.scope],
39
- });
40
- if (result === null || !result.accessToken) {
41
- throw new Error("MSAL: acquireTokenByClientCredential returned no access token");
42
- }
43
- this.cachedToken = result.accessToken;
44
- // Subtract 60 seconds from expiry to avoid using a token that is about to expire
45
- this.tokenExpiresAt = result.expiresOn
46
- ? new Date(result.expiresOn.getTime() - 60_000)
47
- : new Date(Date.now() + 3_540_000); // fallback: 59 minutes
48
- return this.cachedToken;
49
- }
50
- invalidateToken() {
51
- this.cachedToken = null;
52
- this.tokenExpiresAt = null;
53
- }
54
- async isAuthenticated() {
55
- try {
56
- await this.getToken();
57
- return true;
58
- }
59
- catch {
60
- return false;
61
- }
62
- }
63
- }
64
- //# sourceMappingURL=msal-auth-provider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"msal-auth-provider.js","sourceRoot":"","sources":["../../src/auth/msal-auth-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AAIjE,MAAM,OAAO,gBAAgB;IAClB,cAAc,CAAS;IACf,OAAO,CAAgC;IACvC,KAAK,CAAS;IACvB,WAAW,GAAkB,IAAI,CAAC;IAClC,cAAc,GAAgB,IAAI,CAAC;IAE3C,YAAY,MAAc;QACxB,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;QAE5C,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CACb,uEAAuE,CACxE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CACb,uEAAuE,CACxE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,6BAA6B,CAAC;YAC/C,IAAI,EAAE;gBACJ,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,SAAS,EAAE,qCAAqC,MAAM,CAAC,QAAQ,EAAE;aAClE;SACF,CAAC,CAAC;QAEH,oEAAoE;QACpE,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,GAAG,GAAG,OAAO,WAAW,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,sEAAsE;QACtE,IACE,IAAI,CAAC,WAAW,KAAK,IAAI;YACzB,IAAI,CAAC,cAAc,KAAK,IAAI;YAC5B,IAAI,IAAI,EAAE,GAAG,IAAI,CAAC,cAAc,EAChC,CAAC;YACD,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,8BAA8B,CAAC;YAC/D,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;SACrB,CAAC,CAAC;QAEH,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,iFAAiF;QACjF,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,SAAS;YACpC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC;YAC/C,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,uBAAuB;QAE7D,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,eAAe;QACb,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
@@ -1,18 +0,0 @@
1
- import type { AuthProvider } from "./auth-provider.interface.js";
2
- export declare class PacAuthProvider implements AuthProvider {
3
- readonly environmentUrl: string;
4
- private readonly pca;
5
- private cachedToken;
6
- private tokenExpiresAt;
7
- private pendingAuth;
8
- constructor(environmentUrl: string);
9
- getToken(): Promise<string>;
10
- invalidateToken(): void;
11
- isAuthenticated(): Promise<boolean>;
12
- setupViaDeviceCode(): Promise<void>;
13
- private refreshToken;
14
- private acquireSilently;
15
- private runDeviceCodeFlow;
16
- private cacheResult;
17
- }
18
- //# sourceMappingURL=pac-auth-provider.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pac-auth-provider.d.ts","sourceRoot":"","sources":["../../src/auth/pac-auth-provider.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAsEjE,qBAAa,eAAgB,YAAW,YAAY;IAClD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA0B;IAC9C,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,WAAW,CAAgC;gBAEvC,cAAc,EAAE,MAAM;IAQ5B,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAQjC,eAAe,IAAI,IAAI;IAEjB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAInC,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;YAE3B,YAAY;YAsBZ,eAAe;YASf,iBAAiB;IAqB/B,OAAO,CAAC,WAAW;CAIpB"}
@@ -1,172 +0,0 @@
1
- import { PublicClientApplication, } from "@azure/msal-node";
2
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
3
- import { homedir } from "os";
4
- import { join } from "path";
5
- import { exec } from "child_process";
6
- import { platform } from "process";
7
- import { createCipheriv, createDecipheriv, createHash, randomBytes, } from "crypto";
8
- function openBrowser(url) {
9
- const cmd = platform === "win32" ? `start "" "${url}"`
10
- : platform === "darwin" ? `open "${url}"`
11
- : `xdg-open "${url}"`;
12
- exec(cmd, () => { });
13
- }
14
- function copyToClipboard(text) {
15
- const cmd = platform === "win32" ? `echo|set /p="${text}"| clip`
16
- : platform === "darwin" ? `printf '%s' '${text}' | pbcopy`
17
- : `printf '%s' '${text}' | xclip -selection clipboard 2>/dev/null || printf '%s' '${text}' | xsel --clipboard 2>/dev/null`;
18
- exec(cmd, () => { });
19
- }
20
- const PLATFORM_CLIENT_ID = "1950a258-227b-4e31-a9cf-717495945fc2";
21
- const CACHE_DIR = join(homedir(), ".mcp-dataverse");
22
- const TOKEN_CACHE_FILE = join(CACHE_DIR, "msal-cache.json");
23
- const DEVICE_CODE_TIMEOUT_MS = 5 * 60 * 1000;
24
- function getDerivedKey() {
25
- const seed = [
26
- process.env["COMPUTERNAME"] ?? process.env["HOSTNAME"] ?? "",
27
- process.env["USERNAME"] ?? process.env["USER"] ?? "",
28
- "mcp-dataverse-cache-v1",
29
- ].join(".");
30
- return createHash("sha256").update(seed).digest();
31
- }
32
- function encryptForDisk(plaintext) {
33
- const key = getDerivedKey();
34
- const iv = randomBytes(16);
35
- const cipher = createCipheriv("aes-256-gcm", key, iv);
36
- const encrypted = Buffer.concat([cipher.update(plaintext, "utf-8"), cipher.final()]);
37
- return JSON.stringify({ v: 1, iv: iv.toString("hex"), tag: cipher.getAuthTag().toString("hex"), d: encrypted.toString("hex") });
38
- }
39
- function decryptFromDisk(raw) {
40
- const parsed = JSON.parse(raw);
41
- if (parsed["v"] !== 1)
42
- throw new Error("Unknown cache format version");
43
- const iv = Buffer.from(parsed["iv"], "hex");
44
- const tag = Buffer.from(parsed["tag"], "hex");
45
- const encrypted = Buffer.from(parsed["d"], "hex");
46
- const decipher = createDecipheriv("aes-256-gcm", getDerivedKey(), iv);
47
- decipher.setAuthTag(tag);
48
- return decipher.update(encrypted).toString("utf-8") + decipher.final("utf-8");
49
- }
50
- function createCachePlugin() {
51
- return {
52
- beforeCacheAccess: async (cacheContext) => {
53
- if (existsSync(TOKEN_CACHE_FILE)) {
54
- try {
55
- const raw = readFileSync(TOKEN_CACHE_FILE, "utf-8");
56
- let serialized;
57
- try {
58
- serialized = decryptFromDisk(raw);
59
- }
60
- catch {
61
- serialized = raw;
62
- }
63
- cacheContext.tokenCache.deserialize(serialized);
64
- }
65
- catch { /* corrupt cache — re-auth automatically */ }
66
- }
67
- },
68
- afterCacheAccess: async (cacheContext) => {
69
- if (cacheContext.cacheHasChanged) {
70
- mkdirSync(CACHE_DIR, { recursive: true });
71
- writeFileSync(TOKEN_CACHE_FILE, encryptForDisk(cacheContext.tokenCache.serialize()), { encoding: "utf-8", mode: 0o600 });
72
- }
73
- },
74
- };
75
- }
76
- export class PacAuthProvider {
77
- environmentUrl;
78
- pca;
79
- cachedToken = null;
80
- tokenExpiresAt = 0;
81
- pendingAuth = null;
82
- constructor(environmentUrl) {
83
- this.environmentUrl = environmentUrl.replace(/\/$/, "");
84
- this.pca = new PublicClientApplication({
85
- auth: { clientId: PLATFORM_CLIENT_ID, authority: "https://login.microsoftonline.com/common" },
86
- cache: { cachePlugin: createCachePlugin() },
87
- });
88
- }
89
- async getToken() {
90
- const now = Date.now();
91
- if (this.cachedToken !== null && this.tokenExpiresAt > now + 60_000)
92
- return this.cachedToken;
93
- if (this.pendingAuth !== null)
94
- return this.pendingAuth;
95
- this.pendingAuth = this.refreshToken().finally(() => { this.pendingAuth = null; });
96
- return this.pendingAuth;
97
- }
98
- invalidateToken() { this.cachedToken = null; this.tokenExpiresAt = 0; }
99
- async isAuthenticated() {
100
- try {
101
- await this.getToken();
102
- return true;
103
- }
104
- catch {
105
- return false;
106
- }
107
- }
108
- async setupViaDeviceCode() { await this.runDeviceCodeFlow(); }
109
- async refreshToken() {
110
- const accounts = await this.pca.getAllAccounts();
111
- if (accounts.length === 0) {
112
- process.stderr.write("\n[mcp-dataverse] First-time authentication required.\n" + `Environment: ${this.environmentUrl}\n` + "Open the URL below in your browser to sign in.\n\n");
113
- try {
114
- await this.runDeviceCodeFlow();
115
- return await this.acquireSilently();
116
- }
117
- catch (err) {
118
- const detail = err instanceof Error ? err.message : String(err);
119
- throw new Error(`Authentication setup failed: ${detail}\n\nYou can also authenticate manually:\n npx mcp-dataverse-auth ${this.environmentUrl}\nThen restart the MCP server in VS Code.`);
120
- }
121
- }
122
- try {
123
- return await this.acquireSilently();
124
- }
125
- catch {
126
- process.stderr.write("\n[mcp-dataverse] Session expired — re-authenticating.\nOpen the URL below in your browser to sign in again.\n\n");
127
- try {
128
- await this.runDeviceCodeFlow();
129
- return await this.acquireSilently();
130
- }
131
- catch (err) {
132
- this.cachedToken = null;
133
- const detail = err instanceof Error ? err.message : String(err);
134
- throw new Error(`Re-authentication failed: ${detail}\n\nTo authenticate manually:\n npx mcp-dataverse-auth ${this.environmentUrl}\nThen restart the MCP server in VS Code.`);
135
- }
136
- }
137
- }
138
- async acquireSilently() {
139
- const accounts = await this.pca.getAllAccounts();
140
- if (accounts.length === 0)
141
- throw new Error("No account found in cache after authentication.");
142
- const result = await this.pca.acquireTokenSilent({ scopes: [`${this.environmentUrl}/.default`], account: accounts[0] });
143
- if (!result?.accessToken)
144
- throw new Error("Token acquisition returned an empty access token.");
145
- this.cacheResult(result);
146
- return result.accessToken;
147
- }
148
- async runDeviceCodeFlow() {
149
- const result = await Promise.race([
150
- this.pca.acquireTokenByDeviceCode({
151
- scopes: [`${this.environmentUrl}/.default`],
152
- deviceCodeCallback: (response) => {
153
- process.stderr.write(`\n[mcp-dataverse] Sign in required\n` +
154
- `Code: ${response.userCode}\n` +
155
- `URL: ${response.verificationUri}\n` +
156
- `\n→ Browser opened automatically. Paste the code and sign in.\n` +
157
- ` (code copied to clipboard)\n\n`);
158
- copyToClipboard(response.userCode);
159
- openBrowser(response.verificationUri);
160
- },
161
- }),
162
- new Promise((_, reject) => setTimeout(() => reject(new Error("Authentication timed out after 5 minutes. Please try again.")), DEVICE_CODE_TIMEOUT_MS)),
163
- ]);
164
- if (result)
165
- this.cacheResult(result);
166
- }
167
- cacheResult(result) {
168
- this.cachedToken = result.accessToken;
169
- this.tokenExpiresAt = result.expiresOn?.getTime() ?? Date.now() + 55 * 60 * 1000;
170
- }
171
- }
172
- //# sourceMappingURL=pac-auth-provider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pac-auth-provider.js","sourceRoot":"","sources":["../../src/auth/pac-auth-provider.ts"],"names":[],"mappings":"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"}