mcp-dataverse 0.2.4 → 0.3.0
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 +35 -25
- package/dist/doctor.d.ts +7 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +103 -0
- package/dist/doctor.js.map +1 -0
- package/dist/http-server.d.ts +3 -0
- package/dist/http-server.d.ts.map +1 -0
- package/dist/http-server.js +61 -0
- package/dist/http-server.js.map +1 -0
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +111 -51
- package/dist/install.js.map +1 -1
- package/dist/server.js +112 -110
- package/dist/server.js.map +1 -1
- package/dist/tools/actions.tools.d.ts +36 -0
- package/dist/tools/actions.tools.d.ts.map +1 -1
- package/dist/tools/actions.tools.js +53 -18
- package/dist/tools/actions.tools.js.map +1 -1
- package/dist/tools/annotations.tools.d.ts +12 -0
- package/dist/tools/annotations.tools.d.ts.map +1 -1
- package/dist/tools/annotations.tools.js +24 -25
- package/dist/tools/annotations.tools.js.map +1 -1
- package/dist/tools/audit.tools.d.ts +6 -0
- package/dist/tools/audit.tools.d.ts.map +1 -1
- package/dist/tools/audit.tools.js +8 -8
- package/dist/tools/audit.tools.js.map +1 -1
- package/dist/tools/auth.tools.d.ts +6 -0
- package/dist/tools/auth.tools.d.ts.map +1 -1
- package/dist/tools/auth.tools.js +17 -13
- package/dist/tools/auth.tools.js.map +1 -1
- package/dist/tools/batch.tools.d.ts +6 -0
- package/dist/tools/batch.tools.d.ts.map +1 -1
- package/dist/tools/batch.tools.js +11 -8
- package/dist/tools/batch.tools.js.map +1 -1
- package/dist/tools/crud.tools.d.ts +36 -0
- package/dist/tools/crud.tools.d.ts.map +1 -1
- package/dist/tools/crud.tools.js +58 -52
- package/dist/tools/crud.tools.js.map +1 -1
- package/dist/tools/customization.tools.d.ts +18 -0
- package/dist/tools/customization.tools.d.ts.map +1 -1
- package/dist/tools/customization.tools.js +27 -29
- package/dist/tools/customization.tools.js.map +1 -1
- package/dist/tools/environment.tools.d.ts +12 -0
- package/dist/tools/environment.tools.d.ts.map +1 -1
- package/dist/tools/environment.tools.js +15 -6
- package/dist/tools/environment.tools.js.map +1 -1
- package/dist/tools/file.tools.d.ts +12 -0
- package/dist/tools/file.tools.d.ts.map +1 -1
- package/dist/tools/file.tools.js +29 -30
- package/dist/tools/file.tools.js.map +1 -1
- package/dist/tools/impersonate.tools.d.ts +6 -0
- package/dist/tools/impersonate.tools.d.ts.map +1 -1
- package/dist/tools/impersonate.tools.js +12 -12
- package/dist/tools/impersonate.tools.js.map +1 -1
- package/dist/tools/metadata.tools.d.ts +42 -0
- package/dist/tools/metadata.tools.d.ts.map +1 -1
- package/dist/tools/metadata.tools.js +92 -47
- package/dist/tools/metadata.tools.js.map +1 -1
- package/dist/tools/org.tools.d.ts +6 -0
- package/dist/tools/org.tools.d.ts.map +1 -1
- package/dist/tools/org.tools.js +10 -8
- package/dist/tools/org.tools.js.map +1 -1
- package/dist/tools/output.utils.d.ts +21 -0
- package/dist/tools/output.utils.d.ts.map +1 -0
- package/dist/tools/output.utils.js +31 -0
- package/dist/tools/output.utils.js.map +1 -0
- package/dist/tools/quality.tools.d.ts +6 -0
- package/dist/tools/quality.tools.d.ts.map +1 -1
- package/dist/tools/quality.tools.js +8 -3
- package/dist/tools/quality.tools.js.map +1 -1
- package/dist/tools/query.tools.d.ts +18 -0
- package/dist/tools/query.tools.d.ts.map +1 -1
- package/dist/tools/query.tools.js +42 -9
- package/dist/tools/query.tools.js.map +1 -1
- package/dist/tools/relations.tools.d.ts +12 -0
- package/dist/tools/relations.tools.d.ts.map +1 -1
- package/dist/tools/relations.tools.js +15 -20
- package/dist/tools/relations.tools.js.map +1 -1
- package/dist/tools/search.tools.d.ts +6 -0
- package/dist/tools/search.tools.d.ts.map +1 -1
- package/dist/tools/search.tools.js +11 -3
- package/dist/tools/search.tools.js.map +1 -1
- package/dist/tools/solution.tools.d.ts +18 -0
- package/dist/tools/solution.tools.d.ts.map +1 -1
- package/dist/tools/solution.tools.js +29 -14
- package/dist/tools/solution.tools.js.map +1 -1
- package/dist/tools/teams.tools.d.ts +6 -0
- package/dist/tools/teams.tools.d.ts.map +1 -1
- package/dist/tools/teams.tools.js +8 -8
- package/dist/tools/teams.tools.js.map +1 -1
- package/dist/tools/tool-registry.d.ts +34 -0
- package/dist/tools/tool-registry.d.ts.map +1 -0
- package/dist/tools/tool-registry.js +31 -0
- package/dist/tools/tool-registry.js.map +1 -0
- package/dist/tools/trace.tools.d.ts +12 -0
- package/dist/tools/trace.tools.d.ts.map +1 -1
- package/dist/tools/trace.tools.js +17 -6
- package/dist/tools/trace.tools.js.map +1 -1
- package/dist/tools/tracking.tools.d.ts +6 -0
- package/dist/tools/tracking.tools.d.ts.map +1 -1
- package/dist/tools/tracking.tools.js +13 -3
- package/dist/tools/tracking.tools.js.map +1 -1
- package/dist/tools/users.tools.d.ts +12 -0
- package/dist/tools/users.tools.d.ts.map +1 -1
- package/dist/tools/users.tools.js +21 -22
- package/dist/tools/users.tools.js.map +1 -1
- package/dist/tools/views.tools.d.ts +6 -0
- package/dist/tools/views.tools.d.ts.map +1 -1
- package/dist/tools/views.tools.js +15 -16
- package/dist/tools/views.tools.js.map +1 -1
- package/dist/transport.d.ts +6 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +21 -0
- package/dist/transport.js.map +1 -0
- package/package.json +2 -1
- package/server.json +2 -2
package/README.md
CHANGED
|
@@ -8,22 +8,33 @@ MCP server that exposes the Microsoft Dataverse Web API as **50 AI-callable tool
|
|
|
8
8
|
|
|
9
9
|
## Install
|
|
10
10
|
|
|
11
|
-
### ✅ Recommended — VS Code
|
|
11
|
+
### ✅ Recommended — Interactive CLI (VS Code 1.99+)
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
```bash
|
|
14
|
+
npx mcp-dataverse install
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
The wizard will:
|
|
18
|
+
|
|
19
|
+
1. Ask for your Dataverse environment URL
|
|
20
|
+
2. Save configuration to `~/.mcp-dataverse/config.json`
|
|
21
|
+
3. Register the server in VS Code and/or VS Code Insiders via `code --add-mcp`
|
|
22
|
+
4. Authenticate with your Microsoft account (device code flow)
|
|
23
|
+
|
|
24
|
+
After the wizard completes, the server is immediately available in VS Code — open Copilot chat and the 50 Dataverse tools are ready.
|
|
25
|
+
|
|
26
|
+
> **Requires VS Code 1.99+** — the CLI registration uses `code --add-mcp`, introduced in March 2025. If neither `code` nor `code-insiders` is on your PATH, the wizard prints a manual snippet to copy-paste. Custom VS Code profiles are also detected and patched automatically.
|
|
27
|
+
|
|
28
|
+
---
|
|
14
29
|
|
|
15
|
-
|
|
16
|
-
2. Press **Ctrl+Shift+P** (or **Cmd+Shift+P** on macOS)
|
|
17
|
-
3. Type **`MCP: Add Server`** and select it
|
|
18
|
-
4. Choose **`NPM Package`**
|
|
19
|
-
5. Enter the package name: **`mcp-dataverse`**
|
|
20
|
-
6. Choose the scope: **User** (available in all workspaces) or **Workspace** (current project only)
|
|
30
|
+
### Alternative — VS Code Command Palette
|
|
21
31
|
|
|
22
|
-
|
|
32
|
+
1. Press **Ctrl+Shift+P** (or **Cmd+Shift+P** on macOS)
|
|
33
|
+
2. Type **`MCP: Add Server`** → choose **`NPM Package`** → enter **`mcp-dataverse`**
|
|
34
|
+
3. Choose the scope: **User** or **Workspace**
|
|
35
|
+
4. Edit the generated entry to add your environment URL:
|
|
23
36
|
|
|
24
37
|
```jsonc
|
|
25
|
-
// ~/.config/Code/User/mcp.json (User scope)
|
|
26
|
-
// or .vscode/mcp.json (Workspace scope)
|
|
27
38
|
{
|
|
28
39
|
"servers": {
|
|
29
40
|
"mcp-dataverse": {
|
|
@@ -31,33 +42,31 @@ VS Code will create or update `mcp.json` automatically. Then **edit the generate
|
|
|
31
42
|
"command": "npx",
|
|
32
43
|
"args": ["-y", "mcp-dataverse"],
|
|
33
44
|
"env": {
|
|
34
|
-
"
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
45
|
+
"MCP_CONFIG_PATH": "/path/to/.mcp-dataverse/config.json"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
38
49
|
}
|
|
39
50
|
```
|
|
40
51
|
|
|
41
|
-
Replace `https://yourorg.crm.dynamics.com` with your actual Dataverse environment URL.
|
|
42
|
-
|
|
43
52
|
---
|
|
44
53
|
|
|
45
54
|
### Manual (mcp.json)
|
|
46
55
|
|
|
47
|
-
Create or edit `.vscode/mcp.json`
|
|
56
|
+
Create or edit `.vscode/mcp.json` (workspace scope) or the user-level `mcp.json` (**Ctrl+Shift+P** → **MCP: Open User Configuration**):
|
|
48
57
|
|
|
49
58
|
```jsonc
|
|
50
59
|
{
|
|
51
60
|
"servers": {
|
|
52
|
-
"dataverse": {
|
|
61
|
+
"mcp-dataverse": {
|
|
53
62
|
"type": "stdio",
|
|
54
63
|
"command": "npx",
|
|
55
64
|
"args": ["-y", "mcp-dataverse"],
|
|
56
65
|
"env": {
|
|
57
|
-
"
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
66
|
+
"MCP_CONFIG_PATH": "/path/to/.mcp-dataverse/config.json"
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
61
70
|
}
|
|
62
71
|
```
|
|
63
72
|
|
|
@@ -313,5 +322,6 @@ GitHub Copilot → stdio → MCP Server → Tool Router → DataverseClient →
|
|
|
313
322
|
| Browser didn't open automatically | Copy the URL from the Output panel manually: `https://microsoft.com/devicelogin` |
|
|
314
323
|
| `No MSAL accounts found` | Run `npx mcp-dataverse-auth` to re-authenticate, then restart the server |
|
|
315
324
|
| `Authentication timed out` | The 5-minute window expired — restart the MCP server to get a new code |
|
|
316
|
-
| `"https://" is required` | Check
|
|
317
|
-
| Server not appearing in Copilot Agent mode |
|
|
325
|
+
| `"https://" is required` | Check your `~/.mcp-dataverse/config.json` — URL must start with `https://` |
|
|
326
|
+
| Server not appearing in Copilot Agent mode | Re-run `npx mcp-dataverse install`; check **Output → MCP** panel for errors |
|
|
327
|
+
| Install wizard says "not found on PATH" | Install VS Code Shell Command (**Ctrl+Shift+P** → *Shell Command: Install...*) or use the manual snippet provided |
|
package/dist/doctor.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAyG/C"}
|
package/dist/doctor.js
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Diagnostic CLI command for mcp-dataverse.
|
|
4
|
+
* Usage: npx mcp-dataverse doctor
|
|
5
|
+
*/
|
|
6
|
+
export async function runDoctor() {
|
|
7
|
+
const out = (msg) => process.stdout.write(msg + "\n");
|
|
8
|
+
const ok = (msg) => out(` ✅ ${msg}`);
|
|
9
|
+
const fail = (msg) => out(` ❌ ${msg}`);
|
|
10
|
+
out("");
|
|
11
|
+
out("🏥 mcp-dataverse doctor");
|
|
12
|
+
out("─".repeat(50));
|
|
13
|
+
out("");
|
|
14
|
+
let allPassed = true;
|
|
15
|
+
// 1. Node.js version check
|
|
16
|
+
out("📋 Environment");
|
|
17
|
+
const nodeVersion = process.version;
|
|
18
|
+
const major = parseInt(nodeVersion.slice(1).split(".")[0], 10);
|
|
19
|
+
if (major >= 20) {
|
|
20
|
+
ok(`Node.js ${nodeVersion}`);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
fail(`Node.js ${nodeVersion} — requires v20+`);
|
|
24
|
+
allPassed = false;
|
|
25
|
+
}
|
|
26
|
+
out("");
|
|
27
|
+
// 2. Configuration check
|
|
28
|
+
out("⚙️ Configuration");
|
|
29
|
+
try {
|
|
30
|
+
const { loadConfig } = await import("./config/config.loader.js");
|
|
31
|
+
const config = loadConfig();
|
|
32
|
+
ok(`Environment URL: ${config.environmentUrl}`);
|
|
33
|
+
ok(`Timeout: ${config.requestTimeoutMs}ms, Retries: ${config.maxRetries}`);
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
37
|
+
fail(`Configuration error: ${msg}`);
|
|
38
|
+
allPassed = false;
|
|
39
|
+
// Can't proceed without config
|
|
40
|
+
out("");
|
|
41
|
+
out(allPassed ? "✅ All checks passed!" : "❌ Some checks failed.");
|
|
42
|
+
process.exit(allPassed ? 0 : 1);
|
|
43
|
+
}
|
|
44
|
+
out("");
|
|
45
|
+
// 3. Authentication check
|
|
46
|
+
out("🔑 Authentication");
|
|
47
|
+
try {
|
|
48
|
+
const { loadConfig } = await import("./config/config.loader.js");
|
|
49
|
+
const config = loadConfig();
|
|
50
|
+
const { createAuthProvider } = await import("./auth/auth-provider.factory.js");
|
|
51
|
+
const authProvider = createAuthProvider(config);
|
|
52
|
+
const token = await authProvider.getToken();
|
|
53
|
+
if (token) {
|
|
54
|
+
ok("Token acquired successfully");
|
|
55
|
+
const parts = token.split(".");
|
|
56
|
+
if (parts.length === 3) {
|
|
57
|
+
ok("Valid JWT token format");
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
fail("No token returned");
|
|
62
|
+
allPassed = false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
67
|
+
fail(`Auth failed: ${msg}`);
|
|
68
|
+
allPassed = false;
|
|
69
|
+
}
|
|
70
|
+
out("");
|
|
71
|
+
// 4. API Connectivity (WhoAmI)
|
|
72
|
+
out("🌐 Dataverse API");
|
|
73
|
+
try {
|
|
74
|
+
const { loadConfig } = await import("./config/config.loader.js");
|
|
75
|
+
const config = loadConfig();
|
|
76
|
+
const { createAuthProvider } = await import("./auth/auth-provider.factory.js");
|
|
77
|
+
const { DataverseAdvancedClient } = await import("./dataverse/dataverse-client-advanced.js");
|
|
78
|
+
const authProvider = createAuthProvider(config);
|
|
79
|
+
const client = new DataverseAdvancedClient(authProvider, config.maxRetries, config.requestTimeoutMs);
|
|
80
|
+
const result = await client.whoAmI();
|
|
81
|
+
ok(`Organization: ${result.OrganizationName || "N/A"}`);
|
|
82
|
+
ok(`User ID: ${result.UserId || "N/A"}`);
|
|
83
|
+
ok(`Business Unit: ${result.BusinessUnitId || "N/A"}`);
|
|
84
|
+
ok(`Environment: ${result.EnvironmentUrl || config.environmentUrl}`);
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
88
|
+
fail(`API call failed: ${msg}`);
|
|
89
|
+
allPassed = false;
|
|
90
|
+
}
|
|
91
|
+
out("");
|
|
92
|
+
// Summary
|
|
93
|
+
out("─".repeat(50));
|
|
94
|
+
if (allPassed) {
|
|
95
|
+
out("✅ All checks passed! Your mcp-dataverse setup is healthy.");
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
out("❌ Some checks failed. Review the errors above.");
|
|
99
|
+
}
|
|
100
|
+
out("");
|
|
101
|
+
process.exit(allPassed ? 0 : 1);
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAInE,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CA2Ef"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { createServer } from "http";
|
|
2
|
+
import { randomUUID } from "crypto";
|
|
3
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
4
|
+
export async function startHttpTransport(server, port, version, toolCount) {
|
|
5
|
+
const transport = new StreamableHTTPServerTransport({
|
|
6
|
+
sessionIdGenerator: () => randomUUID(),
|
|
7
|
+
enableJsonResponse: true,
|
|
8
|
+
});
|
|
9
|
+
await server.connect(transport);
|
|
10
|
+
const httpServer = createServer(async (req, res) => {
|
|
11
|
+
// CORS headers for browser-based clients
|
|
12
|
+
res.setHeader("Access-Control-Allow-Origin", "*");
|
|
13
|
+
res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS");
|
|
14
|
+
res.setHeader("Access-Control-Allow-Headers", "Content-Type, mcp-session-id");
|
|
15
|
+
if (req.method === "OPTIONS") {
|
|
16
|
+
res.writeHead(204);
|
|
17
|
+
res.end();
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const url = new URL(req.url ?? "/", `http://localhost:${port}`);
|
|
21
|
+
if (url.pathname === "/health" && req.method === "GET") {
|
|
22
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
23
|
+
res.end(JSON.stringify({ status: "ok", version, tools: toolCount }));
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (url.pathname === "/mcp") {
|
|
27
|
+
try {
|
|
28
|
+
await transport.handleRequest(req, res);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
if (!res.headersSent) {
|
|
32
|
+
res.writeHead(500, { "Content-Type": "application/json" });
|
|
33
|
+
res.end(JSON.stringify({ error: "Internal server error" }));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
res.writeHead(404, { "Content-Type": "application/json" });
|
|
39
|
+
res.end(JSON.stringify({ error: "Not found" }));
|
|
40
|
+
});
|
|
41
|
+
await new Promise((resolve) => {
|
|
42
|
+
httpServer.listen(port, () => {
|
|
43
|
+
process.stderr.write(`MCP Dataverse HTTP server listening on http://localhost:${port}/mcp\n`);
|
|
44
|
+
resolve();
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
// Keep the process alive; clean shutdown on signals
|
|
48
|
+
const shutdown = async () => {
|
|
49
|
+
process.stderr.write("Shutting down HTTP server...\n");
|
|
50
|
+
await transport.close();
|
|
51
|
+
httpServer.close();
|
|
52
|
+
process.exit(0);
|
|
53
|
+
};
|
|
54
|
+
process.on("SIGINT", shutdown);
|
|
55
|
+
process.on("SIGTERM", shutdown);
|
|
56
|
+
// Block until server closes
|
|
57
|
+
await new Promise((resolve) => {
|
|
58
|
+
httpServer.on("close", resolve);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=http-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-server.js","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}
|
package/dist/install.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":";AAyJA,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CA6FhD"}
|
package/dist/install.js
CHANGED
|
@@ -6,13 +6,14 @@
|
|
|
6
6
|
* Steps:
|
|
7
7
|
* 1. Prompt for Dataverse environment URL
|
|
8
8
|
* 2. Save config to ~/.mcp-dataverse/config.json
|
|
9
|
-
* 3. Register the server in VS Code
|
|
9
|
+
* 3. Register the server in VS Code via `code --add-mcp` CLI
|
|
10
10
|
* 4. Authenticate via Microsoft device code flow
|
|
11
11
|
*/
|
|
12
12
|
import { createInterface } from "readline/promises";
|
|
13
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
13
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "fs";
|
|
14
|
+
import { execFileSync } from "child_process";
|
|
14
15
|
import { homedir } from "os";
|
|
15
|
-
import {
|
|
16
|
+
import { join } from "path";
|
|
16
17
|
import { DeviceCodeAuthProvider } from "./auth/device-code-auth-provider.js";
|
|
17
18
|
// ── Constants ─────────────────────────────────────────────────────────────────
|
|
18
19
|
const CACHE_DIR = join(homedir(), ".mcp-dataverse");
|
|
@@ -20,56 +21,100 @@ const CONFIG_FILE = join(CACHE_DIR, "config.json");
|
|
|
20
21
|
// ── Output helpers ─────────────────────────────────────────────────────────────
|
|
21
22
|
const out = (msg) => process.stdout.write(msg + "\n");
|
|
22
23
|
const hr = () => process.stdout.write("─".repeat(58) + "\n");
|
|
23
|
-
// ── VS Code mcp
|
|
24
|
+
// ── VS Code CLI registration via --add-mcp ─────────────────────────────────────
|
|
25
|
+
function registerViaCodeCli(configFilePath) {
|
|
26
|
+
const serverDef = JSON.stringify({
|
|
27
|
+
name: "mcp-dataverse",
|
|
28
|
+
type: "stdio",
|
|
29
|
+
command: "npx",
|
|
30
|
+
args: ["-y", "mcp-dataverse"],
|
|
31
|
+
env: { MCP_CONFIG_PATH: configFilePath },
|
|
32
|
+
});
|
|
33
|
+
const clis = [
|
|
34
|
+
{ label: "VS Code Insiders", bin: "code-insiders" },
|
|
35
|
+
{ label: "VS Code Stable", bin: "code" },
|
|
36
|
+
];
|
|
37
|
+
const results = [];
|
|
38
|
+
for (const { label, bin } of clis) {
|
|
39
|
+
try {
|
|
40
|
+
// On Windows, VS Code CLI is a .cmd batch file — execFileSync can't run
|
|
41
|
+
// .cmd directly, so we go through cmd.exe /c.
|
|
42
|
+
const args = process.platform === "win32"
|
|
43
|
+
? ["/c", bin, "--add-mcp", serverDef]
|
|
44
|
+
: ["--add-mcp", serverDef];
|
|
45
|
+
const exe = process.platform === "win32" ? "cmd.exe" : bin;
|
|
46
|
+
execFileSync(exe, args, { stdio: "pipe", timeout: 15_000 });
|
|
47
|
+
results.push({ label, ok: true });
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
results.push({ label, ok: false });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return results;
|
|
54
|
+
}
|
|
55
|
+
// ── Patch custom VS Code profiles ──────────────────────────────────────────────
|
|
56
|
+
// `--add-mcp` only writes to the default profile. If the user runs VS Code with
|
|
57
|
+
// a custom profile, that profile has its own mcp.json that we need to patch too.
|
|
24
58
|
function getVSCodeUserDirs() {
|
|
25
59
|
const home = homedir();
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
60
|
+
switch (process.platform) {
|
|
61
|
+
case "win32": {
|
|
62
|
+
const appData = process.env.APPDATA ?? join(home, "AppData", "Roaming");
|
|
63
|
+
return [
|
|
64
|
+
{ label: "VS Code Insiders", dir: join(appData, "Code - Insiders", "User") },
|
|
65
|
+
{ label: "VS Code Stable", dir: join(appData, "Code", "User") },
|
|
66
|
+
];
|
|
67
|
+
}
|
|
68
|
+
case "darwin":
|
|
69
|
+
return [
|
|
70
|
+
{ label: "VS Code Insiders", dir: join(home, "Library", "Application Support", "Code - Insiders", "User") },
|
|
71
|
+
{ label: "VS Code Stable", dir: join(home, "Library", "Application Support", "Code", "User") },
|
|
72
|
+
];
|
|
73
|
+
default:
|
|
74
|
+
return [
|
|
75
|
+
{ label: "VS Code Insiders", dir: join(home, ".config", "Code - Insiders", "User") },
|
|
76
|
+
{ label: "VS Code Stable", dir: join(home, ".config", "Code", "User") },
|
|
77
|
+
];
|
|
39
78
|
}
|
|
40
|
-
const base = join(home, ".config");
|
|
41
|
-
return [
|
|
42
|
-
{ label: "VS Code Insiders", mcpJson: join(base, "Code - Insiders", "User", "mcp.json") },
|
|
43
|
-
{ label: "VS Code Stable", mcpJson: join(base, "Code", "User", "mcp.json") },
|
|
44
|
-
];
|
|
45
79
|
}
|
|
46
|
-
|
|
47
|
-
function patchVSCodeMcpJson(configFilePath) {
|
|
48
|
-
const updated = [];
|
|
80
|
+
function patchProfileConfigs(configFilePath) {
|
|
49
81
|
const serverEntry = {
|
|
50
82
|
type: "stdio",
|
|
51
83
|
command: "npx",
|
|
52
84
|
args: ["-y", "mcp-dataverse"],
|
|
53
85
|
env: { MCP_CONFIG_PATH: configFilePath },
|
|
54
86
|
};
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
87
|
+
const patched = [];
|
|
88
|
+
for (const { dir } of getVSCodeUserDirs()) {
|
|
89
|
+
const profilesDir = join(dir, "profiles");
|
|
90
|
+
if (!existsSync(profilesDir))
|
|
58
91
|
continue;
|
|
59
|
-
let
|
|
60
|
-
|
|
92
|
+
let entries;
|
|
93
|
+
try {
|
|
94
|
+
entries = readdirSync(profilesDir);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
for (const profile of entries) {
|
|
100
|
+
const mcpPath = join(profilesDir, profile, "mcp.json");
|
|
101
|
+
if (!existsSync(mcpPath))
|
|
102
|
+
continue;
|
|
61
103
|
try {
|
|
62
|
-
|
|
104
|
+
const raw = readFileSync(mcpPath, "utf-8");
|
|
105
|
+
const json = JSON.parse(raw);
|
|
106
|
+
if (!json.servers)
|
|
107
|
+
json.servers = {};
|
|
108
|
+
json.servers["mcp-dataverse"] = serverEntry;
|
|
109
|
+
writeFileSync(mcpPath, JSON.stringify(json, null, "\t") + "\n", "utf-8");
|
|
110
|
+
patched.push(mcpPath);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// skip malformed files
|
|
63
114
|
}
|
|
64
|
-
catch { /* start fresh */ }
|
|
65
115
|
}
|
|
66
|
-
if (!data["servers"] || typeof data["servers"] !== "object")
|
|
67
|
-
data["servers"] = {};
|
|
68
|
-
data["servers"]["mcp-dataverse"] = serverEntry;
|
|
69
|
-
writeFileSync(mcpJson, JSON.stringify(data, null, 2) + "\n", "utf-8");
|
|
70
|
-
updated.push({ label, path: mcpJson });
|
|
71
116
|
}
|
|
72
|
-
return
|
|
117
|
+
return patched;
|
|
73
118
|
}
|
|
74
119
|
// ── URL validation ─────────────────────────────────────────────────────────────
|
|
75
120
|
function isValidDataverseUrl(raw) {
|
|
@@ -87,7 +132,7 @@ function isValidDataverseUrl(raw) {
|
|
|
87
132
|
}
|
|
88
133
|
// ── Manual mcp.json snippet ────────────────────────────────────────────────────
|
|
89
134
|
function printManualSnippet(configFilePath) {
|
|
90
|
-
out(" Add this to your VS Code
|
|
135
|
+
out(" Add this to your VS Code mcp.json (Ctrl+Shift+P → MCP: Open User Configuration):");
|
|
91
136
|
out("");
|
|
92
137
|
out(' "mcp-dataverse": {');
|
|
93
138
|
out(' "type": "stdio",');
|
|
@@ -106,7 +151,7 @@ export async function runInstall() {
|
|
|
106
151
|
out("This wizard will:");
|
|
107
152
|
out(" 1. Ask for your Dataverse environment URL");
|
|
108
153
|
out(" 2. Save configuration to ~/.mcp-dataverse/config.json");
|
|
109
|
-
out(" 3. Register the server in VS Code
|
|
154
|
+
out(" 3. Register the server in VS Code via CLI");
|
|
110
155
|
out(" 4. Authenticate with your Microsoft account");
|
|
111
156
|
out("");
|
|
112
157
|
hr();
|
|
@@ -130,18 +175,28 @@ export async function runInstall() {
|
|
|
130
175
|
writeFileSync(CONFIG_FILE, JSON.stringify({ environmentUrl }, null, 2) + "\n", "utf-8");
|
|
131
176
|
out(` ✓ ${CONFIG_FILE}`);
|
|
132
177
|
out("");
|
|
133
|
-
// ── Step 3:
|
|
178
|
+
// ── Step 3: Register in VS Code via --add-mcp CLI ────────────────────────────
|
|
134
179
|
out("Registering in VS Code…");
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
180
|
+
const results = registerViaCodeCli(CONFIG_FILE);
|
|
181
|
+
const registered = results.filter((r) => r.ok);
|
|
182
|
+
if (registered.length > 0) {
|
|
183
|
+
for (const { label } of registered)
|
|
184
|
+
out(` ✓ ${label}: registered via --add-mcp`);
|
|
185
|
+
const skipped = results.filter((r) => !r.ok);
|
|
186
|
+
for (const { label } of skipped)
|
|
187
|
+
out(` – ${label}: not found on PATH (skipped)`);
|
|
139
188
|
}
|
|
140
189
|
else {
|
|
141
|
-
out("
|
|
190
|
+
out(" ⚠ Neither 'code' nor 'code-insiders' found on PATH.");
|
|
191
|
+
out(" Register manually:");
|
|
142
192
|
out("");
|
|
143
193
|
printManualSnippet(CONFIG_FILE);
|
|
144
194
|
}
|
|
195
|
+
// Also patch any custom VS Code profiles (--add-mcp only covers the default)
|
|
196
|
+
const profilePatches = patchProfileConfigs(CONFIG_FILE);
|
|
197
|
+
if (profilePatches.length > 0) {
|
|
198
|
+
out(` + Patched ${profilePatches.length} custom profile(s)`);
|
|
199
|
+
}
|
|
145
200
|
out("");
|
|
146
201
|
hr();
|
|
147
202
|
// ── Step 4: Authenticate ─────────────────────────────────────────────────────
|
|
@@ -155,9 +210,14 @@ export async function runInstall() {
|
|
|
155
210
|
out("");
|
|
156
211
|
out(" ✓ Setup complete!");
|
|
157
212
|
out("");
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
213
|
+
if (registered.length > 0) {
|
|
214
|
+
out(" The MCP server is now registered in VS Code.");
|
|
215
|
+
out(" Open VS Code → Copilot chat → the 50 Dataverse tools are ready to use.");
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
out(" Configuration and authentication are ready.");
|
|
219
|
+
out(" Register the server manually (see snippet above), then restart VS Code.");
|
|
220
|
+
}
|
|
161
221
|
out("");
|
|
162
222
|
}
|
|
163
223
|
catch (err) {
|
|
@@ -165,8 +225,8 @@ export async function runInstall() {
|
|
|
165
225
|
hr();
|
|
166
226
|
out(` ✗ Authentication failed: ${msg}`);
|
|
167
227
|
out("");
|
|
168
|
-
out(" Configuration was saved. Authenticate later
|
|
169
|
-
out(
|
|
228
|
+
out(" Configuration was saved. Authenticate later by restarting the MCP server —");
|
|
229
|
+
out(" it will prompt for device code on startup.");
|
|
170
230
|
out("");
|
|
171
231
|
process.exit(1);
|
|
172
232
|
}
|
package/dist/install.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|