@einlogic/mcp-fabric-api 2.4.1 → 2.5.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 +57 -0
- package/build/client/fabric-client.d.ts.map +1 -1
- package/build/client/fabric-client.js +70 -12
- package/build/client/fabric-client.js.map +1 -1
- package/build/client/kusto-client.d.ts.map +1 -1
- package/build/client/kusto-client.js +18 -0
- package/build/client/kusto-client.js.map +1 -1
- package/build/client/powerbi-client.d.ts.map +1 -1
- package/build/client/powerbi-client.js +43 -9
- package/build/client/powerbi-client.js.map +1 -1
- package/build/client/sql-client.d.ts.map +1 -1
- package/build/client/sql-client.js +16 -0
- package/build/client/sql-client.js.map +1 -1
- package/build/core/errors.d.ts +3 -1
- package/build/core/errors.d.ts.map +1 -1
- package/build/core/errors.js +10 -1
- package/build/core/errors.js.map +1 -1
- package/build/core/lro.d.ts.map +1 -1
- package/build/core/lro.js +29 -0
- package/build/core/lro.js.map +1 -1
- package/build/core/pagination.d.ts.map +1 -1
- package/build/core/pagination.js +12 -0
- package/build/core/pagination.js.map +1 -1
- package/build/index.js +7 -0
- package/build/index.js.map +1 -1
- package/build/server.js +1 -1
- package/build/utils/logger.d.ts +27 -0
- package/build/utils/logger.d.ts.map +1 -0
- package/build/utils/logger.js +59 -0
- package/build/utils/logger.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -157,6 +157,63 @@ WRITABLE_WORKSPACES is not configured. Destructive actions are blocked by defaul
|
|
|
157
157
|
Workspace "Production-Analytics" is not in the writable workspaces list. Allowed patterns: *-Dev, *-Test, Sandbox*
|
|
158
158
|
```
|
|
159
159
|
|
|
160
|
+
### Debug Logging
|
|
161
|
+
|
|
162
|
+
Enable verbose debug logging to diagnose API errors, inspect request/response details, and trace long-running operations. All log output goes to `stderr` (visible in Claude Desktop's log files, never interferes with JSON-RPC on stdout).
|
|
163
|
+
|
|
164
|
+
Set the `LOG_LEVEL` environment variable to `debug`:
|
|
165
|
+
|
|
166
|
+
**Claude Desktop config:**
|
|
167
|
+
```json
|
|
168
|
+
{
|
|
169
|
+
"mcpServers": {
|
|
170
|
+
"fabric": {
|
|
171
|
+
"command": "npx",
|
|
172
|
+
"args": ["-y", "@einlogic/mcp-fabric-api"],
|
|
173
|
+
"env": {
|
|
174
|
+
"LOG_LEVEL": "debug"
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Claude Code CLI:**
|
|
182
|
+
```bash
|
|
183
|
+
LOG_LEVEL=debug claude mcp add fabric -- npx -y @einlogic/mcp-fabric-api
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**What gets logged at debug level:**
|
|
187
|
+
|
|
188
|
+
| Category | Details logged |
|
|
189
|
+
|----------|---------------|
|
|
190
|
+
| HTTP requests | Method, full URL, request body size in bytes |
|
|
191
|
+
| HTTP responses | Status code, duration (ms), `x-ms-request-id` header |
|
|
192
|
+
| Definition uploads | Part paths, payload types, payload sizes — never payload content |
|
|
193
|
+
| API errors | Full error body including `errorCode`, `details[]`, `innererror`, `relatedResource`, `x-ms-request-id` |
|
|
194
|
+
| LRO polling | Operation ID, poll count, elapsed time, final status |
|
|
195
|
+
| Pagination | Page count, items per page, total items |
|
|
196
|
+
| SQL/KQL queries | Server, database, duration, column/row counts — never query text or result data |
|
|
197
|
+
| Rate limiting | Retry-after duration, affected endpoint |
|
|
198
|
+
|
|
199
|
+
**Compliance:** Debug logging never captures actual data content — no query text, no query results, no definition payloads, no bearer tokens. Only structural metadata (URLs, sizes, counts, timing, error details) is logged.
|
|
200
|
+
|
|
201
|
+
**Viewing logs in Claude Desktop:**
|
|
202
|
+
|
|
203
|
+
- **macOS:** `~/Library/Logs/Claude/mcp-server-fabric.log`
|
|
204
|
+
- **Windows:** `%APPDATA%\Claude\logs\mcp-server-fabric.log`
|
|
205
|
+
|
|
206
|
+
You can also tail the log in real time:
|
|
207
|
+
```bash
|
|
208
|
+
# macOS
|
|
209
|
+
tail -f ~/Library/Logs/Claude/mcp-server-fabric.log
|
|
210
|
+
|
|
211
|
+
# Windows (PowerShell)
|
|
212
|
+
Get-Content "$env:APPDATA\Claude\logs\mcp-server-fabric.log" -Wait
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
The `x-ms-request-id` value logged with every API error is the key identifier needed when opening a support case with Microsoft for Fabric API issues.
|
|
216
|
+
|
|
160
217
|
### File-Based I/O
|
|
161
218
|
|
|
162
219
|
To avoid large payloads overwhelming MCP clients, definition tools use file paths instead of inline content. The server reads files from disk when sending definitions to Fabric, and writes files to disk when retrieving definitions from Fabric.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fabric-client.d.ts","sourceRoot":"","sources":["../../src/client/fabric-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"fabric-client.d.ts","sourceRoot":"","sources":["../../src/client/fabric-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAOxD,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,OAAO;IACzC,IAAI,EAAE,CAAC,CAAC;IACR,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,YAAY;IACX,OAAO,CAAC,YAAY;gBAAZ,YAAY,EAAE,YAAY;YAEhC,UAAU;IAQxB,OAAO,CAAC,UAAU;YAcJ,cAAc;IAsFtB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAS1D,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAyB3E,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAa3E,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAY7D,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;CAOvE"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { FabricApiError } from "../core/errors.js";
|
|
2
|
+
import { logger, safeHeaders, summarizeDefinitionParts } from "../utils/logger.js";
|
|
2
3
|
const FABRIC_BASE_URL = "https://api.fabric.microsoft.com/v1";
|
|
4
|
+
const COMPONENT = "FabricClient";
|
|
3
5
|
export class FabricClient {
|
|
4
6
|
tokenManager;
|
|
5
7
|
constructor(tokenManager) {
|
|
@@ -26,11 +28,22 @@ export class FabricClient {
|
|
|
26
28
|
retryAfter: retryAfter ? parseInt(retryAfter, 10) : undefined,
|
|
27
29
|
};
|
|
28
30
|
}
|
|
29
|
-
async handleResponse(response) {
|
|
31
|
+
async handleResponse(response, method, url, startTime) {
|
|
32
|
+
const durationMs = Date.now() - startTime;
|
|
33
|
+
const requestId = response.headers.get("x-ms-request-id") ?? undefined;
|
|
34
|
+
logger.debug(COMPONENT, `${method} ${url} completed`, {
|
|
35
|
+
status: response.status,
|
|
36
|
+
durationMs,
|
|
37
|
+
requestId,
|
|
38
|
+
});
|
|
39
|
+
if (logger.isDebug()) {
|
|
40
|
+
logger.debug(COMPONENT, "Response headers", safeHeaders(response.headers));
|
|
41
|
+
}
|
|
30
42
|
if (response.status === 429) {
|
|
31
43
|
const retryAfter = response.headers.get("retry-after");
|
|
32
44
|
const waitMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 30000;
|
|
33
|
-
|
|
45
|
+
logger.warn(COMPONENT, `Rate limited on ${method} ${url}`, { retryAfterSecs: waitMs / 1000, requestId });
|
|
46
|
+
throw new FabricApiError(`Rate limited. Retry after ${waitMs / 1000}s`, 429, "TooManyRequests", undefined, requestId);
|
|
34
47
|
}
|
|
35
48
|
const lro = this.extractLro(response);
|
|
36
49
|
if (response.status === 204 || response.headers.get("content-length") === "0") {
|
|
@@ -47,45 +60,90 @@ export class FabricClient {
|
|
|
47
60
|
if (!response.ok && response.status !== 202) {
|
|
48
61
|
const err = body;
|
|
49
62
|
const errorBody = (err?.error ?? err);
|
|
50
|
-
|
|
63
|
+
const errorMessage = errorBody?.message ?? response.statusText;
|
|
64
|
+
const errorCode = errorBody?.errorCode ?? undefined;
|
|
65
|
+
const relatedResource = errorBody?.relatedResource ?? undefined;
|
|
66
|
+
const errorDetails = errorBody?.details ?? undefined;
|
|
67
|
+
logger.error(COMPONENT, `API error on ${method} ${url}`, {
|
|
68
|
+
status: response.status,
|
|
69
|
+
errorCode,
|
|
70
|
+
errorMessage,
|
|
71
|
+
relatedResource,
|
|
72
|
+
requestId,
|
|
73
|
+
details: errorDetails,
|
|
74
|
+
innerError: errorBody?.innererror,
|
|
75
|
+
durationMs,
|
|
76
|
+
});
|
|
77
|
+
throw new FabricApiError(errorMessage, response.status, errorCode, relatedResource, requestId, errorDetails);
|
|
78
|
+
}
|
|
79
|
+
if (lro) {
|
|
80
|
+
logger.debug(COMPONENT, `LRO initiated from ${method} ${url}`, {
|
|
81
|
+
operationId: lro.operationId,
|
|
82
|
+
location: lro.location,
|
|
83
|
+
requestId,
|
|
84
|
+
});
|
|
51
85
|
}
|
|
52
86
|
return { data: body, lro, status: response.status };
|
|
53
87
|
}
|
|
54
88
|
async get(path) {
|
|
89
|
+
const url = `${FABRIC_BASE_URL}${path}`;
|
|
90
|
+
logger.debug(COMPONENT, `GET ${url}`);
|
|
91
|
+
const startTime = Date.now();
|
|
55
92
|
const headers = await this.getHeaders();
|
|
56
|
-
const response = await fetch(
|
|
57
|
-
return this.handleResponse(response);
|
|
93
|
+
const response = await fetch(url, { headers });
|
|
94
|
+
return this.handleResponse(response, "GET", url, startTime);
|
|
58
95
|
}
|
|
59
96
|
async post(path, body) {
|
|
97
|
+
const url = `${FABRIC_BASE_URL}${path}`;
|
|
98
|
+
const debugMeta = {};
|
|
99
|
+
if (body !== undefined) {
|
|
100
|
+
debugMeta.bodyBytes = JSON.stringify(body).length;
|
|
101
|
+
// Auto-detect definition uploads and log part structure (no payload content)
|
|
102
|
+
const bodyObj = body;
|
|
103
|
+
const def = bodyObj?.definition;
|
|
104
|
+
if (def?.parts && Array.isArray(def.parts)) {
|
|
105
|
+
debugMeta.definitionParts = summarizeDefinitionParts(def.parts);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
logger.debug(COMPONENT, `POST ${url}`, Object.keys(debugMeta).length > 0 ? debugMeta : undefined);
|
|
109
|
+
const startTime = Date.now();
|
|
60
110
|
const headers = await this.getHeaders();
|
|
61
|
-
const response = await fetch(
|
|
111
|
+
const response = await fetch(url, {
|
|
62
112
|
method: "POST",
|
|
63
113
|
headers,
|
|
64
114
|
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
65
115
|
});
|
|
66
|
-
return this.handleResponse(response);
|
|
116
|
+
return this.handleResponse(response, "POST", url, startTime);
|
|
67
117
|
}
|
|
68
118
|
async patch(path, body) {
|
|
119
|
+
const url = `${FABRIC_BASE_URL}${path}`;
|
|
120
|
+
logger.debug(COMPONENT, `PATCH ${url}`, { bodyBytes: JSON.stringify(body).length });
|
|
121
|
+
const startTime = Date.now();
|
|
69
122
|
const headers = await this.getHeaders();
|
|
70
|
-
const response = await fetch(
|
|
123
|
+
const response = await fetch(url, {
|
|
71
124
|
method: "PATCH",
|
|
72
125
|
headers,
|
|
73
126
|
body: JSON.stringify(body),
|
|
74
127
|
});
|
|
75
|
-
return this.handleResponse(response);
|
|
128
|
+
return this.handleResponse(response, "PATCH", url, startTime);
|
|
76
129
|
}
|
|
77
130
|
async delete(path) {
|
|
131
|
+
const url = `${FABRIC_BASE_URL}${path}`;
|
|
132
|
+
logger.debug(COMPONENT, `DELETE ${url}`);
|
|
133
|
+
const startTime = Date.now();
|
|
78
134
|
const headers = await this.getHeaders();
|
|
79
|
-
const response = await fetch(
|
|
135
|
+
const response = await fetch(url, {
|
|
80
136
|
method: "DELETE",
|
|
81
137
|
headers,
|
|
82
138
|
});
|
|
83
|
-
return this.handleResponse(response);
|
|
139
|
+
return this.handleResponse(response, "DELETE", url, startTime);
|
|
84
140
|
}
|
|
85
141
|
async getFullUrl(url) {
|
|
142
|
+
logger.debug(COMPONENT, `GET ${url}`);
|
|
143
|
+
const startTime = Date.now();
|
|
86
144
|
const headers = await this.getHeaders();
|
|
87
145
|
const response = await fetch(url, { headers });
|
|
88
|
-
return this.handleResponse(response);
|
|
146
|
+
return this.handleResponse(response, "GET", url, startTime);
|
|
89
147
|
}
|
|
90
148
|
}
|
|
91
149
|
//# sourceMappingURL=fabric-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fabric-client.js","sourceRoot":"","sources":["../../src/client/fabric-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"fabric-client.js","sourceRoot":"","sources":["../../src/client/fabric-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kusto-client.d.ts","sourceRoot":"","sources":["../../src/client/kusto-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"kusto-client.d.ts","sourceRoot":"","sources":["../../src/client/kusto-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAYvD,qBAAa,WAAW;IACV,OAAO,CAAC,YAAY;gBAAZ,YAAY,EAAE,YAAY;IAExC,YAAY,CAChB,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAAyB,GACjC,OAAO,CAAC,cAAc,CAAC;CAiF3B"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { logger } from "../utils/logger.js";
|
|
1
2
|
const DEFAULT_MAX_ROWS = 1000;
|
|
3
|
+
const COMPONENT = "KustoClient";
|
|
2
4
|
export class KustoClient {
|
|
3
5
|
tokenManager;
|
|
4
6
|
constructor(tokenManager) {
|
|
@@ -17,6 +19,8 @@ export class KustoClient {
|
|
|
17
19
|
},
|
|
18
20
|
},
|
|
19
21
|
};
|
|
22
|
+
logger.debug(COMPONENT, `POST ${url}`, { database, maxRows });
|
|
23
|
+
const startTime = Date.now();
|
|
20
24
|
const response = await fetch(url, {
|
|
21
25
|
method: "POST",
|
|
22
26
|
headers: {
|
|
@@ -26,6 +30,7 @@ export class KustoClient {
|
|
|
26
30
|
},
|
|
27
31
|
body: JSON.stringify(body),
|
|
28
32
|
});
|
|
33
|
+
const durationMs = Date.now() - startTime;
|
|
29
34
|
if (!response.ok) {
|
|
30
35
|
let errorDetail;
|
|
31
36
|
try {
|
|
@@ -37,6 +42,12 @@ export class KustoClient {
|
|
|
37
42
|
catch {
|
|
38
43
|
errorDetail = await response.text();
|
|
39
44
|
}
|
|
45
|
+
logger.error(COMPONENT, `KQL query failed`, {
|
|
46
|
+
status: response.status,
|
|
47
|
+
database,
|
|
48
|
+
durationMs,
|
|
49
|
+
errorDetail,
|
|
50
|
+
});
|
|
40
51
|
throw new Error(`KQL query failed (HTTP ${response.status}): ${errorDetail}`);
|
|
41
52
|
}
|
|
42
53
|
const frames = (await response.json());
|
|
@@ -54,6 +65,13 @@ export class KustoClient {
|
|
|
54
65
|
}
|
|
55
66
|
return record;
|
|
56
67
|
});
|
|
68
|
+
logger.debug(COMPONENT, `KQL query completed`, {
|
|
69
|
+
status: response.status,
|
|
70
|
+
database,
|
|
71
|
+
durationMs,
|
|
72
|
+
columnCount: columns.length,
|
|
73
|
+
rowCount: rows.length,
|
|
74
|
+
});
|
|
57
75
|
return { columns, rows, rowCount: rows.length };
|
|
58
76
|
}
|
|
59
77
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kusto-client.js","sourceRoot":"","sources":["../../src/client/kusto-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"kusto-client.js","sourceRoot":"","sources":["../../src/client/kusto-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"powerbi-client.d.ts","sourceRoot":"","sources":["../../src/client/powerbi-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"powerbi-client.d.ts","sourceRoot":"","sources":["../../src/client/powerbi-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAOxD,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC1C,IAAI,EAAE,CAAC,CAAC;IACR,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,aAAa;IACZ,OAAO,CAAC,YAAY;gBAAZ,YAAY,EAAE,YAAY;YAEhC,UAAU;YAQV,cAAc;IA0EtB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAS3D,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAa5E,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;CAWrE"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { FabricApiError } from "../core/errors.js";
|
|
2
|
+
import { logger, safeHeaders } from "../utils/logger.js";
|
|
2
3
|
const POWERBI_BASE_URL = "https://api.powerbi.com/v1.0/myorg";
|
|
4
|
+
const COMPONENT = "PowerBIClient";
|
|
3
5
|
export class PowerBIClient {
|
|
4
6
|
tokenManager;
|
|
5
7
|
constructor(tokenManager) {
|
|
@@ -12,11 +14,22 @@ export class PowerBIClient {
|
|
|
12
14
|
"Content-Type": "application/json",
|
|
13
15
|
};
|
|
14
16
|
}
|
|
15
|
-
async handleResponse(response) {
|
|
17
|
+
async handleResponse(response, method, url, startTime) {
|
|
18
|
+
const durationMs = Date.now() - startTime;
|
|
19
|
+
const requestId = response.headers.get("requestid") ?? response.headers.get("x-ms-request-id") ?? undefined;
|
|
20
|
+
logger.debug(COMPONENT, `${method} ${url} completed`, {
|
|
21
|
+
status: response.status,
|
|
22
|
+
durationMs,
|
|
23
|
+
requestId,
|
|
24
|
+
});
|
|
25
|
+
if (logger.isDebug()) {
|
|
26
|
+
logger.debug(COMPONENT, "Response headers", safeHeaders(response.headers));
|
|
27
|
+
}
|
|
16
28
|
if (response.status === 429) {
|
|
17
29
|
const retryAfter = response.headers.get("retry-after");
|
|
18
30
|
const waitMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 30000;
|
|
19
|
-
|
|
31
|
+
logger.warn(COMPONENT, `Rate limited on ${method} ${url}`, { retryAfterSecs: waitMs / 1000, requestId });
|
|
32
|
+
throw new FabricApiError(`Rate limited. Retry after ${waitMs / 1000}s`, 429, "TooManyRequests", undefined, requestId);
|
|
20
33
|
}
|
|
21
34
|
if (response.status === 204 || response.headers.get("content-length") === "0") {
|
|
22
35
|
return { data: undefined, status: response.status };
|
|
@@ -32,31 +45,52 @@ export class PowerBIClient {
|
|
|
32
45
|
if (!response.ok) {
|
|
33
46
|
const err = body;
|
|
34
47
|
const errorBody = (err?.error ?? err);
|
|
35
|
-
|
|
48
|
+
const errorMessage = errorBody?.message ?? response.statusText;
|
|
49
|
+
const errorCode = errorBody?.errorCode ?? undefined;
|
|
50
|
+
const errorDetails = errorBody?.details ?? undefined;
|
|
51
|
+
logger.error(COMPONENT, `API error on ${method} ${url}`, {
|
|
52
|
+
status: response.status,
|
|
53
|
+
errorCode,
|
|
54
|
+
errorMessage,
|
|
55
|
+
requestId,
|
|
56
|
+
details: errorDetails,
|
|
57
|
+
innerError: errorBody?.innererror,
|
|
58
|
+
durationMs,
|
|
59
|
+
});
|
|
60
|
+
throw new FabricApiError(errorMessage, response.status, errorCode, undefined, requestId, errorDetails);
|
|
36
61
|
}
|
|
37
62
|
return { data: body, status: response.status };
|
|
38
63
|
}
|
|
39
64
|
async get(path) {
|
|
65
|
+
const url = `${POWERBI_BASE_URL}${path}`;
|
|
66
|
+
logger.debug(COMPONENT, `GET ${url}`);
|
|
67
|
+
const startTime = Date.now();
|
|
40
68
|
const headers = await this.getHeaders();
|
|
41
|
-
const response = await fetch(
|
|
42
|
-
return this.handleResponse(response);
|
|
69
|
+
const response = await fetch(url, { headers });
|
|
70
|
+
return this.handleResponse(response, "GET", url, startTime);
|
|
43
71
|
}
|
|
44
72
|
async post(path, body) {
|
|
73
|
+
const url = `${POWERBI_BASE_URL}${path}`;
|
|
74
|
+
logger.debug(COMPONENT, `POST ${url}`, body !== undefined ? { bodyBytes: JSON.stringify(body).length } : undefined);
|
|
75
|
+
const startTime = Date.now();
|
|
45
76
|
const headers = await this.getHeaders();
|
|
46
|
-
const response = await fetch(
|
|
77
|
+
const response = await fetch(url, {
|
|
47
78
|
method: "POST",
|
|
48
79
|
headers,
|
|
49
80
|
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
50
81
|
});
|
|
51
|
-
return this.handleResponse(response);
|
|
82
|
+
return this.handleResponse(response, "POST", url, startTime);
|
|
52
83
|
}
|
|
53
84
|
async delete(path) {
|
|
85
|
+
const url = `${POWERBI_BASE_URL}${path}`;
|
|
86
|
+
logger.debug(COMPONENT, `DELETE ${url}`);
|
|
87
|
+
const startTime = Date.now();
|
|
54
88
|
const headers = await this.getHeaders();
|
|
55
|
-
const response = await fetch(
|
|
89
|
+
const response = await fetch(url, {
|
|
56
90
|
method: "DELETE",
|
|
57
91
|
headers,
|
|
58
92
|
});
|
|
59
|
-
return this.handleResponse(response);
|
|
93
|
+
return this.handleResponse(response, "DELETE", url, startTime);
|
|
60
94
|
}
|
|
61
95
|
}
|
|
62
96
|
//# sourceMappingURL=powerbi-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"powerbi-client.js","sourceRoot":"","sources":["../../src/client/powerbi-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"powerbi-client.js","sourceRoot":"","sources":["../../src/client/powerbi-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-client.d.ts","sourceRoot":"","sources":["../../src/client/sql-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"sql-client.d.ts","sourceRoot":"","sources":["../../src/client/sql-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAMvD,qBAAa,SAAS;IACR,OAAO,CAAC,YAAY;gBAAZ,YAAY,EAAE,YAAY;IAExC,YAAY,CAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,MAAyB,GACjC,OAAO,CAAC,cAAc,CAAC;CAsF3B"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { Connection, Request } from "tedious";
|
|
2
|
+
import { logger } from "../utils/logger.js";
|
|
2
3
|
const DEFAULT_MAX_ROWS = 1000;
|
|
3
4
|
const QUERY_TIMEOUT_MS = 30000;
|
|
5
|
+
const COMPONENT = "SqlClient";
|
|
4
6
|
export class SqlClient {
|
|
5
7
|
tokenManager;
|
|
6
8
|
constructor(tokenManager) {
|
|
@@ -8,6 +10,8 @@ export class SqlClient {
|
|
|
8
10
|
}
|
|
9
11
|
async executeQuery(server, database, query, maxRows = DEFAULT_MAX_ROWS) {
|
|
10
12
|
const token = await this.tokenManager.getDatabaseToken();
|
|
13
|
+
logger.debug(COMPONENT, `Connecting to ${server}`, { database, maxRows });
|
|
14
|
+
const startTime = Date.now();
|
|
11
15
|
return new Promise((resolve, reject) => {
|
|
12
16
|
const columns = [];
|
|
13
17
|
const rows = [];
|
|
@@ -29,15 +33,26 @@ export class SqlClient {
|
|
|
29
33
|
});
|
|
30
34
|
connection.on("connect", (err) => {
|
|
31
35
|
if (err) {
|
|
36
|
+
const durationMs = Date.now() - startTime;
|
|
37
|
+
logger.error(COMPONENT, `Connection failed to ${server}`, { database, durationMs, error: err.message });
|
|
32
38
|
reject(new Error(`SQL connection failed: ${err.message}`));
|
|
33
39
|
return;
|
|
34
40
|
}
|
|
41
|
+
logger.debug(COMPONENT, `Connected to ${server}`, { database, durationMs: Date.now() - startTime });
|
|
35
42
|
const request = new Request(query, (reqErr, rowCount) => {
|
|
43
|
+
const durationMs = Date.now() - startTime;
|
|
36
44
|
connection.close();
|
|
37
45
|
if (reqErr) {
|
|
46
|
+
logger.error(COMPONENT, `Query failed on ${server}`, { database, durationMs, error: reqErr.message });
|
|
38
47
|
reject(new Error(`SQL query failed: ${reqErr.message}`));
|
|
39
48
|
return;
|
|
40
49
|
}
|
|
50
|
+
logger.debug(COMPONENT, `Query completed on ${server}`, {
|
|
51
|
+
database,
|
|
52
|
+
durationMs,
|
|
53
|
+
columnCount: columns.length,
|
|
54
|
+
rowCount: rowCount ?? rows.length,
|
|
55
|
+
});
|
|
41
56
|
resolve({ columns, rows, rowCount: rowCount ?? rows.length });
|
|
42
57
|
});
|
|
43
58
|
request.on("columnMetadata", (columnMetadata) => {
|
|
@@ -63,6 +78,7 @@ export class SqlClient {
|
|
|
63
78
|
connection.execSql(request);
|
|
64
79
|
});
|
|
65
80
|
connection.on("error", (err) => {
|
|
81
|
+
logger.error(COMPONENT, `Connection error on ${server}`, { database, error: err.message });
|
|
66
82
|
reject(new Error(`SQL connection error: ${err.message}`));
|
|
67
83
|
});
|
|
68
84
|
connection.connect();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-client.js","sourceRoot":"","sources":["../../src/client/sql-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"sql-client.js","sourceRoot":"","sources":["../../src/client/sql-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAE9C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,MAAM,SAAS,GAAG,WAAW,CAAC;AAE9B,MAAM,OAAO,SAAS;IACA;IAApB,YAAoB,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IAAG,CAAC;IAElD,KAAK,CAAC,YAAY,CAChB,MAAc,EACd,QAAgB,EAChB,KAAa,EACb,UAAkB,gBAAgB;QAElC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC;QAEzD,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,iBAAiB,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,OAAO,IAAI,OAAO,CAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrD,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,MAAM,IAAI,GAA8B,EAAE,CAAC;YAE3C,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC;gBAChC,MAAM;gBACN,cAAc,EAAE;oBACd,IAAI,EAAE,qCAAqC;oBAC3C,OAAO,EAAE;wBACP,KAAK;qBACN;iBACF;gBACD,OAAO,EAAE;oBACP,QAAQ;oBACR,OAAO,EAAE,IAAI;oBACb,IAAI,EAAE,IAAI;oBACV,cAAc,EAAE,gBAAgB;oBAChC,sBAAsB,EAAE,KAAK;iBAC9B;aACF,CAAC,CAAC;YAEH,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC/B,IAAI,GAAG,EAAE,CAAC;oBACR,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;oBAC1C,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,wBAAwB,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;oBACxG,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;oBAC3D,OAAO;gBACT,CAAC;gBAED,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,gBAAgB,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;gBAEpG,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;oBACtD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;oBAC1C,UAAU,CAAC,KAAK,EAAE,CAAC;oBACnB,IAAI,MAAM,EAAE,CAAC;wBACX,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,mBAAmB,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;wBACtG,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;wBACzD,OAAO;oBACT,CAAC;oBACD,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,sBAAsB,MAAM,EAAE,EAAE;wBACtD,QAAQ;wBACR,UAAU;wBACV,WAAW,EAAE,OAAO,CAAC,MAAM;wBAC3B,QAAQ,EAAE,QAAQ,IAAI,IAAI,CAAC,MAAM;qBAClC,CAAC,CAAC;oBACH,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBAChE,CAAC,CAAC,CAAC;gBAEH,OAAO,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,cAAc,EAAE,EAAE;oBAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC;wBACxC,CAAC,CAAC,cAAc;wBAChB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;oBAClC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;wBACvB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBAC5B,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,UAAe,EAAE,EAAE;oBACpC,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO;wBAAE,OAAO;oBACnC,MAAM,GAAG,GAA4B,EAAE,CAAC;oBACxC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;wBACpC,CAAC,CAAC,UAAU;wBACZ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;oBAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;wBACvB,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;oBACxC,CAAC;oBACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjB,CAAC,CAAC,CAAC;gBAEH,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;YAEH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC7B,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,uBAAuB,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC3F,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC5D,CAAC,CAAC,CAAC;YAEH,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
package/build/core/errors.d.ts
CHANGED
|
@@ -2,7 +2,9 @@ export declare class FabricApiError extends Error {
|
|
|
2
2
|
statusCode: number;
|
|
3
3
|
errorCode?: string | undefined;
|
|
4
4
|
relatedResource?: string | undefined;
|
|
5
|
-
|
|
5
|
+
requestId?: string | undefined;
|
|
6
|
+
errorDetails?: unknown[] | undefined;
|
|
7
|
+
constructor(message: string, statusCode: number, errorCode?: string | undefined, relatedResource?: string | undefined, requestId?: string | undefined, errorDetails?: unknown[] | undefined);
|
|
6
8
|
}
|
|
7
9
|
export declare function formatToolError(error: unknown): {
|
|
8
10
|
content: Array<{
|
|
@@ -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;
|
|
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,IAAI,CAAA;CAAE,CAmBjH"}
|
package/build/core/errors.js
CHANGED
|
@@ -2,11 +2,15 @@ export class FabricApiError extends Error {
|
|
|
2
2
|
statusCode;
|
|
3
3
|
errorCode;
|
|
4
4
|
relatedResource;
|
|
5
|
-
|
|
5
|
+
requestId;
|
|
6
|
+
errorDetails;
|
|
7
|
+
constructor(message, statusCode, errorCode, relatedResource, requestId, errorDetails) {
|
|
6
8
|
super(message);
|
|
7
9
|
this.statusCode = statusCode;
|
|
8
10
|
this.errorCode = errorCode;
|
|
9
11
|
this.relatedResource = relatedResource;
|
|
12
|
+
this.requestId = requestId;
|
|
13
|
+
this.errorDetails = errorDetails;
|
|
10
14
|
this.name = "FabricApiError";
|
|
11
15
|
}
|
|
12
16
|
}
|
|
@@ -18,6 +22,11 @@ export function formatToolError(error) {
|
|
|
18
22
|
message += `\nError code: ${error.errorCode}`;
|
|
19
23
|
if (error.relatedResource)
|
|
20
24
|
message += `\nRelated resource: ${error.relatedResource}`;
|
|
25
|
+
if (error.requestId)
|
|
26
|
+
message += `\nRequest ID: ${error.requestId}`;
|
|
27
|
+
if (error.errorDetails && error.errorDetails.length > 0) {
|
|
28
|
+
message += `\nDetails: ${JSON.stringify(error.errorDetails)}`;
|
|
29
|
+
}
|
|
21
30
|
}
|
|
22
31
|
else if (error instanceof Error) {
|
|
23
32
|
message = 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;
|
|
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"}
|
package/build/core/lro.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lro.d.ts","sourceRoot":"","sources":["../../src/core/lro.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"lro.d.ts","sourceRoot":"","sources":["../../src/core/lro.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,UAAU;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAUD,wBAAsB,aAAa,CACjC,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,UAAU,GACnB,OAAO,CAAC,cAAc,CAAC,CAyDzB;AAED,wBAAsB,kBAAkB,CAAC,CAAC,EACxC,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CASxB"}
|
package/build/core/lro.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { FabricApiError } from "./errors.js";
|
|
2
|
+
import { logger } from "../utils/logger.js";
|
|
2
3
|
const DEFAULT_POLL_INTERVAL = 2000;
|
|
3
4
|
const DEFAULT_TIMEOUT = 300000; // 5 minutes
|
|
5
|
+
const COMPONENT = "LRO";
|
|
4
6
|
function sleep(ms) {
|
|
5
7
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
6
8
|
}
|
|
@@ -8,16 +10,41 @@ export async function pollOperation(client, operationId, options) {
|
|
|
8
10
|
const pollInterval = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL;
|
|
9
11
|
const timeout = options?.timeoutMs ?? DEFAULT_TIMEOUT;
|
|
10
12
|
const start = Date.now();
|
|
13
|
+
let pollCount = 0;
|
|
14
|
+
logger.debug(COMPONENT, `Polling started for operation ${operationId}`, {
|
|
15
|
+
pollIntervalMs: pollInterval,
|
|
16
|
+
timeoutMs: timeout,
|
|
17
|
+
});
|
|
11
18
|
while (true) {
|
|
19
|
+
pollCount++;
|
|
12
20
|
const response = await client.get(`/operations/${operationId}`);
|
|
13
21
|
const state = response.data;
|
|
22
|
+
logger.debug(COMPONENT, `Poll #${pollCount} for ${operationId}`, {
|
|
23
|
+
status: state.status,
|
|
24
|
+
elapsedMs: Date.now() - start,
|
|
25
|
+
});
|
|
14
26
|
if (state.status === "Succeeded" || state.status === "Failed" || state.status === "Cancelled") {
|
|
15
27
|
if (state.status === "Failed") {
|
|
28
|
+
logger.error(COMPONENT, `Operation ${operationId} failed`, {
|
|
29
|
+
errorMessage: state.error?.message,
|
|
30
|
+
errorCode: state.error?.errorCode,
|
|
31
|
+
totalPolls: pollCount,
|
|
32
|
+
totalMs: Date.now() - start,
|
|
33
|
+
});
|
|
16
34
|
throw new FabricApiError(state.error?.message ?? "Operation failed", 500, state.error?.errorCode);
|
|
17
35
|
}
|
|
36
|
+
logger.debug(COMPONENT, `Operation ${operationId} completed`, {
|
|
37
|
+
status: state.status,
|
|
38
|
+
totalPolls: pollCount,
|
|
39
|
+
totalMs: Date.now() - start,
|
|
40
|
+
});
|
|
18
41
|
return state;
|
|
19
42
|
}
|
|
20
43
|
if (Date.now() - start > timeout) {
|
|
44
|
+
logger.error(COMPONENT, `Operation ${operationId} timed out`, {
|
|
45
|
+
totalPolls: pollCount,
|
|
46
|
+
totalMs: Date.now() - start,
|
|
47
|
+
});
|
|
21
48
|
throw new FabricApiError(`Operation ${operationId} timed out after ${timeout / 1000}s`, 408, "OperationTimeout");
|
|
22
49
|
}
|
|
23
50
|
await sleep(pollInterval);
|
|
@@ -25,10 +52,12 @@ export async function pollOperation(client, operationId, options) {
|
|
|
25
52
|
}
|
|
26
53
|
export async function getOperationResult(client, operationId) {
|
|
27
54
|
try {
|
|
55
|
+
logger.debug(COMPONENT, `Fetching result for operation ${operationId}`);
|
|
28
56
|
const response = await client.get(`/operations/${operationId}/result`);
|
|
29
57
|
return response.data;
|
|
30
58
|
}
|
|
31
59
|
catch {
|
|
60
|
+
logger.debug(COMPONENT, `No result available for operation ${operationId}`);
|
|
32
61
|
return undefined;
|
|
33
62
|
}
|
|
34
63
|
}
|
package/build/core/lro.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lro.js","sourceRoot":"","sources":["../../src/core/lro.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"lro.js","sourceRoot":"","sources":["../../src/core/lro.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/core/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/core/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAM1D,wBAAsB,WAAW,CAAC,CAAC,EACjC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,MAAgB,GAC1B,OAAO,CAAC,CAAC,EAAE,CAAC,CAwCd"}
|
package/build/core/pagination.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
|
+
import { logger } from "../utils/logger.js";
|
|
2
|
+
const COMPONENT = "Pagination";
|
|
1
3
|
export async function paginateAll(client, path, resultKey = "value") {
|
|
2
4
|
const all = [];
|
|
3
5
|
let currentPath = path;
|
|
6
|
+
let pageCount = 0;
|
|
4
7
|
while (currentPath) {
|
|
8
|
+
pageCount++;
|
|
5
9
|
const isFullUrl = currentPath.startsWith("http");
|
|
6
10
|
const response = isFullUrl
|
|
7
11
|
? await client.getFullUrl(currentPath)
|
|
@@ -9,6 +13,10 @@ export async function paginateAll(client, path, resultKey = "value") {
|
|
|
9
13
|
const data = response.data;
|
|
10
14
|
const items = data[resultKey] ?? [];
|
|
11
15
|
all.push(...items);
|
|
16
|
+
logger.debug(COMPONENT, `Page ${pageCount} for ${path}`, {
|
|
17
|
+
itemsThisPage: items.length,
|
|
18
|
+
totalSoFar: all.length,
|
|
19
|
+
});
|
|
12
20
|
const continuationUri = data.continuationUri;
|
|
13
21
|
const continuationToken = data.continuationToken;
|
|
14
22
|
if (continuationUri) {
|
|
@@ -22,6 +30,10 @@ export async function paginateAll(client, path, resultKey = "value") {
|
|
|
22
30
|
currentPath = null;
|
|
23
31
|
}
|
|
24
32
|
}
|
|
33
|
+
logger.debug(COMPONENT, `Pagination complete for ${path}`, {
|
|
34
|
+
totalPages: pageCount,
|
|
35
|
+
totalItems: all.length,
|
|
36
|
+
});
|
|
25
37
|
return all;
|
|
26
38
|
}
|
|
27
39
|
//# sourceMappingURL=pagination.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/core/pagination.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/core/pagination.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,MAAM,SAAS,GAAG,YAAY,CAAC;AAE/B,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAoB,EACpB,IAAY,EACZ,YAAoB,OAAO;IAE3B,MAAM,GAAG,GAAQ,EAAE,CAAC;IACpB,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,OAAO,WAAW,EAAE,CAAC;QACnB,SAAS,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,SAAS;YACxB,CAAC,CAAC,MAAM,MAAM,CAAC,UAAU,CAA0B,WAAW,CAAC;YAC/D,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,CAA0B,WAAW,CAAC,CAAC;QAE3D,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC3B,MAAM,KAAK,GAAI,IAAI,CAAC,SAAS,CAAS,IAAI,EAAE,CAAC;QAC7C,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QAEnB,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,SAAS,QAAQ,IAAI,EAAE,EAAE;YACvD,aAAa,EAAE,KAAK,CAAC,MAAM;YAC3B,UAAU,EAAE,GAAG,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,IAAI,CAAC,eAA4C,CAAC;QAC1E,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAA8C,CAAC;QAE9E,IAAI,eAAe,EAAE,CAAC;YACpB,WAAW,GAAG,eAAe,CAAC;QAChC,CAAC;aAAM,IAAI,iBAAiB,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACjD,WAAW,GAAG,GAAG,IAAI,GAAG,SAAS,qBAAqB,iBAAiB,EAAE,CAAC;QAC5E,CAAC;aAAM,CAAC;YACN,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,2BAA2B,IAAI,EAAE,EAAE;QACzD,UAAU,EAAE,SAAS;QACrB,UAAU,EAAE,GAAG,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/build/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createServer } from "./server.js";
|
|
3
|
+
import { logger } from "./utils/logger.js";
|
|
3
4
|
const transport = process.env.TRANSPORT ?? "stdio";
|
|
4
5
|
async function startStdio() {
|
|
5
6
|
const { StdioServerTransport } = await import("@modelcontextprotocol/sdk/server/stdio.js");
|
|
@@ -7,6 +8,9 @@ async function startStdio() {
|
|
|
7
8
|
const stdioTransport = new StdioServerTransport();
|
|
8
9
|
await server.connect(stdioTransport);
|
|
9
10
|
console.error("MCP Fabric API server running on stdio");
|
|
11
|
+
if (logger.isDebug()) {
|
|
12
|
+
logger.info("Server", "Debug logging enabled — set LOG_LEVEL=info or remove LOG_LEVEL to disable");
|
|
13
|
+
}
|
|
10
14
|
}
|
|
11
15
|
async function startHttp() {
|
|
12
16
|
const { default: express } = await import("express");
|
|
@@ -68,6 +72,9 @@ async function startHttp() {
|
|
|
68
72
|
});
|
|
69
73
|
app.listen(port, () => {
|
|
70
74
|
console.error(`MCP Fabric API server running on http://localhost:${port}/mcp`);
|
|
75
|
+
if (logger.isDebug()) {
|
|
76
|
+
logger.info("Server", "Debug logging enabled — set LOG_LEVEL=info or remove LOG_LEVEL to disable");
|
|
77
|
+
}
|
|
71
78
|
});
|
|
72
79
|
}
|
|
73
80
|
if (transport === "http") {
|
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;AAE3C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC;AAEnD,KAAK,UAAU,UAAU;IACvB,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAC3C,2CAA2C,CAC5C,CAAC;IACF,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,cAAc,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAClD,MAAM,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACrC,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/build/server.js
CHANGED
|
@@ -31,7 +31,7 @@ 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.5.0",
|
|
35
35
|
});
|
|
36
36
|
const tokenManager = options?.tokenManager ?? new TokenManager();
|
|
37
37
|
const fabricClient = new FabricClient(tokenManager);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export type LogLevel = "info" | "debug";
|
|
2
|
+
export declare const logger: {
|
|
3
|
+
info(component: string, message: string, extra?: Record<string, unknown>): void;
|
|
4
|
+
debug(component: string, message: string, extra?: Record<string, unknown>): void;
|
|
5
|
+
warn(component: string, message: string, extra?: Record<string, unknown>): void;
|
|
6
|
+
error(component: string, message: string, extra?: Record<string, unknown>): void;
|
|
7
|
+
isDebug(): boolean;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Redact sensitive headers (Authorization) for safe logging.
|
|
11
|
+
* Returns a plain object with header names lowercased.
|
|
12
|
+
*/
|
|
13
|
+
export declare function safeHeaders(headers: Headers): Record<string, string>;
|
|
14
|
+
/**
|
|
15
|
+
* Summarize definition parts for debug logging without exposing payload content.
|
|
16
|
+
* Logs part path, payloadType, and payload byte size only.
|
|
17
|
+
*/
|
|
18
|
+
export declare function summarizeDefinitionParts(parts: Array<{
|
|
19
|
+
path: string;
|
|
20
|
+
payload: string;
|
|
21
|
+
payloadType: string;
|
|
22
|
+
}>): Array<{
|
|
23
|
+
path: string;
|
|
24
|
+
payloadType: string;
|
|
25
|
+
payloadBytes: number;
|
|
26
|
+
}>;
|
|
27
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAgBxC,eAAO,MAAM,MAAM;oBACD,MAAM,WAAW,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;qBAI9D,MAAM,WAAW,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;oBAMhE,MAAM,WAAW,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;qBAI9D,MAAM,WAAW,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;eAIrE,OAAO;CAGnB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWpE;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,GACnE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAMpE"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
const currentLevel = process.env.LOG_LEVEL?.toLowerCase() === "debug" ? "debug" : "info";
|
|
2
|
+
function timestamp() {
|
|
3
|
+
return new Date().toISOString();
|
|
4
|
+
}
|
|
5
|
+
function format(level, component, message, extra) {
|
|
6
|
+
const parts = [`[${timestamp()}] [${level.toUpperCase()}] [${component}] ${message}`];
|
|
7
|
+
if (extra && Object.keys(extra).length > 0) {
|
|
8
|
+
parts.push(JSON.stringify(extra));
|
|
9
|
+
}
|
|
10
|
+
return parts.join(" ");
|
|
11
|
+
}
|
|
12
|
+
export const logger = {
|
|
13
|
+
info(component, message, extra) {
|
|
14
|
+
console.error(format("info", component, message, extra));
|
|
15
|
+
},
|
|
16
|
+
debug(component, message, extra) {
|
|
17
|
+
if (currentLevel === "debug") {
|
|
18
|
+
console.error(format("debug", component, message, extra));
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
warn(component, message, extra) {
|
|
22
|
+
console.error(format("warn", component, message, extra));
|
|
23
|
+
},
|
|
24
|
+
error(component, message, extra) {
|
|
25
|
+
console.error(format("error", component, message, extra));
|
|
26
|
+
},
|
|
27
|
+
isDebug() {
|
|
28
|
+
return currentLevel === "debug";
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Redact sensitive headers (Authorization) for safe logging.
|
|
33
|
+
* Returns a plain object with header names lowercased.
|
|
34
|
+
*/
|
|
35
|
+
export function safeHeaders(headers) {
|
|
36
|
+
const result = {};
|
|
37
|
+
headers.forEach((value, key) => {
|
|
38
|
+
const lower = key.toLowerCase();
|
|
39
|
+
if (lower === "authorization") {
|
|
40
|
+
result[lower] = "Bearer [REDACTED]";
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
result[lower] = value;
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Summarize definition parts for debug logging without exposing payload content.
|
|
50
|
+
* Logs part path, payloadType, and payload byte size only.
|
|
51
|
+
*/
|
|
52
|
+
export function summarizeDefinitionParts(parts) {
|
|
53
|
+
return parts.map((p) => ({
|
|
54
|
+
path: p.path,
|
|
55
|
+
payloadType: p.payloadType,
|
|
56
|
+
payloadBytes: p.payload.length,
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,MAAM,YAAY,GAAc,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,EAAe,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;AAEjH,SAAS,SAAS;IAChB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,MAAM,CAAC,KAAa,EAAE,SAAiB,EAAE,OAAe,EAAE,KAA+B;IAChG,MAAM,KAAK,GAAG,CAAC,IAAI,SAAS,EAAE,MAAM,KAAK,CAAC,WAAW,EAAE,MAAM,SAAS,KAAK,OAAO,EAAE,CAAC,CAAC;IACtF,IAAI,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,CAAC,SAAiB,EAAE,OAAe,EAAE,KAA+B;QACtE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,SAAiB,EAAE,OAAe,EAAE,KAA+B;QACvE,IAAI,YAAY,KAAK,OAAO,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,IAAI,CAAC,SAAiB,EAAE,OAAe,EAAE,KAA+B;QACtE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,SAAiB,EAAE,OAAe,EAAE,KAA+B;QACvE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO;QACL,OAAO,YAAY,KAAK,OAAO,CAAC;IAClC,CAAC;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAChC,IAAI,KAAK,KAAK,eAAe,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,GAAG,mBAAmB,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACtC,KAAoE;IAEpE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM;KAC/B,CAAC,CAAC,CAAC;AACN,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@einlogic/mcp-fabric-api",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
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
5
|
"type": "module",
|
|
6
6
|
"main": "build/index.js",
|