@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.
Files changed (84) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/client/deployment-config.d.ts +3 -17
  3. package/dist/client/deployment-config.d.ts.map +1 -1
  4. package/dist/client/deployment-config.js +3 -23
  5. package/dist/client/deployment-config.js.map +1 -1
  6. package/dist/client/http-client.d.ts +4 -26
  7. package/dist/client/http-client.d.ts.map +1 -1
  8. package/dist/client/http-client.js +26 -79
  9. package/dist/client/http-client.js.map +1 -1
  10. package/dist/client/internal-dsl-client.d.ts +15 -3
  11. package/dist/client/internal-dsl-client.d.ts.map +1 -1
  12. package/dist/client/internal-dsl-client.js +32 -4
  13. package/dist/client/internal-dsl-client.js.map +1 -1
  14. package/dist/client/request-retry.d.ts +39 -0
  15. package/dist/client/request-retry.d.ts.map +1 -0
  16. package/dist/client/request-retry.js +85 -0
  17. package/dist/client/request-retry.js.map +1 -0
  18. package/dist/client/usage-context.d.ts +29 -0
  19. package/dist/client/usage-context.d.ts.map +1 -0
  20. package/dist/client/usage-context.js +33 -0
  21. package/dist/client/usage-context.js.map +1 -0
  22. package/dist/client/usage-headers.d.ts +19 -0
  23. package/dist/client/usage-headers.d.ts.map +1 -0
  24. package/dist/client/usage-headers.js +39 -0
  25. package/dist/client/usage-headers.js.map +1 -0
  26. package/dist/dsl/client.d.ts.map +1 -1
  27. package/dist/dsl/client.js +7 -4
  28. package/dist/dsl/client.js.map +1 -1
  29. package/dist/mcp/http-server.d.ts.map +1 -1
  30. package/dist/mcp/http-server.js +6 -0
  31. package/dist/mcp/http-server.js.map +1 -1
  32. package/dist/mcp/server.d.ts +4 -0
  33. package/dist/mcp/server.d.ts.map +1 -1
  34. package/dist/mcp/server.js +7 -0
  35. package/dist/mcp/server.js.map +1 -1
  36. package/dist/mcp/tools/analytics.d.ts.map +1 -1
  37. package/dist/mcp/tools/analytics.js +5 -4
  38. package/dist/mcp/tools/analytics.js.map +1 -1
  39. package/dist/mcp/tools/fetch-search-pages.d.ts.map +1 -1
  40. package/dist/mcp/tools/fetch-search-pages.js +2 -1
  41. package/dist/mcp/tools/fetch-search-pages.js.map +1 -1
  42. package/dist/mcp/tools/functions.d.ts.map +1 -1
  43. package/dist/mcp/tools/functions.js +3 -2
  44. package/dist/mcp/tools/functions.js.map +1 -1
  45. package/dist/mcp/tools/lookup.d.ts.map +1 -1
  46. package/dist/mcp/tools/lookup.js +4 -3
  47. package/dist/mcp/tools/lookup.js.map +1 -1
  48. package/dist/mcp/tools/query.d.ts.map +1 -1
  49. package/dist/mcp/tools/query.js +2 -1
  50. package/dist/mcp/tools/query.js.map +1 -1
  51. package/dist/mcp/tools/schema.d.ts.map +1 -1
  52. package/dist/mcp/tools/schema.js +3 -2
  53. package/dist/mcp/tools/schema.js.map +1 -1
  54. package/dist/mcp/tools/search.d.ts.map +1 -1
  55. package/dist/mcp/tools/search.js +2 -1
  56. package/dist/mcp/tools/search.js.map +1 -1
  57. package/dist/mcp/usage-tracking.d.ts +28 -0
  58. package/dist/mcp/usage-tracking.d.ts.map +1 -0
  59. package/dist/mcp/usage-tracking.js +52 -0
  60. package/dist/mcp/usage-tracking.js.map +1 -0
  61. package/package.json +1 -1
  62. package/src/client/deployment-config.ts +3 -36
  63. package/src/client/http-client.ts +27 -93
  64. package/src/client/internal-dsl-client.ts +48 -4
  65. package/src/client/request-retry.ts +115 -0
  66. package/src/client/usage-context.ts +53 -0
  67. package/src/client/usage-headers.ts +45 -0
  68. package/src/dsl/client.ts +7 -4
  69. package/src/mcp/http-server.ts +9 -0
  70. package/src/mcp/server.ts +12 -0
  71. package/src/mcp/tools/analytics.ts +9 -4
  72. package/src/mcp/tools/fetch-search-pages.ts +3 -1
  73. package/src/mcp/tools/functions.ts +5 -2
  74. package/src/mcp/tools/lookup.ts +7 -3
  75. package/src/mcp/tools/query.ts +3 -1
  76. package/src/mcp/tools/schema.ts +5 -2
  77. package/src/mcp/tools/search.ts +3 -1
  78. package/src/mcp/usage-tracking.ts +72 -0
  79. package/test/client/deployment-config.test.ts +1 -25
  80. package/test/client/http-client.test.ts +17 -17
  81. package/test/client/internal-dsl-client.test.ts +73 -10
  82. package/test/client/request-retry.test.ts +55 -0
  83. package/test/client/usage-headers.test.ts +45 -0
  84. 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
- vi.spyOn(client as never, "delay" as never).mockResolvedValue(undefined as never);
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
- vi.spyOn(client as never, "delay" as never).mockResolvedValue(undefined as never);
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
- .spyOn(limitedClient as never, "delay" as never)
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
- .spyOn(client as never, "delay" as never)
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
- .spyOn(largeDelayClient as never, "delay" as never)
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 delaySpy = vi
389
- .spyOn(limitedClient as never, "delay" as never)
390
- .mockResolvedValue(undefined as never);
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(delaySpy).toHaveBeenCalledTimes(1);
409
- expect(delaySpy).toHaveBeenCalledWith(60_000);
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
- vi.spyOn(client as never, "delay" as never).mockResolvedValue(undefined as never);
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 user header", async () => {
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 client.query("search publications return publications limit 1");
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
+ });
@@ -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"}