clinicaltrialsgov-mcp-server 2.6.1 → 2.6.2
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 +9 -1
- package/dist/config/server-config.d.ts +15 -0
- package/dist/config/server-config.d.ts.map +1 -1
- package/dist/config/server-config.js +35 -0
- package/dist/config/server-config.js.map +1 -1
- package/dist/index.js +20 -1
- package/dist/index.js.map +1 -1
- package/dist/services/clinical-trials/clinical-trials-service.d.ts +19 -0
- package/dist/services/clinical-trials/clinical-trials-service.d.ts.map +1 -1
- package/dist/services/clinical-trials/clinical-trials-service.js +226 -1
- package/dist/services/clinical-trials/clinical-trials-service.js.map +1 -1
- package/dist/services/clinical-trials/mirror/index.d.ts +31 -0
- package/dist/services/clinical-trials/mirror/index.d.ts.map +1 -0
- package/dist/services/clinical-trials/mirror/index.js +66 -0
- package/dist/services/clinical-trials/mirror/index.js.map +1 -0
- package/dist/services/clinical-trials/mirror/ingester.d.ts +39 -0
- package/dist/services/clinical-trials/mirror/ingester.d.ts.map +1 -0
- package/dist/services/clinical-trials/mirror/ingester.js +308 -0
- package/dist/services/clinical-trials/mirror/ingester.js.map +1 -0
- package/dist/services/clinical-trials/mirror/types.d.ts +68 -0
- package/dist/services/clinical-trials/mirror/types.d.ts.map +1 -0
- package/dist/services/clinical-trials/mirror/types.js +45 -0
- package/dist/services/clinical-trials/mirror/types.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
<div align="center">
|
|
9
9
|
|
|
10
|
-
[](https://www.npmjs.com/package/clinicaltrialsgov-mcp-server) [](https://github.com/users/cyanheads/packages/container/package/clinicaltrialsgov-mcp-server) [](https://www.npmjs.com/package/clinicaltrialsgov-mcp-server) [](https://github.com/users/cyanheads/packages/container/package/clinicaltrialsgov-mcp-server) [](./CHANGELOG.md) [](https://modelcontextprotocol.io/) [](./LICENSE) [](https://www.typescriptlang.org/) [](https://bun.sh/)
|
|
11
11
|
|
|
12
12
|
</div>
|
|
13
13
|
|
|
@@ -177,6 +177,10 @@ All configuration is optional — the server works with defaults and no API keys
|
|
|
177
177
|
| `CT_API_BASE_URL` | ClinicalTrials.gov API base URL. | `https://clinicaltrials.gov/api/v2` |
|
|
178
178
|
| `CT_REQUEST_TIMEOUT_MS` | Per-request timeout in milliseconds. | `30000` |
|
|
179
179
|
| `CT_MAX_PAGE_SIZE` | Maximum page size cap. | `200` |
|
|
180
|
+
| `CT_MIRROR_ENABLED` | Enable the local SQLite study mirror. | `false` |
|
|
181
|
+
| `CT_MIRROR_PATH` | Filesystem path for the mirror database. | `./clinical-trials-mirror.db` |
|
|
182
|
+
| `CT_MIRROR_REFRESH_CRON` | Cron schedule for incremental mirror sync. | `0 3 * * *` (3 AM daily) |
|
|
183
|
+
| `CT_MIRROR_FALLBACK_LIVE` | Fall back to live API when mirror is not yet bootstrapped. | `true` |
|
|
180
184
|
| `MCP_TRANSPORT_TYPE` | Transport: `stdio` or `http`. | `stdio` |
|
|
181
185
|
| `MCP_HTTP_PORT` | Port for HTTP server. | `3010` |
|
|
182
186
|
| `MCP_AUTH_MODE` | Auth mode: `none`, `jwt`, or `oauth`. | `none` |
|
|
@@ -184,6 +188,10 @@ All configuration is optional — the server works with defaults and no API keys
|
|
|
184
188
|
| `LOGS_DIR` | Directory for log files (Node.js only). | `<project-root>/logs` |
|
|
185
189
|
| `OTEL_ENABLED` | Enable OpenTelemetry tracing. | `false` |
|
|
186
190
|
|
|
191
|
+
### Local study mirror (opt-in)
|
|
192
|
+
|
|
193
|
+
Setting `CT_MIRROR_ENABLED=true` activates a self-refreshing SQLite+FTS5 local mirror of the ~577K-study corpus. Search and count queries route to the mirror first, with transparent fallback to the live API when the mirror is not yet ready (`CT_MIRROR_FALLBACK_LIVE=true`, the default). The mirror must be bootstrapped out-of-band before it becomes ready — while enabled but not yet bootstrapped it falls through to the live API identically to the disabled state. Once bootstrapped, the mirror eliminates live-API round-trips for most search and lookup operations. Full-record lookups (`clinicaltrials_get_study_record`), results data, field definitions, and field values remain live-API only.
|
|
194
|
+
|
|
187
195
|
## Running the Server
|
|
188
196
|
|
|
189
197
|
### Local Development
|
|
@@ -8,8 +8,23 @@ declare const ServerConfigSchema: z.ZodObject<{
|
|
|
8
8
|
requestTimeoutMs: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
9
9
|
maxPageSize: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
10
10
|
}, z.core.$strip>;
|
|
11
|
+
/** Mirror-specific configuration parsed separately from the flat env var set. */
|
|
12
|
+
declare const MirrorConfigSchema: z.ZodObject<{
|
|
13
|
+
enabled: z.ZodDefault<z.ZodCoercedBoolean<unknown>>;
|
|
14
|
+
path: z.ZodDefault<z.ZodString>;
|
|
15
|
+
refreshCron: z.ZodDefault<z.ZodString>;
|
|
16
|
+
fallbackLive: z.ZodDefault<z.ZodCoercedBoolean<unknown>>;
|
|
17
|
+
}, z.core.$strip>;
|
|
11
18
|
export type ServerConfig = z.infer<typeof ServerConfigSchema>;
|
|
19
|
+
export type MirrorConfig = z.infer<typeof MirrorConfigSchema> & {
|
|
20
|
+
/** API base URL forwarded from the main config for the mirror ingester. */
|
|
21
|
+
apiBaseUrl: string;
|
|
22
|
+
/** Per-request timeout forwarded from the main config for the mirror ingester. */
|
|
23
|
+
requestTimeoutMs: number;
|
|
24
|
+
};
|
|
12
25
|
/** Get server configuration (lazy-parsed from env vars). */
|
|
13
26
|
export declare function getServerConfig(): ServerConfig;
|
|
27
|
+
/** Get mirror configuration (lazy-parsed from env vars). */
|
|
28
|
+
export declare function getMirrorConfig(): MirrorConfig;
|
|
14
29
|
export {};
|
|
15
30
|
//# sourceMappingURL=server-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-config.d.ts","sourceRoot":"","sources":["../../src/config/server-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAG3C,QAAA,MAAM,kBAAkB;;;;iBAOtB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"server-config.d.ts","sourceRoot":"","sources":["../../src/config/server-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAG3C,QAAA,MAAM,kBAAkB;;;;iBAOtB,CAAC;AAEH,iFAAiF;AACjF,QAAA,MAAM,kBAAkB;;;;;iBActB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,GAAG;IAC9D,2EAA2E;IAC3E,UAAU,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAKF,4DAA4D;AAC5D,wBAAgB,eAAe,IAAI,YAAY,CAO9C;AAED,4DAA4D;AAC5D,wBAAgB,eAAe,IAAI,YAAY,CAgB9C"}
|
|
@@ -12,7 +12,24 @@ const ServerConfigSchema = z.object({
|
|
|
12
12
|
requestTimeoutMs: z.coerce.number().default(30_000).describe('Per-request timeout in ms'),
|
|
13
13
|
maxPageSize: z.coerce.number().default(200).describe('Maximum page size cap'),
|
|
14
14
|
});
|
|
15
|
+
/** Mirror-specific configuration parsed separately from the flat env var set. */
|
|
16
|
+
const MirrorConfigSchema = z.object({
|
|
17
|
+
enabled: z.coerce.boolean().default(false).describe('Enable the local SQLite study mirror'),
|
|
18
|
+
path: z
|
|
19
|
+
.string()
|
|
20
|
+
.default('./clinical-trials-mirror.db')
|
|
21
|
+
.describe('Filesystem path for the mirror SQLite database'),
|
|
22
|
+
refreshCron: z
|
|
23
|
+
.string()
|
|
24
|
+
.default('0 3 * * *')
|
|
25
|
+
.describe('Cron expression for incremental mirror refresh (default: 3 AM daily)'),
|
|
26
|
+
fallbackLive: z.coerce
|
|
27
|
+
.boolean()
|
|
28
|
+
.default(true)
|
|
29
|
+
.describe('Fall back to live API when mirror is not ready'),
|
|
30
|
+
});
|
|
15
31
|
let _config;
|
|
32
|
+
let _mirrorConfig;
|
|
16
33
|
/** Get server configuration (lazy-parsed from env vars). */
|
|
17
34
|
export function getServerConfig() {
|
|
18
35
|
_config ??= parseEnvConfig(ServerConfigSchema, {
|
|
@@ -22,4 +39,22 @@ export function getServerConfig() {
|
|
|
22
39
|
});
|
|
23
40
|
return _config;
|
|
24
41
|
}
|
|
42
|
+
/** Get mirror configuration (lazy-parsed from env vars). */
|
|
43
|
+
export function getMirrorConfig() {
|
|
44
|
+
if (!_mirrorConfig) {
|
|
45
|
+
const base = parseEnvConfig(MirrorConfigSchema, {
|
|
46
|
+
enabled: 'CT_MIRROR_ENABLED',
|
|
47
|
+
path: 'CT_MIRROR_PATH',
|
|
48
|
+
refreshCron: 'CT_MIRROR_REFRESH_CRON',
|
|
49
|
+
fallbackLive: 'CT_MIRROR_FALLBACK_LIVE',
|
|
50
|
+
});
|
|
51
|
+
const server = getServerConfig();
|
|
52
|
+
_mirrorConfig = {
|
|
53
|
+
...base,
|
|
54
|
+
apiBaseUrl: server.apiBaseUrl,
|
|
55
|
+
requestTimeoutMs: server.requestTimeoutMs,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
return _mirrorConfig;
|
|
59
|
+
}
|
|
25
60
|
//# sourceMappingURL=server-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-config.js","sourceRoot":"","sources":["../../src/config/server-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,OAAO,CAAC,mCAAmC,CAAC;SAC5C,QAAQ,CAAC,iCAAiC,CAAC;IAC9C,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACzF,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;CAC9E,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"server-config.js","sourceRoot":"","sources":["../../src/config/server-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,OAAO,CAAC,mCAAmC,CAAC;SAC5C,QAAQ,CAAC,iCAAiC,CAAC;IAC9C,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACzF,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;CAC9E,CAAC,CAAC;AAEH,iFAAiF;AACjF,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IAC3F,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,OAAO,CAAC,6BAA6B,CAAC;SACtC,QAAQ,CAAC,gDAAgD,CAAC;IAC7D,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,OAAO,CAAC,WAAW,CAAC;SACpB,QAAQ,CAAC,sEAAsE,CAAC;IACnF,YAAY,EAAE,CAAC,CAAC,MAAM;SACnB,OAAO,EAAE;SACT,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CAAC,gDAAgD,CAAC;CAC9D,CAAC,CAAC;AAUH,IAAI,OAAiC,CAAC;AACtC,IAAI,aAAuC,CAAC;AAE5C,4DAA4D;AAC5D,MAAM,UAAU,eAAe;IAC7B,OAAO,KAAK,cAAc,CAAC,kBAAkB,EAAE;QAC7C,UAAU,EAAE,iBAAiB;QAC7B,gBAAgB,EAAE,uBAAuB;QACzC,WAAW,EAAE,kBAAkB;KAChC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,cAAc,CAAC,kBAAkB,EAAE;YAC9C,OAAO,EAAE,mBAAmB;YAC5B,IAAI,EAAE,gBAAgB;YACtB,WAAW,EAAE,wBAAwB;YACrC,YAAY,EAAE,yBAAyB;SACxC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;QACjC,aAAa,GAAG;YACd,GAAG,IAAI;YACP,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;SAC1C,CAAC;IACJ,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,10 +4,13 @@
|
|
|
4
4
|
* @module index
|
|
5
5
|
*/
|
|
6
6
|
import { createApp } from '@cyanheads/mcp-ts-core';
|
|
7
|
+
import { schedulerService } from '@cyanheads/mcp-ts-core/utils';
|
|
8
|
+
import { getMirrorConfig } from './config/server-config.js';
|
|
7
9
|
import { allPromptDefinitions } from './mcp-server/prompts/definitions/index.js';
|
|
8
10
|
import { allResourceDefinitions } from './mcp-server/resources/definitions/index.js';
|
|
9
11
|
import { allToolDefinitions } from './mcp-server/tools/definitions/index.js';
|
|
10
12
|
import { initClinicalTrialsService } from './services/clinical-trials/clinical-trials-service.js';
|
|
13
|
+
import { getClinicalTrialsMirror, initMirror } from './services/clinical-trials/mirror/index.js';
|
|
11
14
|
await createApp({
|
|
12
15
|
tools: allToolDefinitions,
|
|
13
16
|
resources: allResourceDefinitions,
|
|
@@ -16,8 +19,24 @@ await createApp({
|
|
|
16
19
|
landing: {
|
|
17
20
|
requireAuth: false,
|
|
18
21
|
},
|
|
19
|
-
setup() {
|
|
22
|
+
async setup({ config }) {
|
|
20
23
|
initClinicalTrialsService();
|
|
24
|
+
const mirrorConfig = getMirrorConfig();
|
|
25
|
+
if (mirrorConfig.enabled) {
|
|
26
|
+
initMirror(mirrorConfig);
|
|
27
|
+
// Schedule incremental refresh on HTTP transport only — stdio operators
|
|
28
|
+
// run the server per-request and don't benefit from a persistent cron.
|
|
29
|
+
// The full init must be run out-of-band (bootstrap script, CLI, or manual runSync).
|
|
30
|
+
if (config.mcpTransportType === 'http') {
|
|
31
|
+
const mirror = getClinicalTrialsMirror();
|
|
32
|
+
if (mirror) {
|
|
33
|
+
await schedulerService.schedule('ct-mirror-refresh', mirrorConfig.refreshCron, async (_ctx) => {
|
|
34
|
+
await mirror.runSync({ mode: 'refresh' });
|
|
35
|
+
}, 'Incremental ClinicalTrials.gov mirror refresh');
|
|
36
|
+
schedulerService.start('ct-mirror-refresh');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
21
40
|
},
|
|
22
41
|
});
|
|
23
42
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,yBAAyB,EAAE,MAAM,uDAAuD,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,yBAAyB,EAAE,MAAM,uDAAuD,CAAC;AAClG,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;AAEjG,MAAM,SAAS,CAAC;IACd,KAAK,EAAE,kBAAkB;IACzB,SAAS,EAAE,sBAAsB;IACjC,OAAO,EAAE,oBAAoB;IAC7B,YAAY,EAAE,qsBAAqsB;IACntB,OAAO,EAAE;QACP,WAAW,EAAE,KAAK;KACnB;IACD,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE;QACpB,yBAAyB,EAAE,CAAC;QAE5B,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;QACvC,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YACzB,UAAU,CAAC,YAAY,CAAC,CAAC;YAEzB,wEAAwE;YACxE,uEAAuE;YACvE,oFAAoF;YACpF,IAAI,MAAM,CAAC,gBAAgB,KAAK,MAAM,EAAE,CAAC;gBACvC,MAAM,MAAM,GAAG,uBAAuB,EAAE,CAAC;gBACzC,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,gBAAgB,CAAC,QAAQ,CAC7B,mBAAmB,EACnB,YAAY,CAAC,WAAW,EACxB,KAAK,EAAE,IAAI,EAAE,EAAE;wBACb,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;oBAC5C,CAAC,EACD,+CAA+C,CAChD,CAAC;oBACF,gBAAgB,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview ClinicalTrials.gov REST API v2 client with retry, rate limiting, and timeout.
|
|
3
|
+
* Routes search and count operations to the local mirror when enabled and ready,
|
|
4
|
+
* falling back to the live API when the mirror is unavailable or the query requires
|
|
5
|
+
* features the mirror cannot answer (geo filters, complex AREA[] expressions).
|
|
3
6
|
* @module services/clinical-trials/clinical-trials-service
|
|
4
7
|
*/
|
|
5
8
|
import type { Context } from '@cyanheads/mcp-ts-core';
|
|
9
|
+
import type { MirrorStatus } from '@cyanheads/mcp-ts-core/mirror';
|
|
6
10
|
import { type ServerConfig } from '../../config/server-config.js';
|
|
7
11
|
import { type FieldIndexEntry } from './field-search.js';
|
|
8
12
|
import type { FieldNode, FieldValueStats, PagedStudiesResponse, SearchParams, Study } from './types.js';
|
|
@@ -35,12 +39,27 @@ export declare class ClinicalTrialsService {
|
|
|
35
39
|
getStudy(nctId: string, ctx: Context): Promise<Study>;
|
|
36
40
|
/** Fetch multiple studies by NCT IDs in a single request. Returns identification and results section data. */
|
|
37
41
|
getStudiesBatch(nctIds: string[], ctx: Context): Promise<Study[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Return current mirror status, or `undefined` when the mirror is disabled.
|
|
44
|
+
* Exposed so tools can surface mirror state to agents when useful.
|
|
45
|
+
*/
|
|
46
|
+
mirrorStatus(): Promise<MirrorStatus | undefined>;
|
|
38
47
|
/** Get field definitions (metadata tree) from the data model. */
|
|
39
48
|
getMetadata(includeIndexedOnly: boolean, ctx: Context): Promise<FieldNode[]>;
|
|
40
49
|
/** Get field value statistics for the specified fields. */
|
|
41
50
|
getFieldValues(fields: string[], ctx: Context): Promise<FieldValueStats[]>;
|
|
42
51
|
/** Search the field model by keyword, returning ranked matches with paths and types. */
|
|
43
52
|
searchFieldDefinitions(query: string, limit: number, ctx: Context): Promise<FieldIndexEntry[]>;
|
|
53
|
+
/**
|
|
54
|
+
* Attempt to serve a `searchStudies` call from the local mirror.
|
|
55
|
+
*
|
|
56
|
+
* Returns `null` when the mirror is not ready, or when the query uses
|
|
57
|
+
* features the mirror cannot answer (geo filters, complex AREA[] advanced
|
|
58
|
+
* filters, field selection beyond the metadata tier, or pageToken
|
|
59
|
+
* continuation from a previous live-API page). In all of those cases the
|
|
60
|
+
* caller falls through to the live API.
|
|
61
|
+
*/
|
|
62
|
+
private tryMirrorSearch;
|
|
44
63
|
/** Lazy-load and memoize the flattened field index from /studies/metadata. */
|
|
45
64
|
private getFieldIndex;
|
|
46
65
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clinical-trials-service.d.ts","sourceRoot":"","sources":["../../../src/services/clinical-trials/clinical-trials-service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"clinical-trials-service.d.ts","sourceRoot":"","sources":["../../../src/services/clinical-trials/clinical-trials-service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAStD,OAAO,KAAK,EAAU,YAAY,EAAe,MAAM,+BAA+B,CAAC;AAEvF,OAAO,EAAoC,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAChG,OAAO,EACL,KAAK,eAAe,EAIrB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,YAAY,EACZ,KAAK,EACN,MAAM,YAAY,CAAC;AA4BpB,kGAAkG;AAClG,MAAM,WAAW,4BAA4B;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAU;IAChD,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,iBAAiB,CAMX;gBAEF,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,4BAAiC;IAU5E,2EAA2E;IACrE,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAkBtF,sCAAsC;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;IAKrD,8GAA8G;IACxG,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IA2BvE;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAMvD,iEAAiE;IACjE,WAAW,CAAC,kBAAkB,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAO5E,2DAA2D;IACrD,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAuChF,wFAAwF;IAClF,sBAAsB,CAC1B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,eAAe,EAAE,CAAC;IAU7B;;;;;;;;OAQG;YACW,eAAe;IAsG7B,8EAA8E;IAC9E,OAAO,CAAC,aAAa;IAoCrB;;;;;;OAMG;YACW,eAAe;IAoC7B,wEAAwE;YAC1D,cAAc;IAwC5B,OAAO,CAAC,gBAAgB;YA+BV,QAAQ;YAMR,SAAS;CAyLxB;AAyGD,0EAA0E;AAC1E,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED,2DAA2D;AAC3D,wBAAgB,wBAAwB,IAAI,qBAAqB,CAMhE"}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview ClinicalTrials.gov REST API v2 client with retry, rate limiting, and timeout.
|
|
3
|
+
* Routes search and count operations to the local mirror when enabled and ready,
|
|
4
|
+
* falling back to the live API when the mirror is unavailable or the query requires
|
|
5
|
+
* features the mirror cannot answer (geo filters, complex AREA[] expressions).
|
|
3
6
|
* @module services/clinical-trials/clinical-trials-service
|
|
4
7
|
*/
|
|
5
8
|
import { JsonRpcErrorCode, McpError, notFound, rateLimited, serviceUnavailable, validationError, } from '@cyanheads/mcp-ts-core/errors';
|
|
6
9
|
import { httpErrorFromResponse } from '@cyanheads/mcp-ts-core/utils';
|
|
7
|
-
import { getServerConfig } from '../../config/server-config.js';
|
|
10
|
+
import { getMirrorConfig, getServerConfig } from '../../config/server-config.js';
|
|
8
11
|
import { flattenMetadata, nearestPieces, searchFields, } from './field-search.js';
|
|
12
|
+
import { getClinicalTrialsMirror } from './mirror/index.js';
|
|
9
13
|
const DEFAULT_MAX_RETRIES = 3;
|
|
10
14
|
const DEFAULT_BASE_BACKOFF_MS = 1000;
|
|
11
15
|
const DEFAULT_MAX_BACKOFF_MS = 30_000;
|
|
@@ -51,6 +55,13 @@ export class ClinicalTrialsService {
|
|
|
51
55
|
}
|
|
52
56
|
/** Search studies with query, filters, pagination, and field selection. */
|
|
53
57
|
async searchStudies(params, ctx) {
|
|
58
|
+
// Route to the local mirror when it is ready and the query is mirrorable.
|
|
59
|
+
const mirror = getClinicalTrialsMirror();
|
|
60
|
+
if (mirror) {
|
|
61
|
+
const mirrorResult = await this.tryMirrorSearch(params, mirror, ctx);
|
|
62
|
+
if (mirrorResult !== null)
|
|
63
|
+
return mirrorResult;
|
|
64
|
+
}
|
|
54
65
|
if (this.validateFieldsLocally && params.fields?.length) {
|
|
55
66
|
const normalized = await this.normalizeFields(params.fields, ctx);
|
|
56
67
|
await this.validateFields(normalized, ctx);
|
|
@@ -68,6 +79,16 @@ export class ClinicalTrialsService {
|
|
|
68
79
|
/** Fetch multiple studies by NCT IDs in a single request. Returns identification and results section data. */
|
|
69
80
|
async getStudiesBatch(nctIds, ctx) {
|
|
70
81
|
ctx.log.debug('getStudiesBatch', { count: nctIds.length });
|
|
82
|
+
// Route to mirror for ID-targeted lookups when mirror is ready.
|
|
83
|
+
const mirror = getClinicalTrialsMirror();
|
|
84
|
+
if (mirror && (await mirror.ready())) {
|
|
85
|
+
const rows = await mirror.getByIds(nctIds);
|
|
86
|
+
if (rows.length > 0) {
|
|
87
|
+
ctx.log.debug('getStudiesBatch served from mirror', { count: rows.length });
|
|
88
|
+
return rows.map(mirrorRowToStudy);
|
|
89
|
+
}
|
|
90
|
+
// Mirror has no rows for these IDs → fall through to live API.
|
|
91
|
+
}
|
|
71
92
|
const response = await this.searchStudies({
|
|
72
93
|
filterIds: nctIds,
|
|
73
94
|
fields: ['NCTId', 'BriefTitle', 'HasResults', 'ResultsSection'],
|
|
@@ -77,6 +98,16 @@ export class ClinicalTrialsService {
|
|
|
77
98
|
}, ctx);
|
|
78
99
|
return response.studies;
|
|
79
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* Return current mirror status, or `undefined` when the mirror is disabled.
|
|
103
|
+
* Exposed so tools can surface mirror state to agents when useful.
|
|
104
|
+
*/
|
|
105
|
+
async mirrorStatus() {
|
|
106
|
+
const mirror = getClinicalTrialsMirror();
|
|
107
|
+
if (!mirror)
|
|
108
|
+
return;
|
|
109
|
+
return await mirror.status();
|
|
110
|
+
}
|
|
80
111
|
/** Get field definitions (metadata tree) from the data model. */
|
|
81
112
|
getMetadata(includeIndexedOnly, ctx) {
|
|
82
113
|
ctx.log.debug('getMetadata', { includeIndexedOnly });
|
|
@@ -122,6 +153,106 @@ export class ClinicalTrialsService {
|
|
|
122
153
|
return searchFields(query, entries, limit);
|
|
123
154
|
}
|
|
124
155
|
/* ------------------------------------------------------------------ */
|
|
156
|
+
/* Mirror routing */
|
|
157
|
+
/* ------------------------------------------------------------------ */
|
|
158
|
+
/**
|
|
159
|
+
* Attempt to serve a `searchStudies` call from the local mirror.
|
|
160
|
+
*
|
|
161
|
+
* Returns `null` when the mirror is not ready, or when the query uses
|
|
162
|
+
* features the mirror cannot answer (geo filters, complex AREA[] advanced
|
|
163
|
+
* filters, field selection beyond the metadata tier, or pageToken
|
|
164
|
+
* continuation from a previous live-API page). In all of those cases the
|
|
165
|
+
* caller falls through to the live API.
|
|
166
|
+
*/
|
|
167
|
+
async tryMirrorSearch(params, mirror, ctx) {
|
|
168
|
+
// Only serve from mirror when a full sync has ever completed.
|
|
169
|
+
const ready = await mirror.ready();
|
|
170
|
+
if (!ready) {
|
|
171
|
+
const fallback = getMirrorConfig().fallbackLive;
|
|
172
|
+
if (!fallback) {
|
|
173
|
+
throw serviceUnavailable('Clinical-trials mirror is not ready and CT_MIRROR_FALLBACK_LIVE is disabled.', { hint: 'Run the mirror init script to bootstrap the local database.' });
|
|
174
|
+
}
|
|
175
|
+
ctx.log.debug('Mirror not ready — falling back to live API');
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
// Mirror cannot handle: geo filters, advanced AREA[] expressions, or
|
|
179
|
+
// pageToken continuation (tokens belong to the live API's pagination state).
|
|
180
|
+
if (params.filterGeo || params.filterAdvanced || params.pageToken) {
|
|
181
|
+
ctx.log.debug('Query not mirrorable — falling back to live API', {
|
|
182
|
+
reason: params.filterGeo
|
|
183
|
+
? 'geo_filter'
|
|
184
|
+
: params.filterAdvanced
|
|
185
|
+
? 'advanced_filter'
|
|
186
|
+
: 'page_token',
|
|
187
|
+
});
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
// Build FTS match string from free-text query parameters.
|
|
191
|
+
const ftsTerms = [];
|
|
192
|
+
if (params.queryTerm)
|
|
193
|
+
ftsTerms.push(sanitizeFts(params.queryTerm));
|
|
194
|
+
if (params.queryCond)
|
|
195
|
+
ftsTerms.push(sanitizeFts(params.queryCond));
|
|
196
|
+
if (params.queryIntr)
|
|
197
|
+
ftsTerms.push(sanitizeFts(params.queryIntr));
|
|
198
|
+
if (params.querySpons)
|
|
199
|
+
ftsTerms.push(sanitizeFts(params.querySpons));
|
|
200
|
+
if (params.queryTitles)
|
|
201
|
+
ftsTerms.push(sanitizeFts(params.queryTitles));
|
|
202
|
+
// queryLocn and queryOutc are not in the FTS index — fall through to live.
|
|
203
|
+
if (params.queryLocn || params.queryOutc) {
|
|
204
|
+
ctx.log.debug('Query uses non-indexed fields — falling back to live API', {
|
|
205
|
+
reason: params.queryLocn ? 'location_query' : 'outcome_query',
|
|
206
|
+
});
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
const match = ftsTerms.join(' ') || undefined;
|
|
210
|
+
// Build structured filters for indexed columns.
|
|
211
|
+
const filters = [];
|
|
212
|
+
if (params.filterOverallStatus?.length === 1) {
|
|
213
|
+
filters.push({
|
|
214
|
+
column: 'overall_status',
|
|
215
|
+
op: 'eq',
|
|
216
|
+
value: params.filterOverallStatus[0],
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
else if (params.filterOverallStatus?.length) {
|
|
220
|
+
filters.push({ column: 'overall_status', op: 'in', value: params.filterOverallStatus });
|
|
221
|
+
}
|
|
222
|
+
// ID filter — if filterIds set, use getByIds for O(1) lookup.
|
|
223
|
+
if (params.filterIds?.length) {
|
|
224
|
+
const rows = await mirror.getByIds(params.filterIds);
|
|
225
|
+
ctx.log.debug('Mirror ID lookup', { requested: params.filterIds.length, found: rows.length });
|
|
226
|
+
const studies = rows.map(mirrorRowToStudy);
|
|
227
|
+
return {
|
|
228
|
+
studies,
|
|
229
|
+
totalCount: studies.length,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
const limit = Math.min(params.pageSize ?? 10, this.maxPageSize);
|
|
233
|
+
const offset = 0; // pageToken-based continuation not supported for mirror
|
|
234
|
+
const result = await mirror.query({
|
|
235
|
+
match,
|
|
236
|
+
filters,
|
|
237
|
+
sort: match ? 'relevance' : undefined,
|
|
238
|
+
limit,
|
|
239
|
+
offset,
|
|
240
|
+
});
|
|
241
|
+
ctx.log.debug('Mirror search', {
|
|
242
|
+
match,
|
|
243
|
+
filters: filters.length,
|
|
244
|
+
total: result.total,
|
|
245
|
+
returned: result.rows.length,
|
|
246
|
+
});
|
|
247
|
+
const studies = result.rows.map(mirrorRowToStudy);
|
|
248
|
+
return {
|
|
249
|
+
studies,
|
|
250
|
+
// countTotal support: return total when params.countTotal !== false (default true)
|
|
251
|
+
...(params.countTotal !== false ? { totalCount: result.total } : {}),
|
|
252
|
+
// No nextPageToken — mirror queries don't use cursor pagination
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
/* ------------------------------------------------------------------ */
|
|
125
256
|
/* Internal */
|
|
126
257
|
/* ------------------------------------------------------------------ */
|
|
127
258
|
/** Lazy-load and memoize the flattened field index from /studies/metadata. */
|
|
@@ -449,6 +580,100 @@ export class ClinicalTrialsService {
|
|
|
449
580
|
}
|
|
450
581
|
}
|
|
451
582
|
/* ------------------------------------------------------------------ */
|
|
583
|
+
/* Mirror helpers */
|
|
584
|
+
/* ------------------------------------------------------------------ */
|
|
585
|
+
/**
|
|
586
|
+
* Convert a mirror row back to the nested study shape that tool handlers expect.
|
|
587
|
+
* Only metadata-tier fields are populated; fields not stored in the mirror
|
|
588
|
+
* (e.g., full eligibility details, derived MeSH terms, results section) are
|
|
589
|
+
* omitted. Callers that need the full ~70KB record must use the live API.
|
|
590
|
+
*/
|
|
591
|
+
function mirrorRowToStudy(rawRow) {
|
|
592
|
+
const row = rawRow;
|
|
593
|
+
return {
|
|
594
|
+
protocolSection: {
|
|
595
|
+
identificationModule: {
|
|
596
|
+
...(row.nct_id && { nctId: row.nct_id }),
|
|
597
|
+
...(row.brief_title && { briefTitle: row.brief_title }),
|
|
598
|
+
...(row.official_title && { officialTitle: row.official_title }),
|
|
599
|
+
},
|
|
600
|
+
statusModule: {
|
|
601
|
+
...(row.overall_status && { overallStatus: row.overall_status }),
|
|
602
|
+
...(row.start_date && { startDateStruct: { date: row.start_date } }),
|
|
603
|
+
...(row.primary_completion_date && {
|
|
604
|
+
primaryCompletionDateStruct: { date: row.primary_completion_date },
|
|
605
|
+
}),
|
|
606
|
+
...(row.last_update_post_date && {
|
|
607
|
+
lastUpdatePostDateStruct: { date: row.last_update_post_date },
|
|
608
|
+
}),
|
|
609
|
+
},
|
|
610
|
+
designModule: {
|
|
611
|
+
...(row.study_type && { studyType: row.study_type }),
|
|
612
|
+
...(row.phases && { phases: row.phases.split('|').filter(Boolean) }),
|
|
613
|
+
...(row.enrollment_count != null && {
|
|
614
|
+
enrollmentInfo: { count: row.enrollment_count },
|
|
615
|
+
}),
|
|
616
|
+
},
|
|
617
|
+
sponsorCollaboratorsModule: {
|
|
618
|
+
...(row.lead_sponsor_name || row.lead_sponsor_class
|
|
619
|
+
? {
|
|
620
|
+
leadSponsor: {
|
|
621
|
+
...(row.lead_sponsor_name && { name: row.lead_sponsor_name }),
|
|
622
|
+
...(row.lead_sponsor_class && { class: row.lead_sponsor_class }),
|
|
623
|
+
},
|
|
624
|
+
}
|
|
625
|
+
: {}),
|
|
626
|
+
},
|
|
627
|
+
conditionsModule: {
|
|
628
|
+
...(row.conditions && { conditions: row.conditions.split('|').filter(Boolean) }),
|
|
629
|
+
},
|
|
630
|
+
armsInterventionsModule: {
|
|
631
|
+
...(row.interventions && {
|
|
632
|
+
interventions: row.interventions
|
|
633
|
+
.split('|')
|
|
634
|
+
.filter(Boolean)
|
|
635
|
+
.map((name) => ({ name })),
|
|
636
|
+
}),
|
|
637
|
+
},
|
|
638
|
+
eligibilityModule: {
|
|
639
|
+
...(row.eligibility_criteria && { eligibilityCriteria: row.eligibility_criteria }),
|
|
640
|
+
...(row.minimum_age && { minimumAge: row.minimum_age }),
|
|
641
|
+
...(row.maximum_age && { maximumAge: row.maximum_age }),
|
|
642
|
+
...(row.sex && { sex: row.sex }),
|
|
643
|
+
...(row.std_ages && { stdAges: row.std_ages.split('|').filter(Boolean) }),
|
|
644
|
+
...(row.healthy_volunteers != null && {
|
|
645
|
+
healthyVolunteers: row.healthy_volunteers === 1,
|
|
646
|
+
}),
|
|
647
|
+
},
|
|
648
|
+
contactsLocationsModule: {
|
|
649
|
+
...(row.locations && {
|
|
650
|
+
locations: row.locations
|
|
651
|
+
.split('|')
|
|
652
|
+
.filter(Boolean)
|
|
653
|
+
.map((loc) => {
|
|
654
|
+
const [city, state, country] = loc.split(', ');
|
|
655
|
+
return {
|
|
656
|
+
...(city && { city }),
|
|
657
|
+
...(state && { state }),
|
|
658
|
+
...(country && { country }),
|
|
659
|
+
};
|
|
660
|
+
}),
|
|
661
|
+
}),
|
|
662
|
+
},
|
|
663
|
+
},
|
|
664
|
+
...(row.has_results != null && { hasResults: row.has_results === 1 }),
|
|
665
|
+
};
|
|
666
|
+
}
|
|
667
|
+
/**
|
|
668
|
+
* Sanitize a free-text query for FTS5 MATCH syntax.
|
|
669
|
+
* Strips characters that FTS5 treats as special operators unless the caller
|
|
670
|
+
* intentionally uses them. Preserves AND/OR/NOT boolean operators.
|
|
671
|
+
*/
|
|
672
|
+
function sanitizeFts(query) {
|
|
673
|
+
// Remove characters that break FTS5 MATCH parsing.
|
|
674
|
+
return query.replace(/["*^()[\]]/g, ' ').trim();
|
|
675
|
+
}
|
|
676
|
+
/* ------------------------------------------------------------------ */
|
|
452
677
|
/* Init / Accessor */
|
|
453
678
|
/* ------------------------------------------------------------------ */
|
|
454
679
|
let _service;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clinical-trials-service.js","sourceRoot":"","sources":["../../../src/services/clinical-trials/clinical-trials-service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"clinical-trials-service.js","sourceRoot":"","sources":["../../../src/services/clinical-trials/clinical-trials-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Local SQLite mirror of the ClinicalTrials.gov study corpus.
|
|
3
|
+
*
|
|
4
|
+
* Opt-in (requires `CT_MIRROR_ENABLED=true`). Wraps `defineMirror` from
|
|
5
|
+
* `@cyanheads/mcp-ts-core/mirror` with the ClinicalTrials-specific ingester and
|
|
6
|
+
* schema, and exposes the single accessor used by `ClinicalTrialsService` to
|
|
7
|
+
* route local-first reads.
|
|
8
|
+
*
|
|
9
|
+
* Call `initMirror()` from `createApp({ setup() })` after `initClinicalTrialsService()`.
|
|
10
|
+
* The accessor `getClinicalTrialsMirror()` returns `undefined` when the mirror is
|
|
11
|
+
* disabled (env `CT_MIRROR_ENABLED` not set or falsy), so callers must guard
|
|
12
|
+
* with `if (mirror)`.
|
|
13
|
+
*
|
|
14
|
+
* The mirror is **never** automatically bootstrapped on startup — a full init
|
|
15
|
+
* takes ~10 min and must be run out-of-band. Only the incremental refresh is
|
|
16
|
+
* scheduled automatically (daily by default, configurable via `CT_MIRROR_REFRESH_CRON`).
|
|
17
|
+
* @module services/clinical-trials/mirror
|
|
18
|
+
*/
|
|
19
|
+
import type { Mirror } from '@cyanheads/mcp-ts-core/mirror';
|
|
20
|
+
import type { MirrorConfig } from '../../../config/server-config.js';
|
|
21
|
+
export type { StudyMetaRow } from './types.js';
|
|
22
|
+
/**
|
|
23
|
+
* Initialize the clinical-trials mirror from the provided mirror config.
|
|
24
|
+
* No-op when `config.enabled` is `false`. Safe to call multiple times (idempotent).
|
|
25
|
+
*/
|
|
26
|
+
export declare function initMirror(config: MirrorConfig): void;
|
|
27
|
+
/** Return the mirror instance, or `undefined` when the mirror is disabled. */
|
|
28
|
+
export declare function getClinicalTrialsMirror(): Mirror | undefined;
|
|
29
|
+
/** Reset the mirror instance (for tests). */
|
|
30
|
+
export declare function resetMirrorForTest(): void;
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/services/clinical-trials/mirror/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAG5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAI9D,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAgCrD;AAED,8EAA8E;AAC9E,wBAAgB,uBAAuB,IAAI,MAAM,GAAG,SAAS,CAE5D;AAED,6CAA6C;AAC7C,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Local SQLite mirror of the ClinicalTrials.gov study corpus.
|
|
3
|
+
*
|
|
4
|
+
* Opt-in (requires `CT_MIRROR_ENABLED=true`). Wraps `defineMirror` from
|
|
5
|
+
* `@cyanheads/mcp-ts-core/mirror` with the ClinicalTrials-specific ingester and
|
|
6
|
+
* schema, and exposes the single accessor used by `ClinicalTrialsService` to
|
|
7
|
+
* route local-first reads.
|
|
8
|
+
*
|
|
9
|
+
* Call `initMirror()` from `createApp({ setup() })` after `initClinicalTrialsService()`.
|
|
10
|
+
* The accessor `getClinicalTrialsMirror()` returns `undefined` when the mirror is
|
|
11
|
+
* disabled (env `CT_MIRROR_ENABLED` not set or falsy), so callers must guard
|
|
12
|
+
* with `if (mirror)`.
|
|
13
|
+
*
|
|
14
|
+
* The mirror is **never** automatically bootstrapped on startup — a full init
|
|
15
|
+
* takes ~10 min and must be run out-of-band. Only the incremental refresh is
|
|
16
|
+
* scheduled automatically (daily by default, configurable via `CT_MIRROR_REFRESH_CRON`).
|
|
17
|
+
* @module services/clinical-trials/mirror
|
|
18
|
+
*/
|
|
19
|
+
import { defineMirror, sqliteMirrorStore } from '@cyanheads/mcp-ts-core/mirror';
|
|
20
|
+
import { logger } from '@cyanheads/mcp-ts-core/utils';
|
|
21
|
+
import { clinicalTrialsIngester } from './ingester.js';
|
|
22
|
+
import { STUDY_META_COLUMNS, STUDY_META_FTS } from './types.js';
|
|
23
|
+
let _mirror;
|
|
24
|
+
/**
|
|
25
|
+
* Initialize the clinical-trials mirror from the provided mirror config.
|
|
26
|
+
* No-op when `config.enabled` is `false`. Safe to call multiple times (idempotent).
|
|
27
|
+
*/
|
|
28
|
+
export function initMirror(config) {
|
|
29
|
+
if (!config.enabled || _mirror)
|
|
30
|
+
return;
|
|
31
|
+
_mirror = defineMirror({
|
|
32
|
+
name: 'clinical-trials-studies',
|
|
33
|
+
store: sqliteMirrorStore({
|
|
34
|
+
path: config.path,
|
|
35
|
+
table: 'studies',
|
|
36
|
+
primaryKey: 'nct_id',
|
|
37
|
+
columns: STUDY_META_COLUMNS,
|
|
38
|
+
fts: STUDY_META_FTS,
|
|
39
|
+
indexes: [
|
|
40
|
+
{ columns: ['overall_status'] },
|
|
41
|
+
{ columns: ['last_update_post_date'] },
|
|
42
|
+
{ columns: ['study_type'] },
|
|
43
|
+
{ columns: ['lead_sponsor_class'] },
|
|
44
|
+
{ columns: ['has_results'] },
|
|
45
|
+
],
|
|
46
|
+
}),
|
|
47
|
+
logger,
|
|
48
|
+
async *sync(ctx) {
|
|
49
|
+
yield* clinicalTrialsIngester(ctx, {
|
|
50
|
+
apiBaseUrl: config.apiBaseUrl,
|
|
51
|
+
requestTimeoutMs: config.requestTimeoutMs,
|
|
52
|
+
log: logger,
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
logger.info(`Clinical-trials mirror initialized (path=${config.path}, refreshCron=${config.refreshCron}, fallbackLive=${config.fallbackLive})`);
|
|
57
|
+
}
|
|
58
|
+
/** Return the mirror instance, or `undefined` when the mirror is disabled. */
|
|
59
|
+
export function getClinicalTrialsMirror() {
|
|
60
|
+
return _mirror;
|
|
61
|
+
}
|
|
62
|
+
/** Reset the mirror instance (for tests). */
|
|
63
|
+
export function resetMirrorForTest() {
|
|
64
|
+
_mirror = undefined;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/clinical-trials/mirror/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAEtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIhE,IAAI,OAA2B,CAAC;AAEhC;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAoB;IAC7C,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO;QAAE,OAAO;IAEvC,OAAO,GAAG,YAAY,CAAC;QACrB,IAAI,EAAE,yBAAyB;QAC/B,KAAK,EAAE,iBAAiB,CAAC;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,KAAK,EAAE,SAAS;YAChB,UAAU,EAAE,QAAQ;YACpB,OAAO,EAAE,kBAAkB;YAC3B,GAAG,EAAE,cAA0B;YAC/B,OAAO,EAAE;gBACP,EAAE,OAAO,EAAE,CAAC,gBAAgB,CAAC,EAAE;gBAC/B,EAAE,OAAO,EAAE,CAAC,uBAAuB,CAAC,EAAE;gBACtC,EAAE,OAAO,EAAE,CAAC,YAAY,CAAC,EAAE;gBAC3B,EAAE,OAAO,EAAE,CAAC,oBAAoB,CAAC,EAAE;gBACnC,EAAE,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE;aAC7B;SACF,CAAC;QACF,MAAM;QACN,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG;YACb,KAAK,CAAC,CAAC,sBAAsB,CAAC,GAAG,EAAE;gBACjC,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;gBACzC,GAAG,EAAE,MAAM;aACZ,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CACT,4CAA4C,MAAM,CAAC,IAAI,iBAAiB,MAAM,CAAC,WAAW,kBAAkB,MAAM,CAAC,YAAY,GAAG,CACnI,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,uBAAuB;IACrC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,kBAAkB;IAChC,OAAO,GAAG,SAAS,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview ClinicalTrials.gov pageToken-based ingester for the local mirror.
|
|
3
|
+
*
|
|
4
|
+
* Implements the `SyncGenerator` contract consumed by `defineMirror`. Pages the
|
|
5
|
+
* `/studies` endpoint at `pageSize=1000` (API maximum) using `pageToken` paging.
|
|
6
|
+
*
|
|
7
|
+
* - **Full init (`mode === 'init'`):** iterates every page from the beginning (or
|
|
8
|
+
* resumes from a persisted `cursor` after an interrupt). Yields each page with
|
|
9
|
+
* the `cursor` set to the next `pageToken` so the runner can persist it.
|
|
10
|
+
* `checkpoint` advances per page as the max `lastUpdatePostDate` observed.
|
|
11
|
+
*
|
|
12
|
+
* - **Incremental refresh (`mode === 'refresh'`):** filters via
|
|
13
|
+
* `filter.advanced=AREA[LastUpdatePostDate]RANGE[cursor,MAX]` where `cursor`
|
|
14
|
+
* is the last persisted `checkpoint`. No pageToken paging state to resume.
|
|
15
|
+
*
|
|
16
|
+
* Bootstrap rate is ~1 req/s (the minimum interval enforced by the API rate
|
|
17
|
+
* limit), so full init of ~577K studies (~578 pages) takes ~10 min. Incremental
|
|
18
|
+
* refresh fetches only updated studies since the last checkpoint and completes
|
|
19
|
+
* in seconds to a few minutes depending on daily activity.
|
|
20
|
+
* @module services/clinical-trials/mirror/ingester
|
|
21
|
+
*/
|
|
22
|
+
import type { MirrorLogger, SyncContext, SyncPage } from '@cyanheads/mcp-ts-core/mirror';
|
|
23
|
+
/** Configuration for the ingester. */
|
|
24
|
+
export interface IngesterOptions {
|
|
25
|
+
/** ClinicalTrials.gov API v2 base URL. */
|
|
26
|
+
apiBaseUrl: string;
|
|
27
|
+
/** Logger (optional). */
|
|
28
|
+
log?: MirrorLogger;
|
|
29
|
+
/** Per-request timeout in ms. */
|
|
30
|
+
requestTimeoutMs: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Async generator that pages through the ClinicalTrials.gov `/studies` endpoint
|
|
34
|
+
* and yields `SyncPage` objects for the mirror runner.
|
|
35
|
+
*
|
|
36
|
+
* Implements the `SyncGenerator` interface from `@cyanheads/mcp-ts-core/mirror`.
|
|
37
|
+
*/
|
|
38
|
+
export declare function clinicalTrialsIngester(ctx: SyncContext, options: IngesterOptions): AsyncGenerator<SyncPage>;
|
|
39
|
+
//# sourceMappingURL=ingester.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingester.d.ts","sourceRoot":"","sources":["../../../../src/services/clinical-trials/mirror/ingester.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAa,WAAW,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AA2CpG,sCAAsC;AACtC,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,iCAAiC;IACjC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAkMD;;;;;GAKG;AACH,wBAAuB,sBAAsB,CAC3C,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,eAAe,GACvB,cAAc,CAAC,QAAQ,CAAC,CA2F1B"}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview ClinicalTrials.gov pageToken-based ingester for the local mirror.
|
|
3
|
+
*
|
|
4
|
+
* Implements the `SyncGenerator` contract consumed by `defineMirror`. Pages the
|
|
5
|
+
* `/studies` endpoint at `pageSize=1000` (API maximum) using `pageToken` paging.
|
|
6
|
+
*
|
|
7
|
+
* - **Full init (`mode === 'init'`):** iterates every page from the beginning (or
|
|
8
|
+
* resumes from a persisted `cursor` after an interrupt). Yields each page with
|
|
9
|
+
* the `cursor` set to the next `pageToken` so the runner can persist it.
|
|
10
|
+
* `checkpoint` advances per page as the max `lastUpdatePostDate` observed.
|
|
11
|
+
*
|
|
12
|
+
* - **Incremental refresh (`mode === 'refresh'`):** filters via
|
|
13
|
+
* `filter.advanced=AREA[LastUpdatePostDate]RANGE[cursor,MAX]` where `cursor`
|
|
14
|
+
* is the last persisted `checkpoint`. No pageToken paging state to resume.
|
|
15
|
+
*
|
|
16
|
+
* Bootstrap rate is ~1 req/s (the minimum interval enforced by the API rate
|
|
17
|
+
* limit), so full init of ~577K studies (~578 pages) takes ~10 min. Incremental
|
|
18
|
+
* refresh fetches only updated studies since the last checkpoint and completes
|
|
19
|
+
* in seconds to a few minutes depending on daily activity.
|
|
20
|
+
* @module services/clinical-trials/mirror/ingester
|
|
21
|
+
*/
|
|
22
|
+
import { serviceUnavailable } from '@cyanheads/mcp-ts-core/errors';
|
|
23
|
+
/** Fields requested from the API for metadata tier — enough for all mirror columns. */
|
|
24
|
+
const MIRROR_FIELDS = [
|
|
25
|
+
'NCTId',
|
|
26
|
+
'BriefTitle',
|
|
27
|
+
'OfficialTitle',
|
|
28
|
+
'OverallStatus',
|
|
29
|
+
'Phase',
|
|
30
|
+
'StudyType',
|
|
31
|
+
'LeadSponsorName',
|
|
32
|
+
'LeadSponsorClass',
|
|
33
|
+
'Condition',
|
|
34
|
+
'InterventionName',
|
|
35
|
+
'EligibilityCriteria',
|
|
36
|
+
'MinimumAge',
|
|
37
|
+
'MaximumAge',
|
|
38
|
+
'Sex',
|
|
39
|
+
'StdAge',
|
|
40
|
+
'HealthyVolunteers',
|
|
41
|
+
'StartDate',
|
|
42
|
+
'PrimaryCompletionDate',
|
|
43
|
+
'LastUpdatePostDate',
|
|
44
|
+
'EnrollmentCount',
|
|
45
|
+
'LocationCity',
|
|
46
|
+
'LocationState',
|
|
47
|
+
'LocationCountry',
|
|
48
|
+
'HasResults',
|
|
49
|
+
].join('|');
|
|
50
|
+
/**
|
|
51
|
+
* Sentinel value for unknown enrollment count on ClinicalTrials.gov.
|
|
52
|
+
* Studies carrying this value are stored with `null` enrollment_count.
|
|
53
|
+
*/
|
|
54
|
+
const ENROLLMENT_SENTINEL = 99_999_999;
|
|
55
|
+
/** Per-page size — API maximum. */
|
|
56
|
+
const PAGE_SIZE = 1000;
|
|
57
|
+
/** Minimum delay between requests (ms) — matches API rate limit guidance. */
|
|
58
|
+
const REQUEST_DELAY_MS = 1050;
|
|
59
|
+
/**
|
|
60
|
+
* Map a raw study record from the API to a `StudyMetaRow` for storage.
|
|
61
|
+
* All fields are extracted from the nested API structure and flattened.
|
|
62
|
+
* Unknown or missing values are mapped to `null`.
|
|
63
|
+
*/
|
|
64
|
+
function rawToRow(study) {
|
|
65
|
+
const ps = (study.protocolSection ?? {});
|
|
66
|
+
const idMod = (ps.identificationModule ?? {});
|
|
67
|
+
const statusMod = (ps.statusModule ?? {});
|
|
68
|
+
const designMod = (ps.designModule ?? {});
|
|
69
|
+
const sponsorMod = (ps.sponsorCollaboratorsModule ?? {});
|
|
70
|
+
const condMod = (ps.conditionsModule ?? {});
|
|
71
|
+
const armsMod = (ps.armsInterventionsModule ?? {});
|
|
72
|
+
const eligMod = (ps.eligibilityModule ?? {});
|
|
73
|
+
const contactsMod = (ps.contactsLocationsModule ?? {});
|
|
74
|
+
// NCT ID
|
|
75
|
+
const nct_id = String(idMod.nctId ?? '');
|
|
76
|
+
// Titles
|
|
77
|
+
const brief_title = str(idMod.briefTitle);
|
|
78
|
+
const official_title = str(idMod.officialTitle);
|
|
79
|
+
// Status
|
|
80
|
+
const overall_status = str(statusMod.overallStatus);
|
|
81
|
+
// Dates from lastUpdatePostDateStruct (contains .date, .type)
|
|
82
|
+
const lastUpdateStruct = statusMod.lastUpdatePostDateStruct;
|
|
83
|
+
const last_update_post_date = str(lastUpdateStruct?.date);
|
|
84
|
+
const startStruct = statusMod.startDateStruct;
|
|
85
|
+
const start_date = str(startStruct?.date);
|
|
86
|
+
const primaryComplStruct = statusMod.primaryCompletionDateStruct;
|
|
87
|
+
const primary_completion_date = str(primaryComplStruct?.date);
|
|
88
|
+
// Design
|
|
89
|
+
const phases = pipeArray(designMod.phases);
|
|
90
|
+
const study_type = str(designMod.studyType);
|
|
91
|
+
const enrollmentInfo = designMod.enrollmentInfo;
|
|
92
|
+
const rawCount = enrollmentInfo?.count;
|
|
93
|
+
const enrollment_count = typeof rawCount === 'number' && rawCount !== ENROLLMENT_SENTINEL ? rawCount : null;
|
|
94
|
+
// Sponsor
|
|
95
|
+
const leadSponsor = sponsorMod.leadSponsor;
|
|
96
|
+
const lead_sponsor_name = str(leadSponsor?.name);
|
|
97
|
+
const lead_sponsor_class = str(leadSponsor?.class);
|
|
98
|
+
// Conditions
|
|
99
|
+
const conditions = pipeArray(condMod.conditions);
|
|
100
|
+
// Interventions — names only from armsInterventionsModule
|
|
101
|
+
const intervList = armsMod.interventions;
|
|
102
|
+
const interventions = pipeArray(intervList?.map((i) => String(i.name ?? '')).filter(Boolean));
|
|
103
|
+
// Eligibility
|
|
104
|
+
const eligibility_criteria = str(eligMod.eligibilityCriteria);
|
|
105
|
+
const minimum_age = str(eligMod.minimumAge);
|
|
106
|
+
const maximum_age = str(eligMod.maximumAge);
|
|
107
|
+
const sex = str(eligMod.sex);
|
|
108
|
+
const std_ages = pipeArray(eligMod.stdAges);
|
|
109
|
+
const hvRaw = eligMod.healthyVolunteers;
|
|
110
|
+
const healthy_volunteers = hvRaw === true ? 1 : hvRaw === false ? 0 : null;
|
|
111
|
+
// Locations — city, state, country summary
|
|
112
|
+
const locationList = contactsMod.locations;
|
|
113
|
+
const locations = pipeArray(locationList
|
|
114
|
+
?.map((loc) => {
|
|
115
|
+
const parts = [loc.city, loc.state, loc.country].filter(Boolean).join(', ');
|
|
116
|
+
return parts || null;
|
|
117
|
+
})
|
|
118
|
+
.filter((p) => p !== null));
|
|
119
|
+
// Has results
|
|
120
|
+
const has_results = study.hasResults === true ? 1 : study.hasResults === false ? 0 : null;
|
|
121
|
+
return {
|
|
122
|
+
nct_id,
|
|
123
|
+
brief_title,
|
|
124
|
+
official_title,
|
|
125
|
+
overall_status,
|
|
126
|
+
phases,
|
|
127
|
+
study_type,
|
|
128
|
+
lead_sponsor_name,
|
|
129
|
+
lead_sponsor_class,
|
|
130
|
+
conditions,
|
|
131
|
+
interventions,
|
|
132
|
+
eligibility_criteria,
|
|
133
|
+
minimum_age,
|
|
134
|
+
maximum_age,
|
|
135
|
+
sex,
|
|
136
|
+
std_ages,
|
|
137
|
+
healthy_volunteers,
|
|
138
|
+
start_date,
|
|
139
|
+
primary_completion_date,
|
|
140
|
+
last_update_post_date,
|
|
141
|
+
enrollment_count,
|
|
142
|
+
locations,
|
|
143
|
+
has_results,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/** Safely coerce to TEXT or null. */
|
|
147
|
+
function str(v) {
|
|
148
|
+
if (v == null || v === '')
|
|
149
|
+
return null;
|
|
150
|
+
return String(v);
|
|
151
|
+
}
|
|
152
|
+
/** Join an array with `|` delimiter, or return null if empty/absent. */
|
|
153
|
+
function pipeArray(arr) {
|
|
154
|
+
if (!arr || arr.length === 0)
|
|
155
|
+
return null;
|
|
156
|
+
return arr.join('|');
|
|
157
|
+
}
|
|
158
|
+
/** Maximum `lastUpdatePostDate` across a page's rows (ISO-comparable strings). */
|
|
159
|
+
function maxCheckpoint(rows) {
|
|
160
|
+
const dates = rows.map((r) => r.last_update_post_date).filter((d) => d != null);
|
|
161
|
+
if (dates.length === 0)
|
|
162
|
+
return;
|
|
163
|
+
dates.sort();
|
|
164
|
+
return dates[dates.length - 1];
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Fetch one page from the ClinicalTrials.gov `/studies` endpoint.
|
|
168
|
+
* Returns the parsed body or throws on failure.
|
|
169
|
+
*/
|
|
170
|
+
async function fetchPage(url, timeoutMs, signal) {
|
|
171
|
+
const combined = AbortSignal.any([signal, AbortSignal.timeout(timeoutMs)]);
|
|
172
|
+
let res;
|
|
173
|
+
try {
|
|
174
|
+
res = await fetch(url.toString(), {
|
|
175
|
+
signal: combined,
|
|
176
|
+
headers: { Accept: 'application/json' },
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
if (signal.aborted)
|
|
181
|
+
throw err;
|
|
182
|
+
throw serviceUnavailable('ClinicalTrials.gov API unreachable during mirror sync', { url: url.toString() }, { cause: err });
|
|
183
|
+
}
|
|
184
|
+
if (!res.ok) {
|
|
185
|
+
throw serviceUnavailable(`ClinicalTrials.gov API returned HTTP ${res.status} during mirror sync`, { url: url.toString(), status: res.status });
|
|
186
|
+
}
|
|
187
|
+
return res.json();
|
|
188
|
+
}
|
|
189
|
+
/** Delay `ms` milliseconds, respecting the abort signal. */
|
|
190
|
+
function sleep(ms, signal) {
|
|
191
|
+
return new Promise((resolve, reject) => {
|
|
192
|
+
if (signal.aborted) {
|
|
193
|
+
reject(signal.reason);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const t = setTimeout(() => {
|
|
197
|
+
signal.removeEventListener('abort', onAbort);
|
|
198
|
+
resolve();
|
|
199
|
+
}, ms);
|
|
200
|
+
const onAbort = () => {
|
|
201
|
+
clearTimeout(t);
|
|
202
|
+
reject(signal.reason);
|
|
203
|
+
};
|
|
204
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Build the base `/studies` URL with common parameters for the metadata tier.
|
|
209
|
+
* The caller adds pagination parameters on top.
|
|
210
|
+
*/
|
|
211
|
+
function buildStudiesUrl(apiBaseUrl, filterAdvanced) {
|
|
212
|
+
const url = new URL(`${apiBaseUrl}/studies`);
|
|
213
|
+
url.searchParams.set('format', 'json');
|
|
214
|
+
url.searchParams.set('fields', MIRROR_FIELDS);
|
|
215
|
+
url.searchParams.set('pageSize', String(PAGE_SIZE));
|
|
216
|
+
if (filterAdvanced)
|
|
217
|
+
url.searchParams.set('filter.advanced', filterAdvanced);
|
|
218
|
+
return url;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Async generator that pages through the ClinicalTrials.gov `/studies` endpoint
|
|
222
|
+
* and yields `SyncPage` objects for the mirror runner.
|
|
223
|
+
*
|
|
224
|
+
* Implements the `SyncGenerator` interface from `@cyanheads/mcp-ts-core/mirror`.
|
|
225
|
+
*/
|
|
226
|
+
export async function* clinicalTrialsIngester(ctx, options) {
|
|
227
|
+
const { mode, cursor, checkpoint, signal } = ctx;
|
|
228
|
+
const { apiBaseUrl, requestTimeoutMs, log } = options;
|
|
229
|
+
let pageCount = 0;
|
|
230
|
+
let totalRecords = 0;
|
|
231
|
+
if (mode === 'init') {
|
|
232
|
+
// Full bootstrap: page from the beginning (or resume via cursor = pageToken).
|
|
233
|
+
const baseUrl = buildStudiesUrl(apiBaseUrl);
|
|
234
|
+
let pageToken = cursor;
|
|
235
|
+
while (true) {
|
|
236
|
+
if (signal.aborted)
|
|
237
|
+
return;
|
|
238
|
+
const url = new URL(baseUrl.toString());
|
|
239
|
+
if (pageToken)
|
|
240
|
+
url.searchParams.set('pageToken', pageToken);
|
|
241
|
+
const body = await fetchPage(url, requestTimeoutMs, signal);
|
|
242
|
+
const raw = (body.studies ?? []);
|
|
243
|
+
const rows = raw.map(rawToRow);
|
|
244
|
+
const nextToken = body.nextPageToken;
|
|
245
|
+
pageCount += 1;
|
|
246
|
+
totalRecords += rows.length;
|
|
247
|
+
// checkpoint: max lastUpdatePostDate seen so far (monotonic across pages).
|
|
248
|
+
const pageCheckpoint = maxCheckpoint(rows);
|
|
249
|
+
if (pageCount % 50 === 0) {
|
|
250
|
+
log?.info?.('Mirror init progress', {
|
|
251
|
+
pages: pageCount,
|
|
252
|
+
records: totalRecords,
|
|
253
|
+
checkpoint: pageCheckpoint,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
yield {
|
|
257
|
+
records: rows,
|
|
258
|
+
cursor: nextToken,
|
|
259
|
+
checkpoint: pageCheckpoint,
|
|
260
|
+
};
|
|
261
|
+
if (!nextToken)
|
|
262
|
+
break;
|
|
263
|
+
pageToken = nextToken;
|
|
264
|
+
// Rate-limit delay between pages.
|
|
265
|
+
if (!signal.aborted)
|
|
266
|
+
await sleep(REQUEST_DELAY_MS, signal).catch(() => undefined);
|
|
267
|
+
}
|
|
268
|
+
log?.info?.('Mirror init complete', { pages: pageCount, records: totalRecords });
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
// Incremental refresh: fetch only studies updated since the last checkpoint.
|
|
272
|
+
// Use RANGE[checkpoint,MAX] filter on LastUpdatePostDate.
|
|
273
|
+
const since = checkpoint ?? '2000-01-01';
|
|
274
|
+
const filterAdvanced = `AREA[LastUpdatePostDate]RANGE[${since},MAX]`;
|
|
275
|
+
const baseUrl = buildStudiesUrl(apiBaseUrl, filterAdvanced);
|
|
276
|
+
let pageToken;
|
|
277
|
+
while (true) {
|
|
278
|
+
if (signal.aborted)
|
|
279
|
+
return;
|
|
280
|
+
const url = new URL(baseUrl.toString());
|
|
281
|
+
if (pageToken)
|
|
282
|
+
url.searchParams.set('pageToken', pageToken);
|
|
283
|
+
const body = await fetchPage(url, requestTimeoutMs, signal);
|
|
284
|
+
const raw = (body.studies ?? []);
|
|
285
|
+
const rows = raw.map(rawToRow);
|
|
286
|
+
const nextToken = body.nextPageToken;
|
|
287
|
+
pageCount += 1;
|
|
288
|
+
totalRecords += rows.length;
|
|
289
|
+
const pageCheckpoint = maxCheckpoint(rows);
|
|
290
|
+
yield {
|
|
291
|
+
records: rows,
|
|
292
|
+
checkpoint: pageCheckpoint,
|
|
293
|
+
// No cursor for refresh — it's not resumed on interrupt.
|
|
294
|
+
};
|
|
295
|
+
if (!nextToken)
|
|
296
|
+
break;
|
|
297
|
+
pageToken = nextToken;
|
|
298
|
+
if (!signal.aborted)
|
|
299
|
+
await sleep(REQUEST_DELAY_MS, signal).catch(() => undefined);
|
|
300
|
+
}
|
|
301
|
+
log?.info?.('Mirror refresh complete', {
|
|
302
|
+
pages: pageCount,
|
|
303
|
+
records: totalRecords,
|
|
304
|
+
since,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=ingester.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingester.js","sourceRoot":"","sources":["../../../../src/services/clinical-trials/mirror/ingester.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Row type for the clinical-trials local mirror — metadata tier only.
|
|
3
|
+
*
|
|
4
|
+
* Columns mirror the metadata fields requested from the ClinicalTrials.gov API
|
|
5
|
+
* during bootstrap/refresh. FTS-indexed columns are denormalized to plain TEXT
|
|
6
|
+
* strings so SQLite FTS5 can search across them. Structured arrays (conditions,
|
|
7
|
+
* interventions, phases) are stored as pipe-delimited TEXT and parsed back on
|
|
8
|
+
* read.
|
|
9
|
+
* @module services/clinical-trials/mirror/types
|
|
10
|
+
*/
|
|
11
|
+
/** A single row in the local mirror — metadata tier. */
|
|
12
|
+
export interface StudyMetaRow {
|
|
13
|
+
/** Brief title. */
|
|
14
|
+
brief_title: string | null;
|
|
15
|
+
/** Pipe-delimited conditions (e.g., Diabetes Mellitus|Type 2). */
|
|
16
|
+
conditions: string | null;
|
|
17
|
+
/**
|
|
18
|
+
* Eligibility criteria text — included in FTS for
|
|
19
|
+
* clinicaltrials_find_eligible queries.
|
|
20
|
+
*/
|
|
21
|
+
eligibility_criteria: string | null;
|
|
22
|
+
/** Enrolled participant count. */
|
|
23
|
+
enrollment_count: number | null;
|
|
24
|
+
/** Whether the study has posted results. */
|
|
25
|
+
has_results: number | null;
|
|
26
|
+
/** Whether the study accepts healthy volunteers. */
|
|
27
|
+
healthy_volunteers: number | null;
|
|
28
|
+
/** Pipe-delimited interventions (e.g., Drug A|Drug B). */
|
|
29
|
+
interventions: string | null;
|
|
30
|
+
/** Last update post date — used as the incremental sync checkpoint. ISO 8601. */
|
|
31
|
+
last_update_post_date: string | null;
|
|
32
|
+
/** Lead sponsor class (e.g., INDUSTRY, NIH). */
|
|
33
|
+
lead_sponsor_class: string | null;
|
|
34
|
+
/** Lead sponsor name. */
|
|
35
|
+
lead_sponsor_name: string | null;
|
|
36
|
+
/**
|
|
37
|
+
* Pipe-delimited location summary strings
|
|
38
|
+
* (e.g., "Seattle, WA, United States|London, United Kingdom").
|
|
39
|
+
*/
|
|
40
|
+
locations: string | null;
|
|
41
|
+
/** Maximum age string (e.g., "65 Years"). */
|
|
42
|
+
maximum_age: string | null;
|
|
43
|
+
/** Minimum age string (e.g., "18 Years"). */
|
|
44
|
+
minimum_age: string | null;
|
|
45
|
+
/** NCT ID — primary key. Format: NCT followed by 8 digits. */
|
|
46
|
+
nct_id: string;
|
|
47
|
+
/** Official title. */
|
|
48
|
+
official_title: string | null;
|
|
49
|
+
/** Overall status (e.g., RECRUITING, COMPLETED). */
|
|
50
|
+
overall_status: string | null;
|
|
51
|
+
/** Pipe-delimited study phases (e.g., PHASE2|PHASE3). */
|
|
52
|
+
phases: string | null;
|
|
53
|
+
/** Primary completion date string. */
|
|
54
|
+
primary_completion_date: string | null;
|
|
55
|
+
/** Sex eligibility (e.g., ALL, FEMALE, MALE). */
|
|
56
|
+
sex: string | null;
|
|
57
|
+
/** Study start date string (YYYY-MM or YYYY-MM-DD). */
|
|
58
|
+
start_date: string | null;
|
|
59
|
+
/** Pipe-delimited standard age groups (e.g., ADULT|OLDER_ADULT). */
|
|
60
|
+
std_ages: string | null;
|
|
61
|
+
/** Study type (e.g., INTERVENTIONAL, OBSERVATIONAL). */
|
|
62
|
+
study_type: string | null;
|
|
63
|
+
}
|
|
64
|
+
/** Map from StudyMetaRow key to SQLite type declaration. */
|
|
65
|
+
export declare const STUDY_META_COLUMNS: Record<keyof StudyMetaRow, string>;
|
|
66
|
+
/** FTS5-indexed columns — the ones search queries scan. */
|
|
67
|
+
export declare const STUDY_META_FTS: Array<keyof StudyMetaRow>;
|
|
68
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/services/clinical-trials/mirror/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,wDAAwD;AACxD,MAAM,WAAW,YAAY;IAC3B,mBAAmB;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,kEAAkE;IAClE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;OAGG;IACH,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,kCAAkC;IAClC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,4CAA4C;IAC5C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,oDAAoD;IACpD,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,0DAA0D;IAC1D,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iFAAiF;IACjF,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,gDAAgD;IAChD,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,yBAAyB;IACzB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;OAGG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,6CAA6C;IAC7C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,6CAA6C;IAC7C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,oDAAoD;IACpD,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,yDAAyD;IACzD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,sCAAsC;IACtC,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,iDAAiD;IACjD,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,uDAAuD;IACvD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,oEAAoE;IACpE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,wDAAwD;IACxD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,4DAA4D;AAC5D,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,YAAY,EAAE,MAAM,CAuBjE,CAAC;AAEF,2DAA2D;AAC3D,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,MAAM,YAAY,CAOpD,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Row type for the clinical-trials local mirror — metadata tier only.
|
|
3
|
+
*
|
|
4
|
+
* Columns mirror the metadata fields requested from the ClinicalTrials.gov API
|
|
5
|
+
* during bootstrap/refresh. FTS-indexed columns are denormalized to plain TEXT
|
|
6
|
+
* strings so SQLite FTS5 can search across them. Structured arrays (conditions,
|
|
7
|
+
* interventions, phases) are stored as pipe-delimited TEXT and parsed back on
|
|
8
|
+
* read.
|
|
9
|
+
* @module services/clinical-trials/mirror/types
|
|
10
|
+
*/
|
|
11
|
+
/** Map from StudyMetaRow key to SQLite type declaration. */
|
|
12
|
+
export const STUDY_META_COLUMNS = {
|
|
13
|
+
nct_id: 'TEXT NOT NULL',
|
|
14
|
+
brief_title: 'TEXT',
|
|
15
|
+
official_title: 'TEXT',
|
|
16
|
+
overall_status: 'TEXT',
|
|
17
|
+
phases: 'TEXT',
|
|
18
|
+
study_type: 'TEXT',
|
|
19
|
+
lead_sponsor_name: 'TEXT',
|
|
20
|
+
lead_sponsor_class: 'TEXT',
|
|
21
|
+
conditions: 'TEXT',
|
|
22
|
+
interventions: 'TEXT',
|
|
23
|
+
eligibility_criteria: 'TEXT',
|
|
24
|
+
minimum_age: 'TEXT',
|
|
25
|
+
maximum_age: 'TEXT',
|
|
26
|
+
sex: 'TEXT',
|
|
27
|
+
std_ages: 'TEXT',
|
|
28
|
+
healthy_volunteers: 'INTEGER',
|
|
29
|
+
start_date: 'TEXT',
|
|
30
|
+
primary_completion_date: 'TEXT',
|
|
31
|
+
last_update_post_date: 'TEXT',
|
|
32
|
+
enrollment_count: 'INTEGER',
|
|
33
|
+
locations: 'TEXT',
|
|
34
|
+
has_results: 'INTEGER',
|
|
35
|
+
};
|
|
36
|
+
/** FTS5-indexed columns — the ones search queries scan. */
|
|
37
|
+
export const STUDY_META_FTS = [
|
|
38
|
+
'brief_title',
|
|
39
|
+
'official_title',
|
|
40
|
+
'conditions',
|
|
41
|
+
'interventions',
|
|
42
|
+
'eligibility_criteria',
|
|
43
|
+
'lead_sponsor_name',
|
|
44
|
+
];
|
|
45
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/services/clinical-trials/mirror/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAwDH,4DAA4D;AAC5D,MAAM,CAAC,MAAM,kBAAkB,GAAuC;IACpE,MAAM,EAAE,eAAe;IACvB,WAAW,EAAE,MAAM;IACnB,cAAc,EAAE,MAAM;IACtB,cAAc,EAAE,MAAM;IACtB,MAAM,EAAE,MAAM;IACd,UAAU,EAAE,MAAM;IAClB,iBAAiB,EAAE,MAAM;IACzB,kBAAkB,EAAE,MAAM;IAC1B,UAAU,EAAE,MAAM;IAClB,aAAa,EAAE,MAAM;IACrB,oBAAoB,EAAE,MAAM;IAC5B,WAAW,EAAE,MAAM;IACnB,WAAW,EAAE,MAAM;IACnB,GAAG,EAAE,MAAM;IACX,QAAQ,EAAE,MAAM;IAChB,kBAAkB,EAAE,SAAS;IAC7B,UAAU,EAAE,MAAM;IAClB,uBAAuB,EAAE,MAAM;IAC/B,qBAAqB,EAAE,MAAM;IAC7B,gBAAgB,EAAE,SAAS;IAC3B,SAAS,EAAE,MAAM;IACjB,WAAW,EAAE,SAAS;CACvB,CAAC;AAEF,2DAA2D;AAC3D,MAAM,CAAC,MAAM,cAAc,GAA8B;IACvD,aAAa;IACb,gBAAgB;IAChB,YAAY;IACZ,eAAe;IACf,sBAAsB;IACtB,mBAAmB;CACpB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "clinicaltrialsgov-mcp-server",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.2",
|
|
4
4
|
"mcpName": "io.github.cyanheads/clinicaltrialsgov-mcp-server",
|
|
5
5
|
"description": "Search ClinicalTrials.gov trials, retrieve study details and results, and match patients to eligible trials via MCP. STDIO or Streamable HTTP.",
|
|
6
6
|
"main": "dist/index.js",
|