mcp-dataverse 0.3.7 → 0.3.9
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/CAPABILITIES.md +1039 -1039
- package/LICENSE +21 -21
- package/README.md +114 -113
- package/dist/auth-provider.factory-MSMLSOX3.js +1 -0
- package/dist/chunk-24RDOMG4.js +29 -0
- package/dist/chunk-OXKMMPM3.js +37 -0
- package/dist/chunk-PAX4NW5B.js +1 -0
- package/dist/chunk-SUDI4JM6.js +3 -0
- package/dist/config.loader-VTIKUDN7.js +1 -0
- package/dist/dataverse-client-advanced-T5ZJMRLK.js +1 -0
- package/dist/doctor.js +2 -102
- package/dist/http-server.js +3 -61
- package/dist/install.js +8 -233
- package/dist/server.js +43 -202
- package/dist/setup-auth.js +18 -41
- package/package.json +95 -94
- package/server.json +51 -50
- package/dist/auth/auth-provider.factory.d.ts +0 -4
- package/dist/auth/auth-provider.factory.d.ts.map +0 -1
- package/dist/auth/auth-provider.factory.js +0 -5
- package/dist/auth/auth-provider.factory.js.map +0 -1
- package/dist/auth/auth-provider.interface.d.ts +0 -21
- package/dist/auth/auth-provider.interface.d.ts.map +0 -1
- package/dist/auth/auth-provider.interface.js +0 -2
- package/dist/auth/auth-provider.interface.js.map +0 -1
- package/dist/auth/device-code-auth-provider.d.ts +0 -18
- package/dist/auth/device-code-auth-provider.d.ts.map +0 -1
- package/dist/auth/device-code-auth-provider.js +0 -167
- package/dist/auth/device-code-auth-provider.js.map +0 -1
- package/dist/config/config.loader.d.ts +0 -3
- package/dist/config/config.loader.d.ts.map +0 -1
- package/dist/config/config.loader.js +0 -39
- package/dist/config/config.loader.js.map +0 -1
- package/dist/config/config.schema.d.ts +0 -16
- package/dist/config/config.schema.d.ts.map +0 -1
- package/dist/config/config.schema.js +0 -20
- package/dist/config/config.schema.js.map +0 -1
- package/dist/dataverse/dataverse-client-advanced.d.ts +0 -53
- package/dist/dataverse/dataverse-client-advanced.d.ts.map +0 -1
- package/dist/dataverse/dataverse-client-advanced.js +0 -199
- package/dist/dataverse/dataverse-client-advanced.js.map +0 -1
- package/dist/dataverse/dataverse-client.actions.d.ts +0 -11
- package/dist/dataverse/dataverse-client.actions.d.ts.map +0 -1
- package/dist/dataverse/dataverse-client.actions.js +0 -25
- package/dist/dataverse/dataverse-client.actions.js.map +0 -1
- package/dist/dataverse/dataverse-client.batch.d.ts +0 -10
- package/dist/dataverse/dataverse-client.batch.d.ts.map +0 -1
- package/dist/dataverse/dataverse-client.batch.js +0 -74
- package/dist/dataverse/dataverse-client.batch.js.map +0 -1
- package/dist/dataverse/dataverse-client.d.ts +0 -46
- package/dist/dataverse/dataverse-client.d.ts.map +0 -1
- package/dist/dataverse/dataverse-client.js +0 -275
- package/dist/dataverse/dataverse-client.js.map +0 -1
- package/dist/dataverse/dataverse-client.metadata.d.ts +0 -41
- package/dist/dataverse/dataverse-client.metadata.d.ts.map +0 -1
- package/dist/dataverse/dataverse-client.metadata.js +0 -124
- package/dist/dataverse/dataverse-client.metadata.js.map +0 -1
- package/dist/dataverse/dataverse-client.utils.d.ts +0 -14
- package/dist/dataverse/dataverse-client.utils.d.ts.map +0 -1
- package/dist/dataverse/dataverse-client.utils.js +0 -65
- package/dist/dataverse/dataverse-client.utils.js.map +0 -1
- package/dist/dataverse/http-client.d.ts +0 -38
- package/dist/dataverse/http-client.d.ts.map +0 -1
- package/dist/dataverse/http-client.js +0 -111
- package/dist/dataverse/http-client.js.map +0 -1
- package/dist/dataverse/types.d.ts +0 -68
- package/dist/dataverse/types.d.ts.map +0 -1
- package/dist/dataverse/types.js +0 -2
- package/dist/dataverse/types.js.map +0 -1
- package/dist/doctor.d.ts +0 -7
- package/dist/doctor.d.ts.map +0 -1
- package/dist/doctor.js.map +0 -1
- package/dist/http-server.d.ts +0 -3
- package/dist/http-server.d.ts.map +0 -1
- package/dist/http-server.js.map +0 -1
- package/dist/install.d.ts +0 -3
- package/dist/install.d.ts.map +0 -1
- package/dist/install.js.map +0 -1
- package/dist/resources/resource-provider.d.ts +0 -11
- package/dist/resources/resource-provider.d.ts.map +0 -1
- package/dist/resources/resource-provider.js +0 -79
- package/dist/resources/resource-provider.js.map +0 -1
- package/dist/server.d.ts +0 -3
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js.map +0 -1
- package/dist/setup-auth.d.ts +0 -3
- package/dist/setup-auth.d.ts.map +0 -1
- package/dist/setup-auth.js.map +0 -1
- package/dist/tools/actions.tools.d.ts +0 -206
- package/dist/tools/actions.tools.d.ts.map +0 -1
- package/dist/tools/actions.tools.js +0 -256
- package/dist/tools/actions.tools.js.map +0 -1
- package/dist/tools/annotations.tools.d.ts +0 -94
- package/dist/tools/annotations.tools.d.ts.map +0 -1
- package/dist/tools/annotations.tools.js +0 -225
- package/dist/tools/annotations.tools.js.map +0 -1
- package/dist/tools/audit.tools.d.ts +0 -51
- package/dist/tools/audit.tools.d.ts.map +0 -1
- package/dist/tools/audit.tools.js +0 -170
- package/dist/tools/audit.tools.js.map +0 -1
- package/dist/tools/auth.tools.d.ts +0 -23
- package/dist/tools/auth.tools.d.ts.map +0 -1
- package/dist/tools/auth.tools.js +0 -36
- package/dist/tools/auth.tools.js.map +0 -1
- package/dist/tools/batch.tools.d.ts +0 -52
- package/dist/tools/batch.tools.d.ts.map +0 -1
- package/dist/tools/batch.tools.js +0 -89
- package/dist/tools/batch.tools.js.map +0 -1
- package/dist/tools/crud.tools.d.ts +0 -260
- package/dist/tools/crud.tools.d.ts.map +0 -1
- package/dist/tools/crud.tools.js +0 -290
- package/dist/tools/crud.tools.js.map +0 -1
- package/dist/tools/customization.tools.d.ts +0 -127
- package/dist/tools/customization.tools.d.ts.map +0 -1
- package/dist/tools/customization.tools.js +0 -285
- package/dist/tools/customization.tools.js.map +0 -1
- package/dist/tools/environment.tools.d.ts +0 -106
- package/dist/tools/environment.tools.d.ts.map +0 -1
- package/dist/tools/environment.tools.js +0 -274
- package/dist/tools/environment.tools.js.map +0 -1
- package/dist/tools/file.tools.d.ts +0 -73
- package/dist/tools/file.tools.d.ts.map +0 -1
- package/dist/tools/file.tools.js +0 -160
- package/dist/tools/file.tools.js.map +0 -1
- package/dist/tools/guardrails.d.ts +0 -22
- package/dist/tools/guardrails.d.ts.map +0 -1
- package/dist/tools/guardrails.js +0 -56
- package/dist/tools/guardrails.js.map +0 -1
- package/dist/tools/impersonate.tools.d.ts +0 -44
- package/dist/tools/impersonate.tools.d.ts.map +0 -1
- package/dist/tools/impersonate.tools.js +0 -87
- package/dist/tools/impersonate.tools.js.map +0 -1
- package/dist/tools/metadata.tools.d.ts +0 -279
- package/dist/tools/metadata.tools.d.ts.map +0 -1
- package/dist/tools/metadata.tools.js +0 -400
- package/dist/tools/metadata.tools.js.map +0 -1
- package/dist/tools/org.tools.d.ts +0 -32
- package/dist/tools/org.tools.d.ts.map +0 -1
- package/dist/tools/org.tools.js +0 -65
- package/dist/tools/org.tools.js.map +0 -1
- package/dist/tools/output.utils.d.ts +0 -63
- package/dist/tools/output.utils.d.ts.map +0 -1
- package/dist/tools/output.utils.js +0 -78
- package/dist/tools/output.utils.js.map +0 -1
- package/dist/tools/progress.d.ts +0 -15
- package/dist/tools/progress.d.ts.map +0 -1
- package/dist/tools/progress.js +0 -29
- package/dist/tools/progress.js.map +0 -1
- package/dist/tools/quality.tools.d.ts +0 -36
- package/dist/tools/quality.tools.d.ts.map +0 -1
- package/dist/tools/quality.tools.js +0 -97
- package/dist/tools/quality.tools.js.map +0 -1
- package/dist/tools/query.tools.d.ts +0 -151
- package/dist/tools/query.tools.d.ts.map +0 -1
- package/dist/tools/query.tools.js +0 -293
- package/dist/tools/query.tools.js.map +0 -1
- package/dist/tools/relations.tools.d.ts +0 -77
- package/dist/tools/relations.tools.d.ts.map +0 -1
- package/dist/tools/relations.tools.js +0 -96
- package/dist/tools/relations.tools.js.map +0 -1
- package/dist/tools/router.tools.d.ts +0 -5
- package/dist/tools/router.tools.d.ts.map +0 -1
- package/dist/tools/router.tools.js +0 -247
- package/dist/tools/router.tools.js.map +0 -1
- package/dist/tools/search.tools.d.ts +0 -74
- package/dist/tools/search.tools.d.ts.map +0 -1
- package/dist/tools/search.tools.js +0 -142
- package/dist/tools/search.tools.js.map +0 -1
- package/dist/tools/solution.tools.d.ts +0 -113
- package/dist/tools/solution.tools.d.ts.map +0 -1
- package/dist/tools/solution.tools.js +0 -176
- package/dist/tools/solution.tools.js.map +0 -1
- package/dist/tools/teams.tools.d.ts +0 -65
- package/dist/tools/teams.tools.d.ts.map +0 -1
- package/dist/tools/teams.tools.js +0 -127
- package/dist/tools/teams.tools.js.map +0 -1
- package/dist/tools/tool-registry.d.ts +0 -35
- package/dist/tools/tool-registry.d.ts.map +0 -1
- package/dist/tools/tool-registry.js +0 -31
- package/dist/tools/tool-registry.js.map +0 -1
- package/dist/tools/trace.tools.d.ts +0 -75
- package/dist/tools/trace.tools.d.ts.map +0 -1
- package/dist/tools/trace.tools.js +0 -233
- package/dist/tools/trace.tools.js.map +0 -1
- package/dist/tools/tracking.tools.d.ts +0 -41
- package/dist/tools/tracking.tools.d.ts.map +0 -1
- package/dist/tools/tracking.tools.js +0 -76
- package/dist/tools/tracking.tools.js.map +0 -1
- package/dist/tools/users.tools.d.ts +0 -141
- package/dist/tools/users.tools.d.ts.map +0 -1
- package/dist/tools/users.tools.js +0 -321
- package/dist/tools/users.tools.js.map +0 -1
- package/dist/tools/validation.utils.d.ts +0 -6
- package/dist/tools/validation.utils.d.ts.map +0 -1
- package/dist/tools/validation.utils.js +0 -14
- package/dist/tools/validation.utils.js.map +0 -1
- package/dist/tools/views.tools.d.ts +0 -36
- package/dist/tools/views.tools.d.ts.map +0 -1
- package/dist/tools/views.tools.js +0 -92
- package/dist/tools/views.tools.js.map +0 -1
- package/dist/tools/workflow.tools.d.ts +0 -111
- package/dist/tools/workflow.tools.d.ts.map +0 -1
- package/dist/tools/workflow.tools.js +0 -449
- package/dist/tools/workflow.tools.js.map +0 -1
- package/dist/transport.d.ts +0 -6
- package/dist/transport.d.ts.map +0 -1
- package/dist/transport.js +0 -21
- package/dist/transport.js.map +0 -1
package/dist/install.js
CHANGED
|
@@ -1,234 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
* 4. Authenticate via Microsoft device code flow
|
|
11
|
-
*/
|
|
12
|
-
import { createInterface } from "readline/promises";
|
|
13
|
-
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "fs";
|
|
14
|
-
import { execFileSync } from "child_process";
|
|
15
|
-
import { homedir } from "os";
|
|
16
|
-
import { join } from "path";
|
|
17
|
-
import { DeviceCodeAuthProvider } from "./auth/device-code-auth-provider.js";
|
|
18
|
-
// ── Constants ─────────────────────────────────────────────────────────────────
|
|
19
|
-
const CACHE_DIR = join(homedir(), ".mcp-dataverse");
|
|
20
|
-
const CONFIG_FILE = join(CACHE_DIR, "config.json");
|
|
21
|
-
// ── Output helpers ─────────────────────────────────────────────────────────────
|
|
22
|
-
const out = (msg) => process.stdout.write(msg + "\n");
|
|
23
|
-
const hr = () => process.stdout.write("─".repeat(58) + "\n");
|
|
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.
|
|
58
|
-
function getVSCodeUserDirs() {
|
|
59
|
-
const home = homedir();
|
|
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
|
-
];
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
function patchProfileConfigs(configFilePath) {
|
|
81
|
-
const serverEntry = {
|
|
82
|
-
type: "stdio",
|
|
83
|
-
command: "npx",
|
|
84
|
-
args: ["-y", "mcp-dataverse"],
|
|
85
|
-
env: { MCP_CONFIG_PATH: configFilePath },
|
|
86
|
-
};
|
|
87
|
-
const patched = [];
|
|
88
|
-
for (const { dir } of getVSCodeUserDirs()) {
|
|
89
|
-
const profilesDir = join(dir, "profiles");
|
|
90
|
-
if (!existsSync(profilesDir))
|
|
91
|
-
continue;
|
|
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;
|
|
103
|
-
try {
|
|
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
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
return patched;
|
|
118
|
-
}
|
|
119
|
-
// ── URL validation ─────────────────────────────────────────────────────────────
|
|
120
|
-
function isValidDataverseUrl(raw) {
|
|
121
|
-
if (!raw.startsWith("https://"))
|
|
122
|
-
return "URL must start with https://";
|
|
123
|
-
try {
|
|
124
|
-
const hostname = new URL(raw).hostname.toLowerCase();
|
|
125
|
-
if (!hostname.endsWith(".dynamics.com"))
|
|
126
|
-
return "Must be a *.dynamics.com URL (your Power Platform environment)";
|
|
127
|
-
}
|
|
128
|
-
catch {
|
|
129
|
-
return "Invalid URL format";
|
|
130
|
-
}
|
|
131
|
-
return null;
|
|
132
|
-
}
|
|
133
|
-
// ── Manual mcp.json snippet ────────────────────────────────────────────────────
|
|
134
|
-
function printManualSnippet(configFilePath) {
|
|
135
|
-
out(" Add this to your VS Code mcp.json (Ctrl+Shift+P → MCP: Open User Configuration):");
|
|
136
|
-
out("");
|
|
137
|
-
out(' "mcp-dataverse": {');
|
|
138
|
-
out(' "type": "stdio",');
|
|
139
|
-
out(' "command": "npx",');
|
|
140
|
-
out(' "args": ["-y", "mcp-dataverse"],');
|
|
141
|
-
out(` "env": { "MCP_CONFIG_PATH": "${configFilePath.replace(/\\/g, "\\\\")}" }`);
|
|
142
|
-
out(" }");
|
|
143
|
-
}
|
|
144
|
-
// ── Main export ────────────────────────────────────────────────────────────────
|
|
145
|
-
export async function runInstall() {
|
|
146
|
-
out("");
|
|
147
|
-
out("╔════════════════════════════════════════════════════════╗");
|
|
148
|
-
out("║ MCP Dataverse — Interactive Setup ║");
|
|
149
|
-
out("╚════════════════════════════════════════════════════════╝");
|
|
150
|
-
out("");
|
|
151
|
-
out("This wizard will:");
|
|
152
|
-
out(" 1. Ask for your Dataverse environment URL");
|
|
153
|
-
out(" 2. Save configuration to ~/.mcp-dataverse/config.json");
|
|
154
|
-
out(" 3. Register the server in VS Code via CLI");
|
|
155
|
-
out(" 4. Authenticate with your Microsoft account");
|
|
156
|
-
out("");
|
|
157
|
-
hr();
|
|
158
|
-
// ── Step 1: Prompt for environment URL ──────────────────────────────────────
|
|
159
|
-
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
160
|
-
let environmentUrl = "";
|
|
161
|
-
while (!environmentUrl) {
|
|
162
|
-
const raw = (await rl.question("Dataverse environment URL\n e.g. https://contoso.crm.dynamics.com\n› ")).trim().replace(/\/$/, "");
|
|
163
|
-
const error = isValidDataverseUrl(raw);
|
|
164
|
-
if (error) {
|
|
165
|
-
out(` ✗ ${error}\n`);
|
|
166
|
-
continue;
|
|
167
|
-
}
|
|
168
|
-
environmentUrl = raw;
|
|
169
|
-
}
|
|
170
|
-
rl.close();
|
|
171
|
-
out("");
|
|
172
|
-
// ── Step 2: Write config ─────────────────────────────────────────────────────
|
|
173
|
-
out("Saving configuration…");
|
|
174
|
-
mkdirSync(CACHE_DIR, { recursive: true });
|
|
175
|
-
writeFileSync(CONFIG_FILE, JSON.stringify({ environmentUrl }, null, 2) + "\n", "utf-8");
|
|
176
|
-
out(` ✓ ${CONFIG_FILE}`);
|
|
177
|
-
out("");
|
|
178
|
-
// ── Step 3: Register in VS Code via --add-mcp CLI ────────────────────────────
|
|
179
|
-
out("Registering in VS Code…");
|
|
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)`);
|
|
188
|
-
}
|
|
189
|
-
else {
|
|
190
|
-
out(" ⚠ Neither 'code' nor 'code-insiders' found on PATH.");
|
|
191
|
-
out(" Register manually:");
|
|
192
|
-
out("");
|
|
193
|
-
printManualSnippet(CONFIG_FILE);
|
|
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
|
-
}
|
|
200
|
-
out("");
|
|
201
|
-
hr();
|
|
202
|
-
// ── Step 4: Authenticate ─────────────────────────────────────────────────────
|
|
203
|
-
out("Authenticating with Microsoft…");
|
|
204
|
-
out("(A prompt will appear below — open the URL and enter the code)");
|
|
205
|
-
out("");
|
|
206
|
-
try {
|
|
207
|
-
const auth = new DeviceCodeAuthProvider(environmentUrl);
|
|
208
|
-
await auth.setupViaDeviceCode();
|
|
209
|
-
hr();
|
|
210
|
-
out("");
|
|
211
|
-
out(" ✓ Setup complete!");
|
|
212
|
-
out("");
|
|
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
|
-
}
|
|
221
|
-
out("");
|
|
222
|
-
}
|
|
223
|
-
catch (err) {
|
|
224
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
225
|
-
hr();
|
|
226
|
-
out(` ✗ Authentication failed: ${msg}`);
|
|
227
|
-
out("");
|
|
228
|
-
out(" Configuration was saved. Authenticate later by restarting the MCP server —");
|
|
229
|
-
out(" it will prompt for device code on startup.");
|
|
230
|
-
out("");
|
|
231
|
-
process.exit(1);
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
//# sourceMappingURL=install.js.map
|
|
2
|
+
import{a as f}from"./chunk-24RDOMG4.js";import{createInterface as S}from"readline/promises";import{existsSync as m,mkdirSync as y,readFileSync as b,readdirSync as w,writeFileSync as g}from"fs";import{execFileSync as P}from"child_process";import{homedir as h}from"os";import{join as s}from"path";var v=s(h(),".mcp-dataverse"),l=s(v,"config.json"),e=t=>process.stdout.write(t+`
|
|
3
|
+
`),u=()=>process.stdout.write("\u2500".repeat(58)+`
|
|
4
|
+
`);function A(t){let o=JSON.stringify({name:"mcp-dataverse",type:"stdio",command:"npx",args:["-y","mcp-dataverse"],env:{MCP_CONFIG_PATH:t}}),c=[{label:"VS Code Insiders",bin:"code-insiders"},{label:"VS Code Stable",bin:"code"}],i=[];for(let{label:a,bin:r}of c)try{let n=process.platform==="win32"?["/c",r,"--add-mcp",o]:["--add-mcp",o],d=process.platform==="win32"?"cmd.exe":r;P(d,n,{stdio:"pipe",timeout:15e3}),i.push({label:a,ok:!0})}catch{i.push({label:a,ok:!1})}return i}function I(){let t=h();switch(process.platform){case"win32":{let o=process.env.APPDATA??s(t,"AppData","Roaming");return[{label:"VS Code Insiders",dir:s(o,"Code - Insiders","User")},{label:"VS Code Stable",dir:s(o,"Code","User")}]}case"darwin":return[{label:"VS Code Insiders",dir:s(t,"Library","Application Support","Code - Insiders","User")},{label:"VS Code Stable",dir:s(t,"Library","Application Support","Code","User")}];default:return[{label:"VS Code Insiders",dir:s(t,".config","Code - Insiders","User")},{label:"VS Code Stable",dir:s(t,".config","Code","User")}]}}function V(t){let o={type:"stdio",command:"npx",args:["-y","mcp-dataverse"],env:{MCP_CONFIG_PATH:t}},c=[];for(let{dir:i}of I()){let a=s(i,"profiles");if(!m(a))continue;let r;try{r=w(a)}catch{continue}for(let n of r){let d=s(a,n,"mcp.json");if(m(d))try{let C=b(d,"utf-8"),p=JSON.parse(C);p.servers||(p.servers={}),p.servers["mcp-dataverse"]=o,g(d,JSON.stringify(p,null," ")+`
|
|
5
|
+
`,"utf-8"),c.push(d)}catch{}}}return c}function U(t){if(!t.startsWith("https://"))return"URL must start with https://";try{if(!new URL(t).hostname.toLowerCase().endsWith(".dynamics.com"))return"Must be a *.dynamics.com URL (your Power Platform environment)"}catch{return"Invalid URL format"}return null}function D(t){e(" Add this to your VS Code mcp.json (Ctrl+Shift+P \u2192 MCP: Open User Configuration):"),e(""),e(' "mcp-dataverse": {'),e(' "type": "stdio",'),e(' "command": "npx",'),e(' "args": ["-y", "mcp-dataverse"],'),e(` "env": { "MCP_CONFIG_PATH": "${t.replace(/\\/g,"\\\\")}" }`),e(" }")}async function N(){e(""),e("\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"),e("\u2551 MCP Dataverse \u2014 Interactive Setup \u2551"),e("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"),e(""),e("This wizard will:"),e(" 1. Ask for your Dataverse environment URL"),e(" 2. Save configuration to ~/.mcp-dataverse/config.json"),e(" 3. Register the server in VS Code via CLI"),e(" 4. Authenticate with your Microsoft account"),e(""),u();let t=S({input:process.stdin,output:process.stdout}),o="";for(;!o;){let r=(await t.question(`Dataverse environment URL
|
|
6
|
+
e.g. https://contoso.crm.dynamics.com
|
|
7
|
+
\u203A `)).trim().replace(/\/$/,""),n=U(r);if(n){e(` \u2717 ${n}
|
|
8
|
+
`);continue}o=r}t.close(),e(""),e("Saving configuration\u2026"),y(v,{recursive:!0}),g(l,JSON.stringify({environmentUrl:o},null,2)+`
|
|
9
|
+
`,"utf-8"),e(` \u2713 ${l}`),e(""),e("Registering in VS Code\u2026");let c=A(l),i=c.filter(r=>r.ok);if(i.length>0){for(let{label:n}of i)e(` \u2713 ${n}: registered via --add-mcp`);let r=c.filter(n=>!n.ok);for(let{label:n}of r)e(` \u2013 ${n}: not found on PATH (skipped)`)}else e(" \u26A0 Neither 'code' nor 'code-insiders' found on PATH."),e(" Register manually:"),e(""),D(l);let a=V(l);a.length>0&&e(` + Patched ${a.length} custom profile(s)`),e(""),u(),e("Authenticating with Microsoft\u2026"),e("(A prompt will appear below \u2014 open the URL and enter the code)"),e("");try{await new f(o).setupViaDeviceCode(),u(),e(""),e(" \u2713 Setup complete!"),e(""),i.length>0?(e(" The MCP server is now registered in VS Code."),e(" Open VS Code \u2192 Copilot chat \u2192 the 50 Dataverse tools are ready to use.")):(e(" Configuration and authentication are ready."),e(" Register the server manually (see snippet above), then restart VS Code.")),e("")}catch(r){let n=r instanceof Error?r.message:String(r);u(),e(` \u2717 Authentication failed: ${n}`),e(""),e(" Configuration was saved. Authenticate later by restarting the MCP server \u2014"),e(" it will prompt for device code on startup."),e(""),process.exit(1)}}export{N as runInstall};
|