mcp-dataverse 0.1.6 → 0.1.8

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
@@ -10,9 +10,23 @@ MCP server that exposes the Microsoft Dataverse Web API as **50 AI-callable tool
10
10
 
11
11
  ### One-click (VS Code)
12
12
 
13
- [Install in VS Code](https://insiders.vscode.dev/redirect?url=vscode-insiders%3Amcp%2Finstall%3F%257B%2522name%2522%253A%2522mcp-dataverse%2522%252C%2522command%2522%253A%2522npx%2522%252C%2522args%2522%253A%255B%2522-y%2522%252C%2522mcp-dataverse%2522%255D%257D)
13
+ [![Install in VS Code](https://img.shields.io/badge/VS%20Code-Install-0078d4?logo=visualstudiocode)](https://vscode.dev/redirect/mcp/install?name=mcp-dataverse&config=%7B%22args%22%3A%5B%22-y%22%2C%22mcp-dataverse%22%5D%2C%22type%22%3A%22stdio%22%2C%22command%22%3A%22npx%22%2C%22env%22%3A%7B%22DATAVERSE_ENV_URL%22%3A%22%24%7Binput%3Adataverse_env_url%7D%22%2C%22AUTH_MODE%22%3A%22%24%7Binput%3Adataverse_auth_mode%7D%22%2C%22PAC_PROFILE_NAME%22%3A%22%24%7Binput%3Adataverse_pac_profile%7D%22%7D%7D&inputs=%5B%7B%22id%22%3A%22dataverse_env_url%22%2C%22password%22%3Afalse%2C%22type%22%3A%22promptString%22%2C%22description%22%3A%22Dataverse%20URL%20%28e.g.%20https%3A%2F%2Fyourorg.crm.dynamics.com%29%22%7D%2C%7B%22default%22%3A%22pac%22%2C%22id%22%3A%22dataverse_auth_mode%22%2C%22password%22%3Afalse%2C%22type%22%3A%22promptString%22%2C%22description%22%3A%22Auth%20mode%3A%20pac%20%28default%29%20or%20msal%22%7D%2C%7B%22default%22%3A%22default%22%2C%22id%22%3A%22dataverse_pac_profile%22%2C%22password%22%3Afalse%2C%22type%22%3A%22promptString%22%2C%22description%22%3A%22PAC%20CLI%20profile%20name%20%28default%3A%20default%29%22%7D%5D) [![Install in VS Code Insiders](https://img.shields.io/badge/VS%20Code%20Insiders-Install-24bfa5?logo=visualstudiocode)](https://insiders.vscode.dev/redirect/mcp/install?name=mcp-dataverse&config=%7B%22args%22%3A%5B%22-y%22%2C%22mcp-dataverse%22%5D%2C%22type%22%3A%22stdio%22%2C%22command%22%3A%22npx%22%2C%22env%22%3A%7B%22DATAVERSE_ENV_URL%22%3A%22%24%7Binput%3Adataverse_env_url%7D%22%2C%22AUTH_MODE%22%3A%22%24%7Binput%3Adataverse_auth_mode%7D%22%2C%22PAC_PROFILE_NAME%22%3A%22%24%7Binput%3Adataverse_pac_profile%7D%22%7D%7D&inputs=%5B%7B%22id%22%3A%22dataverse_env_url%22%2C%22password%22%3Afalse%2C%22type%22%3A%22promptString%22%2C%22description%22%3A%22Dataverse%20URL%20%28e.g.%20https%3A%2F%2Fyourorg.crm.dynamics.com%29%22%7D%2C%7B%22default%22%3A%22pac%22%2C%22id%22%3A%22dataverse_auth_mode%22%2C%22password%22%3Afalse%2C%22type%22%3A%22promptString%22%2C%22description%22%3A%22Auth%20mode%3A%20pac%20%28default%29%20or%20msal%22%7D%2C%7B%22default%22%3A%22default%22%2C%22id%22%3A%22dataverse_pac_profile%22%2C%22password%22%3Afalse%2C%22type%22%3A%22promptString%22%2C%22description%22%3A%22PAC%20CLI%20profile%20name%20%28default%3A%20default%29%22%7D%5D)
14
14
 
15
- ### Manual (npx)
15
+ > VS Code will prompt for your Dataverse URL, auth mode, and PAC profile during installation.
16
+
17
+ ### Command line
18
+
19
+ ```bash
20
+ # VS Code
21
+ code --add-mcp '{"name":"dataverse","type":"stdio","command":"npx","args":["-y","mcp-dataverse"],"env":{"DATAVERSE_ENV_URL":"https://yourorg.crm.dynamics.com","AUTH_MODE":"pac"}}'
22
+
23
+ # VS Code Insiders
24
+ code-insiders --add-mcp '{"name":"dataverse","type":"stdio","command":"npx","args":["-y","mcp-dataverse"],"env":{"DATAVERSE_ENV_URL":"https://yourorg.crm.dynamics.com","AUTH_MODE":"pac"}}'
25
+ ```
26
+
27
+ > Replace `https://yourorg.crm.dynamics.com` with your actual Dataverse environment URL.
28
+
29
+ ### Manual (mcp.json)
16
30
 
17
31
  Add to your `.vscode/mcp.json` (or user settings):
18
32
 
@@ -22,7 +36,11 @@ Add to your `.vscode/mcp.json` (or user settings):
22
36
  "dataverse": {
23
37
  "type": "stdio",
24
38
  "command": "npx",
25
- "args": ["-y", "mcp-dataverse"]
39
+ "args": ["-y", "mcp-dataverse"],
40
+ "env": {
41
+ "DATAVERSE_ENV_URL": "https://yourorg.crm.dynamics.com",
42
+ "AUTH_MODE": "pac"
43
+ }
26
44
  }
27
45
  }
28
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.loader.d.ts","sourceRoot":"","sources":["../../src/config/config.loader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAI/D,wBAAgB,UAAU,IAAI,MAAM,CAoDnC"}
1
+ {"version":3,"file":"config.loader.d.ts","sourceRoot":"","sources":["../../src/config/config.loader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAI/D,wBAAgB,UAAU,IAAI,MAAM,CAuDnC"}
@@ -3,8 +3,8 @@ import { join } from "path";
3
3
  import { ConfigSchema } from "./config.schema.js";
4
4
  const CONFIG_FILE_NAME = "config.json";
5
5
  export function loadConfig() {
6
- // Priority: env vars > config.json > defaults
7
- const configPath = join(process.cwd(), CONFIG_FILE_NAME);
6
+ // Priority: env vars > MCP_CONFIG_PATH file > cwd/config.json > defaults
7
+ const configPath = process.env["MCP_CONFIG_PATH"] ?? join(process.cwd(), CONFIG_FILE_NAME);
8
8
  let rawConfig = {};
9
9
  if (existsSync(configPath)) {
10
10
  const fileContent = readFileSync(configPath, "utf-8");
@@ -12,34 +12,36 @@ export function loadConfig() {
12
12
  rawConfig = JSON.parse(fileContent);
13
13
  }
14
14
  catch {
15
- throw new Error(`Invalid JSON in ${CONFIG_FILE_NAME}. Check for syntax errors (trailing commas, missing quotes).`);
15
+ throw new Error(`Invalid JSON in ${configPath}. Check for syntax errors (trailing commas, missing quotes).`);
16
16
  }
17
17
  }
18
- // Override with env vars if present
19
- if (process.env["DATAVERSE_ENV_URL"]) {
20
- rawConfig["environmentUrl"] = process.env["DATAVERSE_ENV_URL"];
21
- }
22
- if (process.env["AUTH_MODE"]) {
23
- rawConfig["authMode"] = process.env["AUTH_MODE"];
24
- }
25
- if (process.env["PAC_PROFILE_NAME"]) {
26
- rawConfig["pacProfileName"] = process.env["PAC_PROFILE_NAME"];
27
- }
28
- if (process.env["TENANT_ID"]) {
29
- rawConfig["tenantId"] = process.env["TENANT_ID"];
30
- }
31
- if (process.env["CLIENT_ID"]) {
32
- rawConfig["clientId"] = process.env["CLIENT_ID"];
33
- }
34
- if (process.env["CLIENT_SECRET"]) {
35
- rawConfig["clientSecret"] = process.env["CLIENT_SECRET"];
36
- }
37
- if (process.env["REQUEST_TIMEOUT_MS"]) {
38
- rawConfig["requestTimeoutMs"] = Number(process.env["REQUEST_TIMEOUT_MS"]);
39
- }
40
- if (process.env["MAX_RETRIES"]) {
41
- rawConfig["maxRetries"] = Number(process.env["MAX_RETRIES"]);
42
- }
18
+ // Override with env vars if present.
19
+ // Accepts both SCREAMING_SNAKE_CASE (documented, server.json) and camelCase
20
+ // (generated by VS Code when it reads config.example.json from the npm package).
21
+ const envUrl = process.env["DATAVERSE_ENV_URL"] ?? process.env["environmentUrl"];
22
+ if (envUrl)
23
+ rawConfig["environmentUrl"] = envUrl;
24
+ const authMode = process.env["AUTH_MODE"] ?? process.env["authMode"];
25
+ if (authMode)
26
+ rawConfig["authMode"] = authMode;
27
+ const pacProfile = process.env["PAC_PROFILE_NAME"] ?? process.env["pacProfileName"];
28
+ if (pacProfile)
29
+ rawConfig["pacProfileName"] = pacProfile;
30
+ const tenantId = process.env["TENANT_ID"] ?? process.env["tenantId"];
31
+ if (tenantId)
32
+ rawConfig["tenantId"] = tenantId;
33
+ const clientId = process.env["CLIENT_ID"] ?? process.env["clientId"];
34
+ if (clientId)
35
+ rawConfig["clientId"] = clientId;
36
+ const clientSecret = process.env["CLIENT_SECRET"] ?? process.env["clientSecret"];
37
+ if (clientSecret)
38
+ rawConfig["clientSecret"] = clientSecret;
39
+ const timeoutMs = process.env["REQUEST_TIMEOUT_MS"] ?? process.env["requestTimeoutMs"];
40
+ if (timeoutMs)
41
+ rawConfig["requestTimeoutMs"] = Number(timeoutMs);
42
+ const maxRetries = process.env["MAX_RETRIES"] ?? process.env["maxRetries"];
43
+ if (maxRetries)
44
+ rawConfig["maxRetries"] = Number(maxRetries);
43
45
  const result = ConfigSchema.safeParse(rawConfig);
44
46
  if (!result.success) {
45
47
  throw new Error(`Invalid configuration:\n${result.error.issues.map((i) => ` - ${i.path.join(".")}: ${i.message}`).join("\n")}`);
@@ -1 +1 @@
1
- {"version":3,"file":"config.loader.js","sourceRoot":"","sources":["../../src/config/config.loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.loader.js","sourceRoot":"","sources":["../../src/config/config.loader.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-dataverse",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "MCP Server for Microsoft Dataverse Web API",
5
5
  "type": "module",
6
6
  "main": "dist/server.js",
@@ -26,8 +26,6 @@
26
26
  },
27
27
  "files": [
28
28
  "dist/**",
29
- "config.example.json",
30
- ".env.example",
31
29
  "README.md",
32
30
  "LICENSE",
33
31
  "CAPABILITIES.md",
package/server.json CHANGED
@@ -7,7 +7,7 @@
7
7
  {
8
8
  "src": "https://raw.githubusercontent.com/codeurali/mcp-dataverse/master/assets/logo.webp",
9
9
  "mimeType": "image/webp",
10
- "sizes": "any"
10
+ "sizes": ["any"]
11
11
  }
12
12
  ],
13
13
  "websiteUrl": "https://www.npmjs.com/package/mcp-dataverse",
@@ -15,22 +15,28 @@
15
15
  "url": "https://github.com/codeurali/mcp-dataverse",
16
16
  "source": "github"
17
17
  },
18
- "version": "0.1.6",
19
- "packages": [
18
+ "version": "0.1.8",
20
19
  {
21
20
  "registryType": "npm",
22
21
  "registryBaseUrl": "https://registry.npmjs.org",
23
22
  "identifier": "mcp-dataverse",
24
- "version": "0.1.6",
25
- "transport": {
23
+ "version": "0.1.8", {
26
24
  "type": "stdio"
27
25
  },
28
26
  "environmentVariables": [
27
+ {
28
+ "name": "MCP_CONFIG_PATH",
29
+ "description": "Path to a config.json file (overrides all other env vars). Recommended for VS Code / Claude Desktop setups.",
30
+ "placeholder": "/path/to/config.json",
31
+ "isRequired": false,
32
+ "format": "string",
33
+ "isSecret": false
34
+ },
29
35
  {
30
36
  "name": "DATAVERSE_ENV_URL",
31
37
  "description": "Your Dataverse environment URL",
32
38
  "placeholder": "https://yourorg.crm.dynamics.com",
33
- "isRequired": true,
39
+ "isRequired": false,
34
40
  "format": "string",
35
41
  "isSecret": false
36
42
  },
package/.env.example DELETED
@@ -1,15 +0,0 @@
1
- # MCP Dataverse Configuration
2
- # Set these environment variables (or use config.json for local dev)
3
-
4
- DATAVERSE_ENV_URL=https://yourorg.crm.dynamics.com
5
- AUTH_MODE=pac
6
- PAC_PROFILE_NAME=default
7
-
8
- # MSAL client credentials (required if AUTH_MODE=msal)
9
- TENANT_ID=
10
- CLIENT_ID=
11
- CLIENT_SECRET=
12
-
13
- # Tuning (optional)
14
- # REQUEST_TIMEOUT_MS=30000
15
- # MAX_RETRIES=3
@@ -1,10 +0,0 @@
1
- {
2
- "environmentUrl": "https://yourorg.crm.dynamics.com",
3
- "authMode": "pac",
4
- "pacProfileName": "default",
5
- "tenantId": "",
6
- "clientId": "",
7
- "clientSecret": "",
8
- "requestTimeoutMs": 30000,
9
- "maxRetries": 3
10
- }