@digital-science-dsl/dimensions-analytics-mcp 1.0.3 → 1.0.4
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/CHANGELOG.md +6 -0
- package/dist/client/deployment-config.d.ts +3 -17
- package/dist/client/deployment-config.d.ts.map +1 -1
- package/dist/client/deployment-config.js +3 -23
- package/dist/client/deployment-config.js.map +1 -1
- package/dist/client/http-client.d.ts +4 -26
- package/dist/client/http-client.d.ts.map +1 -1
- package/dist/client/http-client.js +26 -79
- package/dist/client/http-client.js.map +1 -1
- package/dist/client/internal-dsl-client.d.ts +15 -3
- package/dist/client/internal-dsl-client.d.ts.map +1 -1
- package/dist/client/internal-dsl-client.js +32 -4
- package/dist/client/internal-dsl-client.js.map +1 -1
- package/dist/client/request-retry.d.ts +39 -0
- package/dist/client/request-retry.d.ts.map +1 -0
- package/dist/client/request-retry.js +85 -0
- package/dist/client/request-retry.js.map +1 -0
- package/dist/client/usage-context.d.ts +29 -0
- package/dist/client/usage-context.d.ts.map +1 -0
- package/dist/client/usage-context.js +33 -0
- package/dist/client/usage-context.js.map +1 -0
- package/dist/client/usage-headers.d.ts +19 -0
- package/dist/client/usage-headers.d.ts.map +1 -0
- package/dist/client/usage-headers.js +39 -0
- package/dist/client/usage-headers.js.map +1 -0
- package/dist/dsl/client.d.ts.map +1 -1
- package/dist/dsl/client.js +7 -4
- package/dist/dsl/client.js.map +1 -1
- package/dist/mcp/http-server.d.ts.map +1 -1
- package/dist/mcp/http-server.js +6 -0
- package/dist/mcp/http-server.js.map +1 -1
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +7 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/analytics.d.ts.map +1 -1
- package/dist/mcp/tools/analytics.js +5 -4
- package/dist/mcp/tools/analytics.js.map +1 -1
- package/dist/mcp/tools/fetch-search-pages.d.ts.map +1 -1
- package/dist/mcp/tools/fetch-search-pages.js +2 -1
- package/dist/mcp/tools/fetch-search-pages.js.map +1 -1
- package/dist/mcp/tools/functions.d.ts.map +1 -1
- package/dist/mcp/tools/functions.js +3 -2
- package/dist/mcp/tools/functions.js.map +1 -1
- package/dist/mcp/tools/lookup.d.ts.map +1 -1
- package/dist/mcp/tools/lookup.js +4 -3
- package/dist/mcp/tools/lookup.js.map +1 -1
- package/dist/mcp/tools/query.d.ts.map +1 -1
- package/dist/mcp/tools/query.js +2 -1
- package/dist/mcp/tools/query.js.map +1 -1
- package/dist/mcp/tools/schema.d.ts.map +1 -1
- package/dist/mcp/tools/schema.js +3 -2
- package/dist/mcp/tools/schema.js.map +1 -1
- package/dist/mcp/tools/search.d.ts.map +1 -1
- package/dist/mcp/tools/search.js +2 -1
- package/dist/mcp/tools/search.js.map +1 -1
- package/dist/mcp/usage-tracking.d.ts +28 -0
- package/dist/mcp/usage-tracking.d.ts.map +1 -0
- package/dist/mcp/usage-tracking.js +52 -0
- package/dist/mcp/usage-tracking.js.map +1 -0
- package/package.json +1 -1
- package/src/client/deployment-config.ts +3 -36
- package/src/client/http-client.ts +27 -93
- package/src/client/internal-dsl-client.ts +48 -4
- package/src/client/request-retry.ts +115 -0
- package/src/client/usage-context.ts +53 -0
- package/src/client/usage-headers.ts +45 -0
- package/src/dsl/client.ts +7 -4
- package/src/mcp/http-server.ts +9 -0
- package/src/mcp/server.ts +12 -0
- package/src/mcp/tools/analytics.ts +9 -4
- package/src/mcp/tools/fetch-search-pages.ts +3 -1
- package/src/mcp/tools/functions.ts +5 -2
- package/src/mcp/tools/lookup.ts +7 -3
- package/src/mcp/tools/query.ts +3 -1
- package/src/mcp/tools/schema.ts +5 -2
- package/src/mcp/tools/search.ts +3 -1
- package/src/mcp/usage-tracking.ts +72 -0
- package/test/client/deployment-config.test.ts +1 -25
- package/test/client/http-client.test.ts +17 -17
- package/test/client/internal-dsl-client.test.ts +73 -10
- package/test/client/request-retry.test.ts +55 -0
- package/test/client/usage-headers.test.ts +45 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
} from "../../src/client/errors.js";
|
|
11
11
|
import { HttpClient } from "../../src/client/http-client.js";
|
|
12
12
|
import { RateLimiter } from "../../src/client/rate-limiter.js";
|
|
13
|
+
import * as requestRetry from "../../src/client/request-retry.js";
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* Creates a mock auth provider for testing.
|
|
@@ -42,6 +43,7 @@ describe("HttpClient", () => {
|
|
|
42
43
|
|
|
43
44
|
afterEach(() => {
|
|
44
45
|
globalThis.fetch = originalFetch;
|
|
46
|
+
requestRetry.resetRequestRetryDelayFn();
|
|
45
47
|
vi.restoreAllMocks();
|
|
46
48
|
});
|
|
47
49
|
|
|
@@ -156,7 +158,7 @@ describe("HttpClient", () => {
|
|
|
156
158
|
|
|
157
159
|
describe("retry behavior", () => {
|
|
158
160
|
it("retries on 429 rate limit error", async () => {
|
|
159
|
-
|
|
161
|
+
requestRetry.setRequestRetryDelayFn(async () => {});
|
|
160
162
|
|
|
161
163
|
const mockFetch = vi
|
|
162
164
|
.fn()
|
|
@@ -239,7 +241,7 @@ describe("HttpClient", () => {
|
|
|
239
241
|
});
|
|
240
242
|
|
|
241
243
|
it("exhausts retries and throws RateLimitError", async () => {
|
|
242
|
-
|
|
244
|
+
requestRetry.setRequestRetryDelayFn(async () => {});
|
|
243
245
|
|
|
244
246
|
const mockFetch = vi.fn().mockResolvedValue({
|
|
245
247
|
ok: false,
|
|
@@ -279,9 +281,8 @@ describe("HttpClient", () => {
|
|
|
279
281
|
rateLimiter,
|
|
280
282
|
});
|
|
281
283
|
|
|
282
|
-
const delaySpy = vi
|
|
283
|
-
|
|
284
|
-
.mockResolvedValue(undefined as never);
|
|
284
|
+
const delaySpy = vi.fn(async () => {});
|
|
285
|
+
requestRetry.setRequestRetryDelayFn(delaySpy);
|
|
285
286
|
|
|
286
287
|
const mockFetch = vi
|
|
287
288
|
.fn()
|
|
@@ -304,9 +305,8 @@ describe("HttpClient", () => {
|
|
|
304
305
|
});
|
|
305
306
|
|
|
306
307
|
it("uses exponential backoff for 5xx errors", async () => {
|
|
307
|
-
const delaySpy = vi
|
|
308
|
-
|
|
309
|
-
.mockResolvedValue(undefined as never);
|
|
308
|
+
const delaySpy = vi.fn(async () => {});
|
|
309
|
+
requestRetry.setRequestRetryDelayFn(delaySpy);
|
|
310
310
|
|
|
311
311
|
const mockFetch = vi
|
|
312
312
|
.fn()
|
|
@@ -349,9 +349,8 @@ describe("HttpClient", () => {
|
|
|
349
349
|
retryDelay: 100000, // Very large base delay
|
|
350
350
|
});
|
|
351
351
|
|
|
352
|
-
const delaySpy = vi
|
|
353
|
-
|
|
354
|
-
.mockResolvedValue(undefined as never);
|
|
352
|
+
const delaySpy = vi.fn(async () => {});
|
|
353
|
+
requestRetry.setRequestRetryDelayFn(delaySpy);
|
|
355
354
|
|
|
356
355
|
const mockFetch = vi
|
|
357
356
|
.fn()
|
|
@@ -385,9 +384,10 @@ describe("HttpClient", () => {
|
|
|
385
384
|
rateLimiter,
|
|
386
385
|
});
|
|
387
386
|
|
|
388
|
-
const
|
|
389
|
-
|
|
390
|
-
.
|
|
387
|
+
const delays: number[] = [];
|
|
388
|
+
requestRetry.setRequestRetryDelayFn(async (ms) => {
|
|
389
|
+
delays.push(ms);
|
|
390
|
+
});
|
|
391
391
|
|
|
392
392
|
const mockFetch = vi
|
|
393
393
|
.fn()
|
|
@@ -405,8 +405,8 @@ describe("HttpClient", () => {
|
|
|
405
405
|
|
|
406
406
|
await limitedClient.query("search publications");
|
|
407
407
|
|
|
408
|
-
expect(
|
|
409
|
-
expect(
|
|
408
|
+
expect(delays).toHaveLength(1);
|
|
409
|
+
expect(delays[0]).toBe(60_000);
|
|
410
410
|
});
|
|
411
411
|
});
|
|
412
412
|
|
|
@@ -865,7 +865,7 @@ describe("HttpClient", () => {
|
|
|
865
865
|
});
|
|
866
866
|
|
|
867
867
|
it("retries postJson on rate limit error", async () => {
|
|
868
|
-
|
|
868
|
+
requestRetry.setRequestRetryDelayFn(async () => {});
|
|
869
869
|
|
|
870
870
|
const mockFetch = vi
|
|
871
871
|
.fn()
|
|
@@ -6,6 +6,16 @@
|
|
|
6
6
|
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
7
7
|
import { QuerySyntaxError } from "../../src/client/errors.js";
|
|
8
8
|
import { InternalDslClient } from "../../src/client/internal-dsl-client.js";
|
|
9
|
+
import * as requestRetry from "../../src/client/request-retry.js";
|
|
10
|
+
import { runWithMcpTool, setMcpUsageSession } from "../../src/client/usage-context.js";
|
|
11
|
+
import {
|
|
12
|
+
USAGE_HEADER_CHANNEL,
|
|
13
|
+
USAGE_HEADER_MCP_CLIENT,
|
|
14
|
+
USAGE_HEADER_MCP_DEPLOYMENT,
|
|
15
|
+
USAGE_HEADER_MCP_SESSION_ID,
|
|
16
|
+
USAGE_HEADER_MCP_TOOL,
|
|
17
|
+
USAGE_HEADER_MCP_VERSION,
|
|
18
|
+
} from "../../src/client/usage-headers.js";
|
|
9
19
|
import { mockFetchJson } from "./helpers/mock-fetch.js";
|
|
10
20
|
|
|
11
21
|
const CONFIG = {
|
|
@@ -22,10 +32,18 @@ describe("InternalDslClient", () => {
|
|
|
22
32
|
|
|
23
33
|
afterEach(() => {
|
|
24
34
|
globalThis.fetch = originalFetch;
|
|
35
|
+
requestRetry.resetRequestRetryDelayFn();
|
|
25
36
|
vi.restoreAllMocks();
|
|
26
37
|
});
|
|
27
38
|
|
|
28
|
-
it("posts JSON query with service auth and
|
|
39
|
+
it("posts JSON query with service auth, user header, and MCP usage headers", async () => {
|
|
40
|
+
setMcpUsageSession({
|
|
41
|
+
sessionId: "550e8400-e29b-41d4-a716-446655440000",
|
|
42
|
+
deployment: "hosted",
|
|
43
|
+
client: "cursor",
|
|
44
|
+
version: "1.0.4",
|
|
45
|
+
});
|
|
46
|
+
|
|
29
47
|
const responseBody = { publications: [] };
|
|
30
48
|
const mock = mockFetchJson(responseBody);
|
|
31
49
|
|
|
@@ -35,7 +53,9 @@ describe("InternalDslClient", () => {
|
|
|
35
53
|
clientIp: "198.51.100.4",
|
|
36
54
|
});
|
|
37
55
|
|
|
38
|
-
const result = await
|
|
56
|
+
const result = await runWithMcpTool("search_publications", () =>
|
|
57
|
+
client.query("search publications return publications limit 1"),
|
|
58
|
+
);
|
|
39
59
|
|
|
40
60
|
expect(result).toEqual(responseBody);
|
|
41
61
|
expect(mock).toHaveBeenCalledWith(
|
|
@@ -47,20 +67,19 @@ describe("InternalDslClient", () => {
|
|
|
47
67
|
"X-DIMENSIONS-USER": "user@example.com",
|
|
48
68
|
"X-Forwarded-For": "198.51.100.4",
|
|
49
69
|
Authorization: `Basic ${Buffer.from("svc:secret").toString("base64")}`,
|
|
70
|
+
[USAGE_HEADER_CHANNEL]: "mcp",
|
|
71
|
+
[USAGE_HEADER_MCP_TOOL]: "search_publications",
|
|
72
|
+
[USAGE_HEADER_MCP_SESSION_ID]: "550e8400-e29b-41d4-a716-446655440000",
|
|
73
|
+
[USAGE_HEADER_MCP_CLIENT]: "cursor",
|
|
74
|
+
[USAGE_HEADER_MCP_VERSION]: "1.0.4",
|
|
75
|
+
[USAGE_HEADER_MCP_DEPLOYMENT]: "hosted",
|
|
76
|
+
"User-Agent": "dimensions-analytics-mcp/1.0.4 (cursor)",
|
|
50
77
|
}),
|
|
51
78
|
body: JSON.stringify({
|
|
52
79
|
query: "search publications return publications limit 1",
|
|
53
80
|
dsl_schema: "external",
|
|
54
81
|
host: "app.example.com",
|
|
55
82
|
variant: "standard",
|
|
56
|
-
additional_logging_info: {
|
|
57
|
-
user: "user@example.com",
|
|
58
|
-
dimensions_user: "user@example.com",
|
|
59
|
-
channel: "mcp",
|
|
60
|
-
mcp_user: "mcp+user@example.com",
|
|
61
|
-
product_variant: "standard",
|
|
62
|
-
source: "dimensions-analytics-mcp-hosted",
|
|
63
|
-
},
|
|
64
83
|
}),
|
|
65
84
|
}),
|
|
66
85
|
);
|
|
@@ -76,4 +95,48 @@ describe("InternalDslClient", () => {
|
|
|
76
95
|
|
|
77
96
|
await expect(client.query("bad query")).rejects.toBeInstanceOf(QuerySyntaxError);
|
|
78
97
|
});
|
|
98
|
+
|
|
99
|
+
it("retries on 429 and 5xx like the public HttpClient", async () => {
|
|
100
|
+
requestRetry.setRequestRetryDelayFn(async () => {});
|
|
101
|
+
|
|
102
|
+
const mockFetch = vi
|
|
103
|
+
.fn()
|
|
104
|
+
.mockResolvedValueOnce({
|
|
105
|
+
ok: false,
|
|
106
|
+
status: 429,
|
|
107
|
+
statusText: "Too Many Requests",
|
|
108
|
+
json: () => Promise.resolve({ error: "rate limited" }),
|
|
109
|
+
})
|
|
110
|
+
.mockResolvedValueOnce({
|
|
111
|
+
ok: true,
|
|
112
|
+
json: () => Promise.resolve({ publications: [] }),
|
|
113
|
+
});
|
|
114
|
+
globalThis.fetch = mockFetch;
|
|
115
|
+
|
|
116
|
+
const client = new InternalDslClient({
|
|
117
|
+
config: CONFIG,
|
|
118
|
+
userEmail: "user@example.com",
|
|
119
|
+
clientIp: "198.51.100.4",
|
|
120
|
+
maxRetries: 2,
|
|
121
|
+
retryDelay: 10,
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
const result = await client.query("search publications return publications limit 1");
|
|
125
|
+
expect(result).toEqual({ publications: [] });
|
|
126
|
+
expect(mockFetch).toHaveBeenCalledTimes(2);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it("does not set X-Forwarded-For when clientIp is omitted", async () => {
|
|
130
|
+
mockFetchJson({ publications: [] });
|
|
131
|
+
|
|
132
|
+
const client = new InternalDslClient({
|
|
133
|
+
config: CONFIG,
|
|
134
|
+
userEmail: "user@example.com",
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
await client.query("search publications return publications limit 1");
|
|
138
|
+
|
|
139
|
+
const [, fetchOptions] = (globalThis.fetch as ReturnType<typeof vi.fn>).mock.calls[0];
|
|
140
|
+
expect(fetchOptions.headers["X-Forwarded-For"]).toBeUndefined();
|
|
141
|
+
});
|
|
79
142
|
});
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for shared request retry helpers.
|
|
3
|
+
* @module test/client/request-retry
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
7
|
+
import { NetworkError, RateLimitError, ServerError } from "../../src/client/errors.js";
|
|
8
|
+
import {
|
|
9
|
+
calculateRequestRetryDelay,
|
|
10
|
+
executeRequestWithRetry,
|
|
11
|
+
isRetryableRequestError,
|
|
12
|
+
resetRequestRetryDelayFn,
|
|
13
|
+
setRequestRetryDelayFn,
|
|
14
|
+
} from "../../src/client/request-retry.js";
|
|
15
|
+
|
|
16
|
+
describe("request-retry", () => {
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
resetRequestRetryDelayFn();
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it("identifies retryable errors", () => {
|
|
22
|
+
expect(isRetryableRequestError(new RateLimitError())).toBe(true);
|
|
23
|
+
expect(isRetryableRequestError(new ServerError("boom", 500))).toBe(true);
|
|
24
|
+
expect(isRetryableRequestError(new NetworkError("net"))).toBe(true);
|
|
25
|
+
expect(isRetryableRequestError(new Error("nope"))).toBe(false);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("retries transient failures then succeeds", async () => {
|
|
29
|
+
setRequestRetryDelayFn(async () => {});
|
|
30
|
+
|
|
31
|
+
let calls = 0;
|
|
32
|
+
const result = await executeRequestWithRetry(
|
|
33
|
+
async () => {
|
|
34
|
+
calls += 1;
|
|
35
|
+
if (calls < 2) {
|
|
36
|
+
throw new ServerError("temporary", 503);
|
|
37
|
+
}
|
|
38
|
+
return "ok";
|
|
39
|
+
},
|
|
40
|
+
{ maxRetries: 2, retryDelay: 10 },
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
expect(result).toBe("ok");
|
|
44
|
+
expect(calls).toBe(2);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("uses rate-limit retry delay when provided on the error", () => {
|
|
48
|
+
const delay = calculateRequestRetryDelay(
|
|
49
|
+
new RateLimitError("limited", 2, { remaining: 0, retryAfterMs: 3500 }),
|
|
50
|
+
0,
|
|
51
|
+
{ retryDelay: 10 },
|
|
52
|
+
);
|
|
53
|
+
expect(delay).toBe(3500);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for MCP usage header builder.
|
|
3
|
+
* @module test/client/usage-headers
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, expect, it } from "vitest";
|
|
7
|
+
import { runWithMcpTool, setMcpUsageSession } from "../../src/client/usage-context.js";
|
|
8
|
+
import {
|
|
9
|
+
buildMcpUsageHeaders,
|
|
10
|
+
buildMcpUserAgent,
|
|
11
|
+
USAGE_HEADER_CHANNEL,
|
|
12
|
+
USAGE_HEADER_MCP_TOOL,
|
|
13
|
+
} from "../../src/client/usage-headers.js";
|
|
14
|
+
|
|
15
|
+
describe("buildMcpUsageHeaders", () => {
|
|
16
|
+
it("returns empty object when no session is configured", () => {
|
|
17
|
+
expect(buildMcpUsageHeaders()).toEqual({});
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("includes session fields and active tool name", () => {
|
|
21
|
+
setMcpUsageSession({
|
|
22
|
+
sessionId: "session-1",
|
|
23
|
+
deployment: "local",
|
|
24
|
+
client: "stdio",
|
|
25
|
+
version: "1.0.4",
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const headers = runWithMcpTool("execute_dsl", () => buildMcpUsageHeaders());
|
|
29
|
+
|
|
30
|
+
expect(headers).toEqual({
|
|
31
|
+
[USAGE_HEADER_CHANNEL]: "mcp",
|
|
32
|
+
"X-Dimensions-MCP-Session-Id": "session-1",
|
|
33
|
+
"X-Dimensions-MCP-Client": "stdio",
|
|
34
|
+
"X-Dimensions-MCP-Version": "1.0.4",
|
|
35
|
+
"X-Dimensions-MCP-Deployment": "local",
|
|
36
|
+
[USAGE_HEADER_MCP_TOOL]: "execute_dsl",
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
describe("buildMcpUserAgent", () => {
|
|
42
|
+
it("formats version and client", () => {
|
|
43
|
+
expect(buildMcpUserAgent("1.0.4", "cursor")).toBe("dimensions-analytics-mcp/1.0.4 (cursor)");
|
|
44
|
+
});
|
|
45
|
+
});
|
package/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["./src/http-main.ts","./src/index.ts","./src/main.ts","./src/client/command.ts","./src/client/config.ts","./src/client/deployment-config.ts","./src/client/errors.ts","./src/client/http-client.ts","./src/client/index.ts","./src/client/internal-dsl-client.ts","./src/client/rate-limiter.ts","./src/client/resolve-api-key-user.ts","./src/client/types.ts","./src/client/auth/config-loaders.ts","./src/client/auth/factory.ts","./src/client/auth/index.ts","./src/client/auth/jwt-utils.ts","./src/client/auth/node.ts","./src/client/auth/schemas.ts","./src/client/auth/types.ts","./src/client/auth/decorators/index.ts","./src/client/auth/decorators/with-caching.ts","./src/client/auth/providers/index.ts","./src/client/auth/providers/jwt-auth-provider.ts","./src/client/config/index.ts","./src/client/config/loader.ts","./src/client/config/node.ts","./src/client/config/schemas.ts","./src/client/config/types.ts","./src/client/config/unified-loader.ts","./src/dsl/client.ts","./src/dsl/create-client.ts","./src/dsl/fluent-query-builder.ts","./src/dsl/index.ts","./src/dsl/pagination.ts","./src/dsl/query-builder.ts","./src/dsl/response-parser.ts","./src/dsl/usage-policy.ts","./src/dsl/commands/apply-filters.ts","./src/dsl/commands/index.ts","./src/dsl/commands/validate-input.ts","./src/dsl/commands/facet/index.ts","./src/dsl/commands/facet/schemas.ts","./src/dsl/commands/functions/ClassifyCommand.ts","./src/dsl/commands/functions/ExtractAffiliationsCommand.ts","./src/dsl/commands/functions/ExtractConceptsCommand.ts","./src/dsl/commands/functions/ExtractGrantsCommand.ts","./src/dsl/commands/functions/index.ts","./src/dsl/schema/cache.ts","./src/dsl/schema/extract.ts","./src/dsl/schema/index.ts","./src/dsl/schema/load.ts","./src/dsl/schema/store.ts","./src/dsl/schema/structured-entities.ts","./src/dsl/schema/summary.ts","./src/dsl/schema/types.ts","./src/dsl/schema/validation.ts","./src/dsl/types/buckets.ts","./src/dsl/types/common.ts","./src/dsl/types/entities.ts","./src/dsl/types/index.ts","./src/dsl/types/return-clauses.ts","./src/dsl/types/special-functions.ts","./src/dsl/types/vocabulary.ts","./src/dsl/utils/escape.ts","./src/dsl/utils/sanitize.ts","./src/dsl/utils/string-utils.ts","./src/dsl/utils/validate-field-name.ts","./src/mcp/batch-fetch.ts","./src/mcp/export-format.ts","./src/mcp/funder-org-names.ts","./src/mcp/http-server.ts","./src/mcp/server.ts","./src/mcp/shared-schema.ts","./src/mcp/utils.ts","./src/mcp/examples/dsl-examples.ts","./src/mcp/examples/usage-scenarios.ts","./src/mcp/middleware/field-aliases.ts","./src/mcp/resources/schema.ts","./src/mcp/schema/context.ts","./src/mcp/schema/index.ts","./src/mcp/tools/analytics-filters.ts","./src/mcp/tools/analytics.ts","./src/mcp/tools/fetch-search-pages.ts","./src/mcp/tools/functions.ts","./src/mcp/tools/lookup.ts","./src/mcp/tools/query.ts","./src/mcp/tools/schema.ts","./src/mcp/tools/search-entity-metadata.ts","./src/mcp/tools/search-input.ts","./src/mcp/tools/search.ts"],"version":"5.9.3"}
|
|
1
|
+
{"root":["./src/http-main.ts","./src/index.ts","./src/main.ts","./src/client/command.ts","./src/client/config.ts","./src/client/deployment-config.ts","./src/client/errors.ts","./src/client/http-client.ts","./src/client/index.ts","./src/client/internal-dsl-client.ts","./src/client/rate-limiter.ts","./src/client/request-retry.ts","./src/client/resolve-api-key-user.ts","./src/client/types.ts","./src/client/usage-context.ts","./src/client/usage-headers.ts","./src/client/auth/config-loaders.ts","./src/client/auth/factory.ts","./src/client/auth/index.ts","./src/client/auth/jwt-utils.ts","./src/client/auth/node.ts","./src/client/auth/schemas.ts","./src/client/auth/types.ts","./src/client/auth/decorators/index.ts","./src/client/auth/decorators/with-caching.ts","./src/client/auth/providers/index.ts","./src/client/auth/providers/jwt-auth-provider.ts","./src/client/config/index.ts","./src/client/config/loader.ts","./src/client/config/node.ts","./src/client/config/schemas.ts","./src/client/config/types.ts","./src/client/config/unified-loader.ts","./src/dsl/client.ts","./src/dsl/create-client.ts","./src/dsl/fluent-query-builder.ts","./src/dsl/index.ts","./src/dsl/pagination.ts","./src/dsl/query-builder.ts","./src/dsl/response-parser.ts","./src/dsl/usage-policy.ts","./src/dsl/commands/apply-filters.ts","./src/dsl/commands/index.ts","./src/dsl/commands/validate-input.ts","./src/dsl/commands/facet/index.ts","./src/dsl/commands/facet/schemas.ts","./src/dsl/commands/functions/ClassifyCommand.ts","./src/dsl/commands/functions/ExtractAffiliationsCommand.ts","./src/dsl/commands/functions/ExtractConceptsCommand.ts","./src/dsl/commands/functions/ExtractGrantsCommand.ts","./src/dsl/commands/functions/index.ts","./src/dsl/schema/cache.ts","./src/dsl/schema/extract.ts","./src/dsl/schema/index.ts","./src/dsl/schema/load.ts","./src/dsl/schema/store.ts","./src/dsl/schema/structured-entities.ts","./src/dsl/schema/summary.ts","./src/dsl/schema/types.ts","./src/dsl/schema/validation.ts","./src/dsl/types/buckets.ts","./src/dsl/types/common.ts","./src/dsl/types/entities.ts","./src/dsl/types/index.ts","./src/dsl/types/return-clauses.ts","./src/dsl/types/special-functions.ts","./src/dsl/types/vocabulary.ts","./src/dsl/utils/escape.ts","./src/dsl/utils/sanitize.ts","./src/dsl/utils/string-utils.ts","./src/dsl/utils/validate-field-name.ts","./src/mcp/batch-fetch.ts","./src/mcp/export-format.ts","./src/mcp/funder-org-names.ts","./src/mcp/http-server.ts","./src/mcp/server.ts","./src/mcp/shared-schema.ts","./src/mcp/usage-tracking.ts","./src/mcp/utils.ts","./src/mcp/examples/dsl-examples.ts","./src/mcp/examples/usage-scenarios.ts","./src/mcp/middleware/field-aliases.ts","./src/mcp/resources/schema.ts","./src/mcp/schema/context.ts","./src/mcp/schema/index.ts","./src/mcp/tools/analytics-filters.ts","./src/mcp/tools/analytics.ts","./src/mcp/tools/fetch-search-pages.ts","./src/mcp/tools/functions.ts","./src/mcp/tools/lookup.ts","./src/mcp/tools/query.ts","./src/mcp/tools/schema.ts","./src/mcp/tools/search-entity-metadata.ts","./src/mcp/tools/search-input.ts","./src/mcp/tools/search.ts"],"version":"5.9.3"}
|