@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 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;AAKxD,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;IAuCtB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAM1D,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAU3E,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAU3E,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAS7D,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;CAKvE"}
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
- throw new FabricApiError(`Rate limited. Retry after ${waitMs / 1000}s`, 429, "TooManyRequests");
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
- throw new FabricApiError(errorBody?.message ?? response.statusText, response.status, errorBody?.errorCode ?? undefined, errorBody?.relatedResource ?? undefined);
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(`${FABRIC_BASE_URL}${path}`, { headers });
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(`${FABRIC_BASE_URL}${path}`, {
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(`${FABRIC_BASE_URL}${path}`, {
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(`${FABRIC_BASE_URL}${path}`, {
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":"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"}
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;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAWvD,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;CA8D3B"}
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":"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"}
1
+ {"version":3,"file":"kusto-client.js","sourceRoot":"","sources":["../../src/client/kusto-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,SAAS,GAAG,aAAa,CAAC;AAShC,MAAM,OAAO,WAAW;IACF;IAApB,YAAoB,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IAAG,CAAC;IAElD,KAAK,CAAC,YAAY,CAChB,eAAuB,EACvB,QAAgB,EAChB,GAAW,EACX,UAAkB,gBAAgB;QAElC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;QAEtD,MAAM,GAAG,GAAG,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,gBAAgB,CAAC;QACnE,MAAM,IAAI,GAAG;YACX,EAAE,EAAE,QAAQ;YACZ,GAAG,EAAE,GAAG;YACR,UAAU,EAAE;gBACV,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU;oBACzB,oBAAoB,EAAE,OAAO;iBAC9B;aACF;SACF,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,KAAK,EAAE;gBAChC,cAAc,EAAE,iCAAiC;gBACjD,MAAM,EAAE,kBAAkB;aAC3B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAE1C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,IAAI,WAAmB,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,WAAW,GAAI,SAAqC,EAAE,KAAK;oBACzD,CAAC,CAAC,IAAI,CAAC,SAAS,CAAE,SAAqC,CAAC,KAAK,CAAC;oBAC9D,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,WAAW,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACtC,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,kBAAkB,EAAE;gBAC1C,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,QAAQ;gBACR,UAAU;gBACV,WAAW;aACZ,CAAC,CAAC;YACH,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,MAAM,WAAW,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmB,CAAC;QAEzD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAC/B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,WAAW,IAAI,CAAC,CAAC,SAAS,KAAK,eAAe,CACtE,CAAC;QAEF,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,aAAa,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACvE,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAE7C,MAAM,IAAI,GAA8B,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC7D,MAAM,MAAM,GAA4B,EAAE,CAAC;YAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAC9B,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,qBAAqB,EAAE;YAC7C,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,QAAQ;YACR,UAAU;YACV,WAAW,EAAE,OAAO,CAAC,MAAM;YAC3B,QAAQ,EAAE,IAAI,CAAC,MAAM;SACtB,CAAC,CAAC;QAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAClD,CAAC;CACF"}
@@ -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;AAKxD,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;IAoCtB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAM3D,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAU5E,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;CAQrE"}
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
- throw new FabricApiError(`Rate limited. Retry after ${waitMs / 1000}s`, 429, "TooManyRequests");
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
- throw new FabricApiError(errorBody?.message ?? response.statusText, response.status, errorBody?.errorCode ?? undefined);
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(`${POWERBI_BASE_URL}${path}`, { headers });
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(`${POWERBI_BASE_URL}${path}`, {
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(`${POWERBI_BASE_URL}${path}`, {
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":"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"}
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;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAKvD,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;CAsE3B"}
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":"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"}
1
+ {"version":3,"file":"sql-client.js","sourceRoot":"","sources":["../../src/client/sql-client.ts"],"names":[],"mappings":"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"}
@@ -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
- constructor(message: string, statusCode: number, errorCode?: string | undefined, relatedResource?: string | undefined);
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;gBAH/B,OAAO,EAAE,MAAM,EACR,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,YAAA,EAClB,eAAe,CAAC,EAAE,MAAM,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,CAejH"}
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"}
@@ -2,11 +2,15 @@ export class FabricApiError extends Error {
2
2
  statusCode;
3
3
  errorCode;
4
4
  relatedResource;
5
- constructor(message, statusCode, errorCode, relatedResource) {
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;
@@ -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;IAJT,YACE,OAAe,EACR,UAAkB,EAClB,SAAkB,EAClB,eAAwB;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJR,eAAU,GAAV,UAAU,CAAQ;QAClB,cAAS,GAAT,SAAS,CAAS;QAClB,oBAAe,GAAf,eAAe,CAAS;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;IACvF,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,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 +1 @@
1
- {"version":3,"file":"lro.d.ts","sourceRoot":"","sources":["../../src/core/lro.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,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;AASD,wBAAsB,aAAa,CACjC,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,UAAU,GACnB,OAAO,CAAC,cAAc,CAAC,CA8BzB;AAED,wBAAsB,kBAAkB,CAAC,CAAC,EACxC,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAOxB"}
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"lro.js","sourceRoot":"","sources":["../../src/core/lro.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQ7C,MAAM,qBAAqB,GAAG,IAAI,CAAC;AACnC,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,YAAY;AAE5C,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAoB,EACpB,WAAmB,EACnB,OAAoB;IAEpB,MAAM,YAAY,GAAG,OAAO,EAAE,cAAc,IAAI,qBAAqB,CAAC;IACtE,MAAM,OAAO,GAAG,OAAO,EAAE,SAAS,IAAI,eAAe,CAAC;IACtD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEzB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAiB,eAAe,WAAW,EAAE,CAAC,CAAC;QAChF,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC;QAE5B,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAC9F,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC9B,MAAM,IAAI,cAAc,CACtB,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,kBAAkB,EAC1C,GAAG,EACH,KAAK,CAAC,KAAK,EAAE,SAAS,CACvB,CAAC;YACJ,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,OAAO,EAAE,CAAC;YACjC,MAAM,IAAI,cAAc,CACtB,aAAa,WAAW,oBAAoB,OAAO,GAAG,IAAI,GAAG,EAC7D,GAAG,EACH,kBAAkB,CACnB,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAoB,EACpB,WAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAI,eAAe,WAAW,SAAS,CAAC,CAAC;QAC1E,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,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;AAG1D,wBAAsB,WAAW,CAAC,CAAC,EACjC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,MAAgB,GAC1B,OAAO,CAAC,CAAC,EAAE,CAAC,CA4Bd"}
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"}
@@ -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":"AAGA,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;IAEtC,OAAO,WAAW,EAAE,CAAC;QACnB,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,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,OAAO,GAAG,CAAC;AACb,CAAC"}
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") {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
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.1.1",
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.4.1",
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",