@einlogic/mcp-fabric-api 2.5.0 → 2.6.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 +662 -580
- package/build/auth/token-manager.d.ts +22 -1
- package/build/auth/token-manager.d.ts.map +1 -1
- package/build/auth/token-manager.js +119 -9
- package/build/auth/token-manager.js.map +1 -1
- package/build/core/errors.d.ts +10 -1
- package/build/core/errors.d.ts.map +1 -1
- package/build/core/errors.js +19 -0
- package/build/core/errors.js.map +1 -1
- package/build/index.js +11 -2
- package/build/index.js.map +1 -1
- package/build/server.d.ts +2 -1
- package/build/server.d.ts.map +1 -1
- package/build/server.js +9 -2
- package/build/server.js.map +1 -1
- package/package.json +64 -64
- package/build/utils/file-reader.d.ts +0 -11
- package/build/utils/file-reader.d.ts.map +0 -1
- package/build/utils/file-reader.js +0 -84
- package/build/utils/file-reader.js.map +0 -1
|
@@ -1,14 +1,35 @@
|
|
|
1
1
|
import { type AccessToken } from "@azure/identity";
|
|
2
|
+
export type AuthMethod = "default" | "device-code" | "client-secret" | "interactive-browser";
|
|
3
|
+
export interface AuthConfig {
|
|
4
|
+
method: AuthMethod;
|
|
5
|
+
tenantId?: string;
|
|
6
|
+
clientId?: string;
|
|
7
|
+
clientSecret?: string;
|
|
8
|
+
/** Called with the device code prompt message so callers can surface it to the user (e.g., via MCP notifications). */
|
|
9
|
+
onDeviceCodePrompt?: (message: string) => void;
|
|
10
|
+
}
|
|
2
11
|
export declare class TokenManager {
|
|
3
12
|
private credential;
|
|
4
13
|
private cache;
|
|
5
14
|
private currentTenantId;
|
|
6
|
-
|
|
15
|
+
private authConfig;
|
|
16
|
+
/** Background device-code auth promises keyed by scope URL */
|
|
17
|
+
private pendingDeviceCodeAuth;
|
|
18
|
+
/** Latest device code message for display to user */
|
|
19
|
+
private lastDeviceCodeMessage;
|
|
20
|
+
constructor(config?: AuthConfig);
|
|
21
|
+
private createCredential;
|
|
7
22
|
switchTenant(tenantId?: string): void;
|
|
8
23
|
clearCache(): void;
|
|
9
24
|
getCurrentTenantId(): string | undefined;
|
|
10
25
|
getCachedToken(scope: "fabric" | "powerbi" | "database" | "kusto"): AccessToken | undefined;
|
|
11
26
|
getToken(scope: "fabric" | "powerbi" | "database" | "kusto"): Promise<string>;
|
|
27
|
+
/**
|
|
28
|
+
* Device-code specific token acquisition.
|
|
29
|
+
* Starts polling in the background and throws DeviceCodeAuthRequired immediately
|
|
30
|
+
* so the tool can return the auth URL/code to the user instead of blocking.
|
|
31
|
+
*/
|
|
32
|
+
private getTokenWithDeviceCode;
|
|
12
33
|
getFabricToken(): Promise<string>;
|
|
13
34
|
getPowerBIToken(): Promise<string>;
|
|
14
35
|
getDatabaseToken(): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-manager.d.ts","sourceRoot":"","sources":["../../src/auth/token-manager.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"token-manager.d.ts","sourceRoot":"","sources":["../../src/auth/token-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AASzB,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,eAAe,GAAG,qBAAqB,CAAC;AAE7F,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sHAAsH;IACtH,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,UAAU,CAAa;IAC/B,8DAA8D;IAC9D,OAAO,CAAC,qBAAqB,CAA2C;IACxE,qDAAqD;IACrD,OAAO,CAAC,qBAAqB,CAAuB;gBAExC,MAAM,CAAC,EAAE,UAAU;IAM/B,OAAO,CAAC,gBAAgB;IAgDxB,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAQrC,UAAU,IAAI,IAAI;IAIlB,kBAAkB,IAAI,MAAM,GAAG,SAAS;IAIxC,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,WAAW,GAAG,SAAS;IAKrF,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IA0CnF;;;;OAIG;YACW,sBAAsB;IAgE9B,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAIjC,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAIlC,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAInC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;CAGvC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { DefaultAzureCredential } from "@azure/identity";
|
|
1
|
+
import { DefaultAzureCredential, DeviceCodeCredential, ClientSecretCredential, InteractiveBrowserCredential, } from "@azure/identity";
|
|
2
|
+
import { DeviceCodeAuthRequired } from "../core/errors.js";
|
|
2
3
|
const FABRIC_SCOPE = "https://api.fabric.microsoft.com/.default";
|
|
3
4
|
const POWERBI_SCOPE = "https://analysis.windows.net/powerbi/api/.default";
|
|
4
5
|
const DATABASE_SCOPE = "https://database.windows.net/.default";
|
|
@@ -8,18 +9,61 @@ export class TokenManager {
|
|
|
8
9
|
credential;
|
|
9
10
|
cache = new Map();
|
|
10
11
|
currentTenantId;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
authConfig;
|
|
13
|
+
/** Background device-code auth promises keyed by scope URL */
|
|
14
|
+
pendingDeviceCodeAuth = new Map();
|
|
15
|
+
/** Latest device code message for display to user */
|
|
16
|
+
lastDeviceCodeMessage = null;
|
|
17
|
+
constructor(config) {
|
|
18
|
+
this.authConfig = config ?? { method: "default" };
|
|
19
|
+
this.currentTenantId = this.authConfig.tenantId;
|
|
20
|
+
this.credential = this.createCredential(this.currentTenantId);
|
|
21
|
+
}
|
|
22
|
+
createCredential(tenantId) {
|
|
23
|
+
const { method, clientId, clientSecret } = this.authConfig;
|
|
24
|
+
switch (method) {
|
|
25
|
+
case "device-code": {
|
|
26
|
+
if (!clientId || !tenantId) {
|
|
27
|
+
throw new Error("AUTH_METHOD=device-code requires AZURE_CLIENT_ID and AZURE_TENANT_ID");
|
|
28
|
+
}
|
|
29
|
+
const { onDeviceCodePrompt } = this.authConfig;
|
|
30
|
+
return new DeviceCodeCredential({
|
|
31
|
+
tenantId,
|
|
32
|
+
clientId,
|
|
33
|
+
userPromptCallback: (info) => {
|
|
34
|
+
console.error(`\n[Auth] ${info.message}\n`);
|
|
35
|
+
this.lastDeviceCodeMessage = info.message;
|
|
36
|
+
if (onDeviceCodePrompt) {
|
|
37
|
+
onDeviceCodePrompt(info.message);
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
case "client-secret": {
|
|
43
|
+
if (!tenantId || !clientId || !clientSecret) {
|
|
44
|
+
throw new Error("AUTH_METHOD=client-secret requires AZURE_TENANT_ID, AZURE_CLIENT_ID, and AZURE_CLIENT_SECRET");
|
|
45
|
+
}
|
|
46
|
+
return new ClientSecretCredential(tenantId, clientId, clientSecret);
|
|
47
|
+
}
|
|
48
|
+
case "interactive-browser": {
|
|
49
|
+
return new InteractiveBrowserCredential({
|
|
50
|
+
tenantId,
|
|
51
|
+
clientId,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
default: {
|
|
55
|
+
return tenantId
|
|
56
|
+
? new DefaultAzureCredential({ tenantId })
|
|
57
|
+
: new DefaultAzureCredential();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
16
60
|
}
|
|
17
61
|
switchTenant(tenantId) {
|
|
18
62
|
this.currentTenantId = tenantId;
|
|
19
|
-
this.credential = tenantId
|
|
20
|
-
? new DefaultAzureCredential({ tenantId })
|
|
21
|
-
: new DefaultAzureCredential();
|
|
63
|
+
this.credential = this.createCredential(tenantId);
|
|
22
64
|
this.cache.clear();
|
|
65
|
+
this.pendingDeviceCodeAuth.clear();
|
|
66
|
+
this.lastDeviceCodeMessage = null;
|
|
23
67
|
}
|
|
24
68
|
clearCache() {
|
|
25
69
|
this.cache.clear();
|
|
@@ -37,6 +81,10 @@ export class TokenManager {
|
|
|
37
81
|
if (cached && cached.expiresOnTimestamp - Date.now() > REFRESH_BUFFER_MS) {
|
|
38
82
|
return cached.token;
|
|
39
83
|
}
|
|
84
|
+
// For device-code flow, start auth in the background and return the code to the user immediately
|
|
85
|
+
if (this.authConfig.method === "device-code") {
|
|
86
|
+
return this.getTokenWithDeviceCode(scopeUrl);
|
|
87
|
+
}
|
|
40
88
|
try {
|
|
41
89
|
const token = await this.credential.getToken(scopeUrl);
|
|
42
90
|
if (!token) {
|
|
@@ -47,12 +95,74 @@ export class TokenManager {
|
|
|
47
95
|
}
|
|
48
96
|
catch (error) {
|
|
49
97
|
const message = error instanceof Error ? error.message : String(error);
|
|
98
|
+
const method = this.authConfig.method;
|
|
99
|
+
if (method === "client-secret") {
|
|
100
|
+
throw new Error(`Client secret authentication failed. Verify AZURE_TENANT_ID, AZURE_CLIENT_ID, and AZURE_CLIENT_SECRET are correct.\nDetails: ${message}`);
|
|
101
|
+
}
|
|
102
|
+
if (method === "interactive-browser") {
|
|
103
|
+
throw new Error(`Interactive browser authentication failed. Ensure a browser is accessible.\nDetails: ${message}`);
|
|
104
|
+
}
|
|
50
105
|
if (message.includes("az login") || message.includes("DefaultAzureCredential")) {
|
|
51
106
|
throw new Error(`Azure authentication failed. Run 'az login' first to authenticate.\nDetails: ${message}`);
|
|
52
107
|
}
|
|
53
108
|
throw error;
|
|
54
109
|
}
|
|
55
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* Device-code specific token acquisition.
|
|
113
|
+
* Starts polling in the background and throws DeviceCodeAuthRequired immediately
|
|
114
|
+
* so the tool can return the auth URL/code to the user instead of blocking.
|
|
115
|
+
*/
|
|
116
|
+
async getTokenWithDeviceCode(scopeUrl) {
|
|
117
|
+
// If there's already a pending auth for this scope, check if it completed
|
|
118
|
+
const pending = this.pendingDeviceCodeAuth.get(scopeUrl);
|
|
119
|
+
if (pending) {
|
|
120
|
+
// Race: either the background auth completed, or we time out quickly
|
|
121
|
+
const POLL_TIMEOUT_MS = 3000;
|
|
122
|
+
const result = await Promise.race([
|
|
123
|
+
pending.then((token) => ({ resolved: true, token })),
|
|
124
|
+
new Promise((resolve) => setTimeout(() => resolve({ resolved: false }), POLL_TIMEOUT_MS)),
|
|
125
|
+
]);
|
|
126
|
+
if (result.resolved) {
|
|
127
|
+
this.cache.set(scopeUrl, result.token);
|
|
128
|
+
this.pendingDeviceCodeAuth.delete(scopeUrl);
|
|
129
|
+
this.lastDeviceCodeMessage = null;
|
|
130
|
+
return result.token.token;
|
|
131
|
+
}
|
|
132
|
+
// Still waiting — remind the user
|
|
133
|
+
throw new DeviceCodeAuthRequired(this.lastDeviceCodeMessage ?? "Device code authentication is in progress. Please complete sign-in in your browser.");
|
|
134
|
+
}
|
|
135
|
+
// No pending auth — start a new one in the background
|
|
136
|
+
this.lastDeviceCodeMessage = null;
|
|
137
|
+
const authPromise = this.credential.getToken(scopeUrl).then((token) => {
|
|
138
|
+
if (!token)
|
|
139
|
+
throw new Error(`Failed to acquire token for scope: ${scopeUrl}`);
|
|
140
|
+
return token;
|
|
141
|
+
});
|
|
142
|
+
this.pendingDeviceCodeAuth.set(scopeUrl, authPromise);
|
|
143
|
+
// Handle background completion/failure
|
|
144
|
+
authPromise
|
|
145
|
+
.then((token) => {
|
|
146
|
+
this.cache.set(scopeUrl, token);
|
|
147
|
+
this.pendingDeviceCodeAuth.delete(scopeUrl);
|
|
148
|
+
this.lastDeviceCodeMessage = null;
|
|
149
|
+
console.error(`[Auth] Device code authentication completed for scope: ${scopeUrl}`);
|
|
150
|
+
})
|
|
151
|
+
.catch((err) => {
|
|
152
|
+
this.pendingDeviceCodeAuth.delete(scopeUrl);
|
|
153
|
+
console.error(`[Auth] Device code authentication failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
154
|
+
});
|
|
155
|
+
// Wait briefly for the device code callback to fire so we can capture the message
|
|
156
|
+
const CALLBACK_WAIT_MS = 3000;
|
|
157
|
+
await new Promise((resolve) => setTimeout(resolve, CALLBACK_WAIT_MS));
|
|
158
|
+
// If the auth already completed (e.g., cached token in the credential), return it
|
|
159
|
+
const nowCached = this.cache.get(scopeUrl);
|
|
160
|
+
if (nowCached && nowCached.expiresOnTimestamp - Date.now() > REFRESH_BUFFER_MS) {
|
|
161
|
+
return nowCached.token;
|
|
162
|
+
}
|
|
163
|
+
// Throw the device code info back to the caller so it surfaces in the tool response
|
|
164
|
+
throw new DeviceCodeAuthRequired(this.lastDeviceCodeMessage ?? "Device code authentication started. Please check the MCP server logs for the sign-in URL and code.");
|
|
165
|
+
}
|
|
56
166
|
async getFabricToken() {
|
|
57
167
|
return this.getToken("fabric");
|
|
58
168
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-manager.js","sourceRoot":"","sources":["../../src/auth/token-manager.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"token-manager.js","sourceRoot":"","sources":["../../src/auth/token-manager.ts"],"names":[],"mappings":"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"}
|
package/build/core/errors.d.ts
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thrown when device-code authentication is required.
|
|
3
|
+
* The message contains the URL and code the user must use to authenticate.
|
|
4
|
+
* This is NOT an error — it signals the user needs to act before retrying.
|
|
5
|
+
*/
|
|
6
|
+
export declare class DeviceCodeAuthRequired extends Error {
|
|
7
|
+
deviceCodeMessage: string;
|
|
8
|
+
constructor(deviceCodeMessage: string);
|
|
9
|
+
}
|
|
1
10
|
export declare class FabricApiError extends Error {
|
|
2
11
|
statusCode: number;
|
|
3
12
|
errorCode?: string | undefined;
|
|
@@ -11,6 +20,6 @@ export declare function formatToolError(error: unknown): {
|
|
|
11
20
|
type: "text";
|
|
12
21
|
text: string;
|
|
13
22
|
}>;
|
|
14
|
-
isError:
|
|
23
|
+
isError: boolean;
|
|
15
24
|
};
|
|
16
25
|
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAe,SAAQ,KAAK;IAG9B,UAAU,EAAE,MAAM;IAClB,SAAS,CAAC,EAAE,MAAM;IAClB,eAAe,CAAC,EAAE,MAAM;IACxB,SAAS,CAAC,EAAE,MAAM;IAClB,YAAY,CAAC,EAAE,OAAO,EAAE;gBAL/B,OAAO,EAAE,MAAM,EACR,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,YAAA,EAClB,eAAe,CAAC,EAAE,MAAM,YAAA,EACxB,SAAS,CAAC,EAAE,MAAM,YAAA,EAClB,YAAY,CAAC,EAAE,OAAO,EAAE,YAAA;CAKlC;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAC5B,iBAAiB,EAAE,MAAM;gBAAzB,iBAAiB,EAAE,MAAM;CAI7C;AAED,qBAAa,cAAe,SAAQ,KAAK;IAG9B,UAAU,EAAE,MAAM;IAClB,SAAS,CAAC,EAAE,MAAM;IAClB,eAAe,CAAC,EAAE,MAAM;IACxB,SAAS,CAAC,EAAE,MAAM;IAClB,YAAY,CAAC,EAAE,OAAO,EAAE;gBAL/B,OAAO,EAAE,MAAM,EACR,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,YAAA,EAClB,eAAe,CAAC,EAAE,MAAM,YAAA,EACxB,SAAS,CAAC,EAAE,MAAM,YAAA,EAClB,YAAY,CAAC,EAAE,OAAO,EAAE,YAAA;CAKlC;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CA0BpH"}
|
package/build/core/errors.js
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thrown when device-code authentication is required.
|
|
3
|
+
* The message contains the URL and code the user must use to authenticate.
|
|
4
|
+
* This is NOT an error — it signals the user needs to act before retrying.
|
|
5
|
+
*/
|
|
6
|
+
export class DeviceCodeAuthRequired extends Error {
|
|
7
|
+
deviceCodeMessage;
|
|
8
|
+
constructor(deviceCodeMessage) {
|
|
9
|
+
super(deviceCodeMessage);
|
|
10
|
+
this.deviceCodeMessage = deviceCodeMessage;
|
|
11
|
+
this.name = "DeviceCodeAuthRequired";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
1
14
|
export class FabricApiError extends Error {
|
|
2
15
|
statusCode;
|
|
3
16
|
errorCode;
|
|
@@ -15,6 +28,12 @@ export class FabricApiError extends Error {
|
|
|
15
28
|
}
|
|
16
29
|
}
|
|
17
30
|
export function formatToolError(error) {
|
|
31
|
+
if (error instanceof DeviceCodeAuthRequired) {
|
|
32
|
+
return {
|
|
33
|
+
content: [{ type: "text", text: `🔐 Authentication required.\n\n${error.deviceCodeMessage}\n\nOnce you have completed the sign-in, retry the tool call.` }],
|
|
34
|
+
isError: false,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
18
37
|
let message;
|
|
19
38
|
if (error instanceof FabricApiError) {
|
|
20
39
|
message = `Fabric API Error (${error.statusCode}): ${error.message}`;
|
package/build/core/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAAe,SAAQ,KAAK;IAG9B;IACA;IACA;IACA;IACA;IANT,YACE,OAAe,EACR,UAAkB,EAClB,SAAkB,EAClB,eAAwB,EACxB,SAAkB,EAClB,YAAwB;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC;QANR,eAAU,GAAV,UAAU,CAAQ;QAClB,cAAS,GAAT,SAAS,CAAS;QAClB,oBAAe,GAAf,eAAe,CAAS;QACxB,cAAS,GAAT,SAAS,CAAS;QAClB,iBAAY,GAAZ,YAAY,CAAY;QAG/B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,OAAe,CAAC;IACpB,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,OAAO,GAAG,qBAAqB,KAAK,CAAC,UAAU,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QACrE,IAAI,KAAK,CAAC,SAAS;YAAE,OAAO,IAAI,iBAAiB,KAAK,CAAC,SAAS,EAAE,CAAC;QACnE,IAAI,KAAK,CAAC,eAAe;YAAE,OAAO,IAAI,uBAAuB,KAAK,CAAC,eAAe,EAAE,CAAC;QACrF,IAAI,KAAK,CAAC,SAAS;YAAE,OAAO,IAAI,iBAAiB,KAAK,CAAC,SAAS,EAAE,CAAC;QACnE,IAAI,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,OAAO,IAAI,cAAc,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QAChE,CAAC;IACH,CAAC;SAAM,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAClC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1C,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC5B;IAAnB,YAAmB,iBAAyB;QAC1C,KAAK,CAAC,iBAAiB,CAAC,CAAC;QADR,sBAAiB,GAAjB,iBAAiB,CAAQ;QAE1C,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,KAAK;IAG9B;IACA;IACA;IACA;IACA;IANT,YACE,OAAe,EACR,UAAkB,EAClB,SAAkB,EAClB,eAAwB,EACxB,SAAkB,EAClB,YAAwB;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC;QANR,eAAU,GAAV,UAAU,CAAQ;QAClB,cAAS,GAAT,SAAS,CAAS;QAClB,oBAAe,GAAf,eAAe,CAAS;QACxB,cAAS,GAAT,SAAS,CAAS;QAClB,iBAAY,GAAZ,YAAY,CAAY;QAG/B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,KAAK,YAAY,sBAAsB,EAAE,CAAC;QAC5C,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kCAAkC,KAAK,CAAC,iBAAiB,+DAA+D,EAAE,CAAC;YAC3J,OAAO,EAAE,KAAK;SACf,CAAC;IACJ,CAAC;IAED,IAAI,OAAe,CAAC;IACpB,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,OAAO,GAAG,qBAAqB,KAAK,CAAC,UAAU,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QACrE,IAAI,KAAK,CAAC,SAAS;YAAE,OAAO,IAAI,iBAAiB,KAAK,CAAC,SAAS,EAAE,CAAC;QACnE,IAAI,KAAK,CAAC,eAAe;YAAE,OAAO,IAAI,uBAAuB,KAAK,CAAC,eAAe,EAAE,CAAC;QACrF,IAAI,KAAK,CAAC,SAAS;YAAE,OAAO,IAAI,iBAAiB,KAAK,CAAC,SAAS,EAAE,CAAC;QACnE,IAAI,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,OAAO,IAAI,cAAc,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QAChE,CAAC;IACH,CAAC;SAAM,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAClC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1C,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}
|
package/build/index.js
CHANGED
|
@@ -2,12 +2,21 @@
|
|
|
2
2
|
import { createServer } from "./server.js";
|
|
3
3
|
import { logger } from "./utils/logger.js";
|
|
4
4
|
const transport = process.env.TRANSPORT ?? "stdio";
|
|
5
|
+
function buildAuthConfig() {
|
|
6
|
+
return {
|
|
7
|
+
method: process.env.AUTH_METHOD ?? "default",
|
|
8
|
+
tenantId: process.env.AZURE_TENANT_ID,
|
|
9
|
+
clientId: process.env.AZURE_CLIENT_ID,
|
|
10
|
+
clientSecret: process.env.AZURE_CLIENT_SECRET,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
5
13
|
async function startStdio() {
|
|
6
14
|
const { StdioServerTransport } = await import("@modelcontextprotocol/sdk/server/stdio.js");
|
|
7
|
-
const
|
|
15
|
+
const authConfig = buildAuthConfig();
|
|
16
|
+
const server = createServer({ authConfig });
|
|
8
17
|
const stdioTransport = new StdioServerTransport();
|
|
9
18
|
await server.connect(stdioTransport);
|
|
10
|
-
console.error(
|
|
19
|
+
console.error(`MCP Fabric API server running on stdio (auth: ${authConfig.method})`);
|
|
11
20
|
if (logger.isDebug()) {
|
|
12
21
|
logger.info("Server", "Debug logging enabled — set LOG_LEVEL=info or remove LOG_LEVEL to disable");
|
|
13
22
|
}
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/build/server.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
-
import { TokenManager } from "./auth/token-manager.js";
|
|
2
|
+
import { TokenManager, type AuthConfig } from "./auth/token-manager.js";
|
|
3
3
|
export interface CreateServerOptions {
|
|
4
4
|
tokenManager?: TokenManager;
|
|
5
|
+
authConfig?: AuthConfig;
|
|
5
6
|
}
|
|
6
7
|
export declare function createServer(options?: CreateServerOptions): McpServer;
|
|
7
8
|
//# sourceMappingURL=server.d.ts.map
|
package/build/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AA8BxE,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,SAAS,CA+CrE"}
|
package/build/server.js
CHANGED
|
@@ -31,9 +31,16 @@ import { WorkspaceGuard } from "./core/workspace-guard.js";
|
|
|
31
31
|
export function createServer(options) {
|
|
32
32
|
const server = new McpServer({
|
|
33
33
|
name: "mcp-fabric-api",
|
|
34
|
-
version: "2.
|
|
34
|
+
version: "2.6.0",
|
|
35
35
|
});
|
|
36
|
-
|
|
36
|
+
// Wire device code prompts to MCP logging so clients (e.g., Claude Desktop) can surface them
|
|
37
|
+
const authConfig = options?.authConfig;
|
|
38
|
+
if (authConfig?.method === "device-code" && !authConfig.onDeviceCodePrompt) {
|
|
39
|
+
authConfig.onDeviceCodePrompt = (message) => {
|
|
40
|
+
server.sendLoggingMessage({ level: "warning", logger: "auth", data: message });
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const tokenManager = options?.tokenManager ?? new TokenManager(authConfig);
|
|
37
44
|
const fabricClient = new FabricClient(tokenManager);
|
|
38
45
|
const powerBIClient = new PowerBIClient(tokenManager);
|
|
39
46
|
const sqlClient = new SqlClient(tokenManager);
|
package/build/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,64 +1,64 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@einlogic/mcp-fabric-api",
|
|
3
|
-
"version": "2.
|
|
4
|
-
"description": "MCP server for Microsoft Fabric REST APIs — enables data engineers and data analysts to use AI assistants beyond Copilot to build and manage Fabric components",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "build/index.js",
|
|
7
|
-
"bin": {
|
|
8
|
-
"mcp-fabric-api": "build/index.js"
|
|
9
|
-
},
|
|
10
|
-
"files": [
|
|
11
|
-
"build"
|
|
12
|
-
],
|
|
13
|
-
"scripts": {
|
|
14
|
-
"build": "tsc",
|
|
15
|
-
"start": "node build/index.js",
|
|
16
|
-
"dev": "tsc --watch",
|
|
17
|
-
"inspect": "npx @modelcontextprotocol/inspector build/index.js",
|
|
18
|
-
"prepublishOnly": "npm run build"
|
|
19
|
-
},
|
|
20
|
-
"dependencies": {
|
|
21
|
-
"@azure/identity": "^4.13.0",
|
|
22
|
-
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
23
|
-
"express": "^4.21.0",
|
|
24
|
-
"tedious": "^19.2.1",
|
|
25
|
-
"zod": "^3.24.0"
|
|
26
|
-
},
|
|
27
|
-
"devDependencies": {
|
|
28
|
-
"@types/express": "^4.17.0",
|
|
29
|
-
"@types/node": "^22.0.0",
|
|
30
|
-
"typescript": "^5.
|
|
31
|
-
},
|
|
32
|
-
"keywords": [
|
|
33
|
-
"mcp",
|
|
34
|
-
"mcp-server",
|
|
35
|
-
"model-context-protocol",
|
|
36
|
-
"microsoft-fabric",
|
|
37
|
-
"fabric",
|
|
38
|
-
"power-bi",
|
|
39
|
-
"powerbi",
|
|
40
|
-
"semantic-model",
|
|
41
|
-
"lakehouse",
|
|
42
|
-
"warehouse",
|
|
43
|
-
"pipeline",
|
|
44
|
-
"dataflow",
|
|
45
|
-
"notebook",
|
|
46
|
-
"eventhouse",
|
|
47
|
-
"eventstream",
|
|
48
|
-
"graphql",
|
|
49
|
-
"ai",
|
|
50
|
-
"claude",
|
|
51
|
-
"llm",
|
|
52
|
-
"data-engineering",
|
|
53
|
-
"data-analytics",
|
|
54
|
-
"azure",
|
|
55
|
-
"onelake",
|
|
56
|
-
"tmdl",
|
|
57
|
-
"dax",
|
|
58
|
-
"kql"
|
|
59
|
-
],
|
|
60
|
-
"license": "AGPL-3.0",
|
|
61
|
-
"engines": {
|
|
62
|
-
"node": ">=18.0.0"
|
|
63
|
-
}
|
|
64
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@einlogic/mcp-fabric-api",
|
|
3
|
+
"version": "2.6.0",
|
|
4
|
+
"description": "MCP server for Microsoft Fabric REST APIs — enables data engineers and data analysts to use AI assistants beyond Copilot to build and manage Fabric components",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "build/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"mcp-fabric-api": "build/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"build"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"start": "node build/index.js",
|
|
16
|
+
"dev": "tsc --watch",
|
|
17
|
+
"inspect": "npx @modelcontextprotocol/inspector build/index.js",
|
|
18
|
+
"prepublishOnly": "npm run build"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@azure/identity": "^4.13.0",
|
|
22
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
23
|
+
"express": "^4.21.0",
|
|
24
|
+
"tedious": "^19.2.1",
|
|
25
|
+
"zod": "^3.24.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/express": "^4.17.0",
|
|
29
|
+
"@types/node": "^22.0.0",
|
|
30
|
+
"typescript": "^5.9.3"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"mcp",
|
|
34
|
+
"mcp-server",
|
|
35
|
+
"model-context-protocol",
|
|
36
|
+
"microsoft-fabric",
|
|
37
|
+
"fabric",
|
|
38
|
+
"power-bi",
|
|
39
|
+
"powerbi",
|
|
40
|
+
"semantic-model",
|
|
41
|
+
"lakehouse",
|
|
42
|
+
"warehouse",
|
|
43
|
+
"pipeline",
|
|
44
|
+
"dataflow",
|
|
45
|
+
"notebook",
|
|
46
|
+
"eventhouse",
|
|
47
|
+
"eventstream",
|
|
48
|
+
"graphql",
|
|
49
|
+
"ai",
|
|
50
|
+
"claude",
|
|
51
|
+
"llm",
|
|
52
|
+
"data-engineering",
|
|
53
|
+
"data-analytics",
|
|
54
|
+
"azure",
|
|
55
|
+
"onelake",
|
|
56
|
+
"tmdl",
|
|
57
|
+
"dax",
|
|
58
|
+
"kql"
|
|
59
|
+
],
|
|
60
|
+
"license": "AGPL-3.0",
|
|
61
|
+
"engines": {
|
|
62
|
+
"node": ">=18.0.0"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export interface FileEntry {
|
|
2
|
-
path: string;
|
|
3
|
-
content: string;
|
|
4
|
-
}
|
|
5
|
-
export declare function readContentFromFile(filePath: string): Promise<string>;
|
|
6
|
-
export declare function readFilesFromDirectory(dirPath: string, extensions?: string[]): Promise<FileEntry[]>;
|
|
7
|
-
export declare function writeContentToFile(filePath: string, content: string): Promise<string>;
|
|
8
|
-
export declare function writeFilesToDirectory(dirPath: string, files: FileEntry[]): Promise<string[]>;
|
|
9
|
-
export declare function resolveContentOrFile(content: string | undefined, filePath: string | undefined, fieldName: string): Promise<string>;
|
|
10
|
-
export declare function resolveFilesOrDirectory(files: FileEntry[] | undefined, dirPath: string | undefined, extensions?: string[]): Promise<FileEntry[]>;
|
|
11
|
-
//# sourceMappingURL=file-reader.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file-reader.d.ts","sourceRoot":"","sources":["../../src/utils/file-reader.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO3E;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,SAAS,EAAE,CAAC,CAmCtB;AAED,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK3F;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,EAAE,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAUnB;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAWjB;AAED,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,EAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,SAAS,EAAE,CAAC,CAWtB"}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { readFile, writeFile, readdir, mkdir, stat } from "fs/promises";
|
|
2
|
-
import { resolve, relative, extname, dirname, join } from "path";
|
|
3
|
-
export async function readContentFromFile(filePath) {
|
|
4
|
-
const absolutePath = resolve(filePath);
|
|
5
|
-
const fileStat = await stat(absolutePath);
|
|
6
|
-
if (!fileStat.isFile()) {
|
|
7
|
-
throw new Error(`Path is not a file: ${absolutePath}`);
|
|
8
|
-
}
|
|
9
|
-
return readFile(absolutePath, "utf-8");
|
|
10
|
-
}
|
|
11
|
-
export async function readFilesFromDirectory(dirPath, extensions) {
|
|
12
|
-
const absolutePath = resolve(dirPath);
|
|
13
|
-
const dirStat = await stat(absolutePath);
|
|
14
|
-
if (!dirStat.isDirectory()) {
|
|
15
|
-
throw new Error(`Path is not a directory: ${absolutePath}`);
|
|
16
|
-
}
|
|
17
|
-
const entries = [];
|
|
18
|
-
const lowerExtensions = extensions?.map((e) => e.toLowerCase());
|
|
19
|
-
async function walk(dir) {
|
|
20
|
-
const items = await readdir(dir, { withFileTypes: true });
|
|
21
|
-
for (const item of items) {
|
|
22
|
-
const fullPath = resolve(dir, item.name);
|
|
23
|
-
if (item.isDirectory()) {
|
|
24
|
-
await walk(fullPath);
|
|
25
|
-
}
|
|
26
|
-
else if (item.isFile()) {
|
|
27
|
-
if (lowerExtensions && !lowerExtensions.includes(extname(item.name).toLowerCase())) {
|
|
28
|
-
continue;
|
|
29
|
-
}
|
|
30
|
-
const relPath = relative(absolutePath, fullPath).replace(/\\/g, "/");
|
|
31
|
-
const content = await readFile(fullPath, "utf-8");
|
|
32
|
-
entries.push({ path: relPath, content });
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
await walk(absolutePath);
|
|
37
|
-
if (entries.length === 0) {
|
|
38
|
-
const filterMsg = extensions ? ` matching extensions: ${extensions.join(", ")}` : "";
|
|
39
|
-
throw new Error(`No files found in directory: ${absolutePath}${filterMsg}`);
|
|
40
|
-
}
|
|
41
|
-
return entries;
|
|
42
|
-
}
|
|
43
|
-
export async function writeContentToFile(filePath, content) {
|
|
44
|
-
const absolutePath = resolve(filePath);
|
|
45
|
-
await mkdir(dirname(absolutePath), { recursive: true });
|
|
46
|
-
await writeFile(absolutePath, content, "utf-8");
|
|
47
|
-
return absolutePath;
|
|
48
|
-
}
|
|
49
|
-
export async function writeFilesToDirectory(dirPath, files) {
|
|
50
|
-
const absolutePath = resolve(dirPath);
|
|
51
|
-
const written = [];
|
|
52
|
-
for (const file of files) {
|
|
53
|
-
const fullPath = join(absolutePath, file.path);
|
|
54
|
-
await mkdir(dirname(fullPath), { recursive: true });
|
|
55
|
-
await writeFile(fullPath, file.content, "utf-8");
|
|
56
|
-
written.push(file.path);
|
|
57
|
-
}
|
|
58
|
-
return written;
|
|
59
|
-
}
|
|
60
|
-
export async function resolveContentOrFile(content, filePath, fieldName) {
|
|
61
|
-
if (content && filePath) {
|
|
62
|
-
throw new Error(`Provide either '${fieldName}' or '${fieldName}FilePath', not both`);
|
|
63
|
-
}
|
|
64
|
-
if (filePath) {
|
|
65
|
-
return readContentFromFile(filePath);
|
|
66
|
-
}
|
|
67
|
-
if (content) {
|
|
68
|
-
return content;
|
|
69
|
-
}
|
|
70
|
-
throw new Error(`Either '${fieldName}' or '${fieldName}FilePath' must be provided`);
|
|
71
|
-
}
|
|
72
|
-
export async function resolveFilesOrDirectory(files, dirPath, extensions) {
|
|
73
|
-
if (files && files.length > 0 && dirPath) {
|
|
74
|
-
throw new Error("Provide either 'files' or a directory path, not both");
|
|
75
|
-
}
|
|
76
|
-
if (dirPath) {
|
|
77
|
-
return readFilesFromDirectory(dirPath, extensions);
|
|
78
|
-
}
|
|
79
|
-
if (files && files.length > 0) {
|
|
80
|
-
return files;
|
|
81
|
-
}
|
|
82
|
-
throw new Error("Either 'files' or a directory path must be provided");
|
|
83
|
-
}
|
|
84
|
-
//# sourceMappingURL=file-reader.js.map
|