@pharmatools/pubcrawl 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -30,16 +30,13 @@ Built by [PharmaTools.AI](https://pharmatools.ai).
30
30
 
31
31
  ### Prerequisites
32
32
 
33
- - Node.js 18+
33
+ - Node.js 20+
34
34
  - An MCP-compatible client (Claude Desktop, Cursor, etc.)
35
35
 
36
- ### Install and build
36
+ ### Install via npm
37
37
 
38
38
  ```bash
39
- git clone https://github.com/nickjlamb/pubcrawl.git
40
- cd pubcrawl
41
- npm install
42
- npm run build
39
+ npm install -g @pharmatools/pubcrawl
43
40
  ```
44
41
 
45
42
  ### Configure Claude Desktop
@@ -53,8 +50,7 @@ Add to your `claude_desktop_config.json`:
53
50
  {
54
51
  "mcpServers": {
55
52
  "pubcrawl": {
56
- "command": "node",
57
- "args": ["/path/to/pubcrawl/dist/index.js"]
53
+ "command": "pubcrawl"
58
54
  }
59
55
  }
60
56
  }
@@ -62,6 +58,28 @@ Add to your `claude_desktop_config.json`:
62
58
 
63
59
  Restart Claude Desktop. PubCrawl will appear under **+ → Connectors**.
64
60
 
61
+ ### Install from source
62
+
63
+ ```bash
64
+ git clone https://github.com/nickjlamb/pubcrawl.git
65
+ cd pubcrawl
66
+ npm install
67
+ npm run build
68
+ ```
69
+
70
+ Then point the config at the built file:
71
+
72
+ ```json
73
+ {
74
+ "mcpServers": {
75
+ "pubcrawl": {
76
+ "command": "node",
77
+ "args": ["/path/to/pubcrawl/dist/index.js"]
78
+ }
79
+ }
80
+ }
81
+ ```
82
+
65
83
  ### NCBI API key (optional)
66
84
 
67
85
  Without an API key, requests are rate-limited to 3/second. With one, you get 10/second.
@@ -74,8 +92,7 @@ Without an API key, requests are rate-limited to 3/second. With one, you get 10/
74
92
  {
75
93
  "mcpServers": {
76
94
  "pubcrawl": {
77
- "command": "node",
78
- "args": ["/path/to/pubcrawl/dist/index.js"],
95
+ "command": "pubcrawl",
79
96
  "env": {
80
97
  "NCBI_API_KEY": "your_key_here"
81
98
  }
package/dist/index.js CHANGED
@@ -13,6 +13,8 @@ import { registerUspiTool } from "./tools/uspi.js";
13
13
  import { registerSmpcTool } from "./tools/smpc.js";
14
14
  import { registerCompareLabelsTool } from "./tools/compare-labels.js";
15
15
  import { registerSearchIndicationTool } from "./tools/search-indication.js";
16
+ import { registerTrialsSearchTool } from "./tools/trials-search.js";
17
+ import { registerTrialDetailTool } from "./tools/trials-detail.js";
16
18
  const server = new McpServer({
17
19
  name: "pubcrawl",
18
20
  version: "2.0.0",
@@ -32,6 +34,8 @@ registerUspiTool(server);
32
34
  registerSmpcTool(server);
33
35
  registerCompareLabelsTool(server);
34
36
  registerSearchIndicationTool(server);
37
+ registerTrialsSearchTool(server);
38
+ registerTrialDetailTool(server);
35
39
  // Start server
36
40
  async function main() {
37
41
  const transport = new StdioServerTransport();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAE5E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,4DAA4D;AAC5D,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC7B,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AACtC,CAAC;AAED,qBAAqB;AACrB,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC3B,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC7B,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC7B,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC5B,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACzB,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC7B,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACzB,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACzB,yBAAyB,CAAC,MAAM,CAAC,CAAC;AAClC,4BAA4B,CAAC,MAAM,CAAC,CAAC;AAErC,eAAe;AACf,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;AACxD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,4DAA4D;AAC5D,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC7B,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AACtC,CAAC;AAED,qBAAqB;AACrB,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC3B,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC7B,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC7B,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC5B,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACzB,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC7B,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACzB,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACzB,yBAAyB,CAAC,MAAM,CAAC,CAAC;AAClC,4BAA4B,CAAC,MAAM,CAAC,CAAC;AACrC,wBAAwB,CAAC,MAAM,CAAC,CAAC;AACjC,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAEhC,eAAe;AACf,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;AACxD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -5,6 +5,7 @@ export declare const TTL: {
5
5
  readonly RELATED: number;
6
6
  readonly SUMMARY: number;
7
7
  readonly LABEL: number;
8
+ readonly TRIAL: number;
8
9
  };
9
10
  export declare class LRUCache {
10
11
  private cache;
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/lib/cache.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,GAAG;;;;;;;CAON,CAAC;AAEX,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,SAAsB;IAI5C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAelC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAgBhD,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF;AAED,eAAO,MAAM,KAAK,UAAiB,CAAC"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/lib/cache.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,GAAG;;;;;;;;CAQN,CAAC;AAEX,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,SAAsB;IAI5C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAelC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAgBhD,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF;AAED,eAAO,MAAM,KAAK,UAAiB,CAAC"}
package/dist/lib/cache.js CHANGED
@@ -1,5 +1,6 @@
1
1
  const DEFAULT_MAX_ENTRIES = 500;
2
2
  const ONE_HOUR_MS = 60 * 60 * 1000;
3
+ const FOUR_HOURS_MS = 4 * 60 * 60 * 1000;
3
4
  const ONE_DAY_MS = 24 * 60 * 60 * 1000;
4
5
  export const TTL = {
5
6
  SEARCH: ONE_HOUR_MS,
@@ -8,6 +9,7 @@ export const TTL = {
8
9
  RELATED: ONE_HOUR_MS,
9
10
  SUMMARY: ONE_HOUR_MS,
10
11
  LABEL: ONE_DAY_MS,
12
+ TRIAL: FOUR_HOURS_MS,
11
13
  };
12
14
  export class LRUCache {
13
15
  cache = new Map();
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/lib/cache.ts"],"names":[],"mappings":"AAEA,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACnC,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvC,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,MAAM,EAAE,WAAW;IACnB,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,WAAW;IACpB,OAAO,EAAE,WAAW;IACpB,KAAK,EAAE,UAAU;CACT,CAAC;AAEX,MAAM,OAAO,QAAQ;IACX,KAAK,GAAG,IAAI,GAAG,EAA+B,CAAC;IAC/C,UAAU,CAAS;IAE3B,YAAY,UAAU,GAAG,mBAAmB;QAC1C,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,GAAG,CAAI,GAAW;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAE7B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;YAC7C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,mCAAmC;QACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC,KAAU,CAAC;IAC1B,CAAC;IAED,GAAG,CAAI,GAAW,EAAE,KAAQ,EAAE,GAAW;QACvC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,0CAA0C;YAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAChD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/lib/cache.ts"],"names":[],"mappings":"AAEA,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACnC,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACzC,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvC,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,MAAM,EAAE,WAAW;IACnB,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,WAAW;IACpB,OAAO,EAAE,WAAW;IACpB,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,aAAa;CACZ,CAAC;AAEX,MAAM,OAAO,QAAQ;IACX,KAAK,GAAG,IAAI,GAAG,EAA+B,CAAC;IAC/C,UAAU,CAAS;IAE3B,YAAY,UAAU,GAAG,mBAAmB;QAC1C,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,GAAG,CAAI,GAAW;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAE7B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;YAC7C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,mCAAmC;QACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC,KAAU,CAAC;IAC1B,CAAC;IAED,GAAG,CAAI,GAAW,EAAE,KAAQ,EAAE,GAAW;QACvC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,0CAA0C;YAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAChD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { ClinicalTrialSummary, ClinicalTrialDetail } from "../types.js";
2
+ export declare function searchTrials(params: {
3
+ condition?: string;
4
+ intervention?: string;
5
+ term?: string;
6
+ status?: string;
7
+ phase?: string;
8
+ maxResults?: number;
9
+ sort?: string;
10
+ }): Promise<{
11
+ results: ClinicalTrialSummary[];
12
+ total_count: number;
13
+ }>;
14
+ export declare function getTrialDetail(nctId: string): Promise<ClinicalTrialDetail>;
15
+ //# sourceMappingURL=clinicaltrials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clinicaltrials.d.ts","sourceRoot":"","sources":["../../src/lib/clinicaltrials.ts"],"names":[],"mappings":"AACA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EAKpB,MAAM,aAAa,CAAC;AA6FrB,wBAAsB,YAAY,CAAC,MAAM,EAAE;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CA2DpE;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA0FhF"}
@@ -0,0 +1,213 @@
1
+ import { cache, TTL } from "./cache.js";
2
+ const BASE_URL = "https://clinicaltrials.gov/api/v2";
3
+ const REQUEST_DELAY_MS = 1200; // ~50 req/min
4
+ const TIMEOUT_MS = 15000;
5
+ let lastRequestTime = 0;
6
+ async function rateLimitedFetch(url) {
7
+ const now = Date.now();
8
+ const elapsed = now - lastRequestTime;
9
+ if (elapsed < REQUEST_DELAY_MS) {
10
+ await new Promise((resolve) => setTimeout(resolve, REQUEST_DELAY_MS - elapsed));
11
+ }
12
+ lastRequestTime = Date.now();
13
+ const controller = new AbortController();
14
+ const timeout = setTimeout(() => controller.abort(), TIMEOUT_MS);
15
+ try {
16
+ const response = await fetch(url, { signal: controller.signal });
17
+ if (!response.ok) {
18
+ throw new Error(`ClinicalTrials.gov API error: ${response.status} ${response.statusText}`);
19
+ }
20
+ return response;
21
+ }
22
+ finally {
23
+ clearTimeout(timeout);
24
+ }
25
+ }
26
+ function str(value) {
27
+ return value != null ? String(value) : "";
28
+ }
29
+ function studyToSummary(study) {
30
+ const proto = study.protocolSection;
31
+ if (!proto) {
32
+ return {
33
+ nct_id: "",
34
+ title: "",
35
+ status: "",
36
+ phase: "",
37
+ conditions: [],
38
+ interventions: [],
39
+ enrollment: null,
40
+ sponsor: "",
41
+ start_date: "",
42
+ completion_date: "",
43
+ study_type: "",
44
+ url: "",
45
+ };
46
+ }
47
+ const id = proto.identificationModule;
48
+ const status = proto.statusModule;
49
+ const design = proto.designModule;
50
+ const conditions = proto.conditionsModule;
51
+ const arms = proto.armsInterventionsModule;
52
+ const sponsor = proto.sponsorCollaboratorsModule;
53
+ const interventionList = arms?.interventions ?? [];
54
+ const interventions = interventionList.map((i) => ({
55
+ type: str(i.type),
56
+ name: str(i.name),
57
+ }));
58
+ const startDateStruct = status?.startDateStruct;
59
+ const completionDateStruct = status?.completionDateStruct;
60
+ const enrollmentInfo = design?.enrollmentInfo;
61
+ const leadSponsor = sponsor?.leadSponsor;
62
+ const phases = design?.phases ?? [];
63
+ const nctId = str(id?.nctId);
64
+ return {
65
+ nct_id: nctId,
66
+ title: str(id?.briefTitle),
67
+ status: str(status?.overallStatus),
68
+ phase: phases.join("/") || "N/A",
69
+ conditions: conditions?.conditions ?? [],
70
+ interventions,
71
+ enrollment: enrollmentInfo?.count != null ? Number(enrollmentInfo.count) : null,
72
+ sponsor: str(leadSponsor?.name),
73
+ start_date: str(startDateStruct?.date),
74
+ completion_date: str(completionDateStruct?.date),
75
+ study_type: str(design?.studyType),
76
+ url: nctId ? `https://clinicaltrials.gov/study/${nctId}` : "",
77
+ };
78
+ }
79
+ export async function searchTrials(params) {
80
+ const cacheKey = `ct:search:${JSON.stringify(params)}`;
81
+ const cached = cache.get(cacheKey);
82
+ if (cached)
83
+ return cached;
84
+ const url = new URL(`${BASE_URL}/studies`);
85
+ // Build query.cond / query.intr / query.term
86
+ if (params.condition)
87
+ url.searchParams.set("query.cond", params.condition);
88
+ if (params.intervention)
89
+ url.searchParams.set("query.intr", params.intervention);
90
+ if (params.term)
91
+ url.searchParams.set("query.term", params.term);
92
+ // Filters
93
+ if (params.status)
94
+ url.searchParams.set("filter.overallStatus", params.status);
95
+ if (params.phase)
96
+ url.searchParams.set("filter.phase", params.phase);
97
+ // Limit fields to keep payload small
98
+ url.searchParams.set("fields", [
99
+ "NCTId",
100
+ "BriefTitle",
101
+ "OverallStatus",
102
+ "Phase",
103
+ "Condition",
104
+ "InterventionName",
105
+ "InterventionType",
106
+ "EnrollmentCount",
107
+ "LeadSponsorName",
108
+ "StartDate",
109
+ "CompletionDate",
110
+ "StudyType",
111
+ ].join("|"));
112
+ url.searchParams.set("pageSize", String(params.maxResults ?? 10));
113
+ // Sort
114
+ const sortMap = {
115
+ relevance: "",
116
+ last_updated: "LastUpdatePostDate",
117
+ start_date: "StudyFirstPostDate",
118
+ enrollment: "EnrollmentCount",
119
+ };
120
+ const sortValue = sortMap[params.sort ?? "relevance"];
121
+ if (sortValue)
122
+ url.searchParams.set("sort", sortValue);
123
+ url.searchParams.set("format", "json");
124
+ const response = await rateLimitedFetch(url.toString());
125
+ const data = await response.json();
126
+ const studies = data.studies ?? [];
127
+ const results = studies.map(studyToSummary);
128
+ const totalCount = data.totalCount ?? results.length;
129
+ const result = { results, total_count: totalCount };
130
+ cache.set(cacheKey, result, TTL.SEARCH);
131
+ return result;
132
+ }
133
+ export async function getTrialDetail(nctId) {
134
+ const cacheKey = `ct:detail:${nctId}`;
135
+ const cached = cache.get(cacheKey);
136
+ if (cached)
137
+ return cached;
138
+ const url = `${BASE_URL}/studies/${encodeURIComponent(nctId)}?format=json`;
139
+ const response = await rateLimitedFetch(url);
140
+ const study = await response.json();
141
+ const summary = studyToSummary(study);
142
+ const proto = study.protocolSection;
143
+ const id = proto?.identificationModule;
144
+ const desc = proto?.descriptionModule;
145
+ const eligibility = proto?.eligibilityModule;
146
+ const designModule = proto?.designModule;
147
+ const armsModule = proto?.armsInterventionsModule;
148
+ const outcomesModule = proto?.outcomesModule;
149
+ const contactsModule = proto?.contactsLocationsModule;
150
+ const refsModule = proto?.referencesModule;
151
+ // Design info
152
+ const designInfo = designModule?.designInfo;
153
+ const maskingInfo = designInfo?.maskingInfo;
154
+ const design = {
155
+ allocation: str(designInfo?.allocation),
156
+ intervention_model: str(designInfo?.interventionModel),
157
+ primary_purpose: str(designInfo?.primaryPurpose),
158
+ masking: str(maskingInfo?.masking),
159
+ who_masked: maskingInfo?.whoMasked ?? [],
160
+ };
161
+ // Arms
162
+ const armGroups = armsModule?.armGroups ?? [];
163
+ const arms = armGroups.map((a) => ({
164
+ label: str(a.label),
165
+ type: str(a.type),
166
+ description: str(a.description),
167
+ intervention_names: a.interventionNames ?? [],
168
+ }));
169
+ // Outcomes
170
+ const parseOutcomes = (list) => {
171
+ const items = list ?? [];
172
+ return items.map((o) => ({
173
+ measure: str(o.measure),
174
+ description: str(o.description),
175
+ time_frame: str(o.timeFrame),
176
+ }));
177
+ };
178
+ const primaryOutcomes = parseOutcomes(outcomesModule?.primaryOutcomes);
179
+ const secondaryOutcomes = parseOutcomes(outcomesModule?.secondaryOutcomes);
180
+ // Locations count
181
+ const locations = contactsModule?.locations ?? [];
182
+ // Lead investigator
183
+ const overallOfficials = contactsModule?.overallOfficials ?? [];
184
+ const leadInvestigator = overallOfficials.length > 0 ? str(overallOfficials[0].name) : "";
185
+ // Associated PMIDs
186
+ const references = refsModule?.references ?? [];
187
+ const pmids = references
188
+ .map((r) => str(r.pmid))
189
+ .filter((p) => p !== "");
190
+ const detail = {
191
+ ...summary,
192
+ official_title: str(id?.officialTitle),
193
+ summary: str(desc?.briefSummary),
194
+ eligibility: {
195
+ criteria: str(eligibility?.eligibilityCriteria),
196
+ gender: str(eligibility?.sex),
197
+ minimum_age: str(eligibility?.minimumAge),
198
+ maximum_age: str(eligibility?.maximumAge),
199
+ healthy_volunteers: str(eligibility?.healthyVolunteers),
200
+ },
201
+ design,
202
+ arms,
203
+ primary_outcomes: primaryOutcomes,
204
+ secondary_outcomes: secondaryOutcomes,
205
+ locations_count: locations.length,
206
+ lead_investigator: leadInvestigator,
207
+ associated_pmids: pmids,
208
+ url: `https://clinicaltrials.gov/study/${nctId}`,
209
+ };
210
+ cache.set(cacheKey, detail, TTL.TRIAL);
211
+ return detail;
212
+ }
213
+ //# sourceMappingURL=clinicaltrials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clinicaltrials.js","sourceRoot":"","sources":["../../src/lib/clinicaltrials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerTrialDetailTool(server: McpServer): void;
3
+ //# sourceMappingURL=trials-detail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trials-detail.d.ts","sourceRoot":"","sources":["../../src/tools/trials-detail.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUpE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuC/D"}
@@ -0,0 +1,38 @@
1
+ import { z } from "zod";
2
+ import { getTrialDetail } from "../lib/clinicaltrials.js";
3
+ const schema = {
4
+ nctId: z
5
+ .string()
6
+ .regex(/^NCT\d{8}$/, "Must be a valid NCT ID (e.g., NCT12345678)")
7
+ .describe("ClinicalTrials.gov NCT identifier (e.g., NCT03086486)"),
8
+ };
9
+ export function registerTrialDetailTool(server) {
10
+ server.tool("get_trial", "Get detailed information about a specific clinical trial from ClinicalTrials.gov. Returns eligibility criteria, study design, arms, outcomes, locations, and associated PubMed IDs.", schema, async (params) => {
11
+ try {
12
+ const detail = await getTrialDetail(params.nctId);
13
+ return {
14
+ content: [{
15
+ type: "text",
16
+ text: JSON.stringify(detail, null, 2),
17
+ }],
18
+ };
19
+ }
20
+ catch (error) {
21
+ const message = error instanceof Error ? error.message : String(error);
22
+ if (message.includes("404")) {
23
+ return {
24
+ content: [{
25
+ type: "text",
26
+ text: JSON.stringify({ error: `Clinical trial ${params.nctId} not found. Verify the NCT ID is correct.` }, null, 2),
27
+ }],
28
+ isError: true,
29
+ };
30
+ }
31
+ return {
32
+ content: [{ type: "text", text: `Error fetching trial details: ${message}` }],
33
+ isError: true,
34
+ };
35
+ }
36
+ });
37
+ }
38
+ //# sourceMappingURL=trials-detail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trials-detail.js","sourceRoot":"","sources":["../../src/tools/trials-detail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,MAAM,GAAG;IACb,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,KAAK,CAAC,YAAY,EAAE,4CAA4C,CAAC;SACjE,QAAQ,CAAC,uDAAuD,CAAC;CACrE,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,IAAI,CACT,WAAW,EACX,qLAAqL,EACrL,MAAM,EACN,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAElD,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;qBACtC,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAEvE,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB,EAAE,KAAK,EAAE,kBAAkB,MAAM,CAAC,KAAK,2CAA2C,EAAE,EACpF,IAAI,EACJ,CAAC,CACF;yBACF,CAAC;oBACF,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iCAAiC,OAAO,EAAE,EAAE,CAAC;gBAC7E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerTrialsSearchTool(server: McpServer): void;
3
+ //# sourceMappingURL=trials-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trials-search.d.ts","sourceRoot":"","sources":["../../src/tools/trials-search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8BpE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8ChE"}
@@ -0,0 +1,66 @@
1
+ import { z } from "zod";
2
+ import { searchTrials } from "../lib/clinicaltrials.js";
3
+ const schema = {
4
+ condition: z.string().optional().describe("Disease or condition (e.g., 'breast cancer', 'diabetes')"),
5
+ intervention: z.string().optional().describe("Drug or therapy (e.g., 'pembrolizumab', 'radiation')"),
6
+ term: z.string().optional().describe("General search term (searches all fields)"),
7
+ status: z
8
+ .enum([
9
+ "RECRUITING",
10
+ "COMPLETED",
11
+ "ACTIVE_NOT_RECRUITING",
12
+ "NOT_YET_RECRUITING",
13
+ "TERMINATED",
14
+ "WITHDRAWN",
15
+ "SUSPENDED",
16
+ ])
17
+ .optional()
18
+ .describe("Trial recruitment status filter"),
19
+ phase: z
20
+ .enum(["EARLY_PHASE1", "PHASE1", "PHASE2", "PHASE3", "PHASE4", "NA"])
21
+ .optional()
22
+ .describe("Trial phase filter"),
23
+ maxResults: z.number().min(1).max(100).default(10).describe("Maximum number of results (1-100)"),
24
+ sort: z
25
+ .enum(["relevance", "last_updated", "start_date", "enrollment"])
26
+ .default("relevance")
27
+ .describe("Sort order for results"),
28
+ };
29
+ export function registerTrialsSearchTool(server) {
30
+ server.tool("search_trials", "Search ClinicalTrials.gov for clinical trials. Filter by condition, intervention, status, and phase. Returns trial summaries with NCT IDs, status, sponsors, and enrollment info.", schema, async (params) => {
31
+ try {
32
+ if (!params.condition && !params.intervention && !params.term) {
33
+ return {
34
+ content: [{
35
+ type: "text",
36
+ text: JSON.stringify({ error: "At least one of condition, intervention, or term is required" }, null, 2),
37
+ }],
38
+ isError: true,
39
+ };
40
+ }
41
+ const result = await searchTrials({
42
+ condition: params.condition,
43
+ intervention: params.intervention,
44
+ term: params.term,
45
+ status: params.status,
46
+ phase: params.phase,
47
+ maxResults: params.maxResults,
48
+ sort: params.sort,
49
+ });
50
+ return {
51
+ content: [{
52
+ type: "text",
53
+ text: JSON.stringify(result, null, 2),
54
+ }],
55
+ };
56
+ }
57
+ catch (error) {
58
+ const message = error instanceof Error ? error.message : String(error);
59
+ return {
60
+ content: [{ type: "text", text: `Error searching ClinicalTrials.gov: ${message}` }],
61
+ isError: true,
62
+ };
63
+ }
64
+ });
65
+ }
66
+ //# sourceMappingURL=trials-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trials-search.js","sourceRoot":"","sources":["../../src/tools/trials-search.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -90,4 +90,59 @@ export interface IndicationSearchResult {
90
90
  condition: string;
91
91
  drugs: DrugApprovalEntry[];
92
92
  }
93
+ export interface TrialIntervention {
94
+ type: string;
95
+ name: string;
96
+ }
97
+ export interface ClinicalTrialSummary {
98
+ nct_id: string;
99
+ title: string;
100
+ status: string;
101
+ phase: string;
102
+ conditions: string[];
103
+ interventions: TrialIntervention[];
104
+ enrollment: number | null;
105
+ sponsor: string;
106
+ start_date: string;
107
+ completion_date: string;
108
+ study_type: string;
109
+ url: string;
110
+ }
111
+ export interface TrialOutcome {
112
+ measure: string;
113
+ description: string;
114
+ time_frame: string;
115
+ }
116
+ export interface TrialArmGroup {
117
+ label: string;
118
+ type: string;
119
+ description: string;
120
+ intervention_names: string[];
121
+ }
122
+ export interface TrialDesign {
123
+ allocation: string;
124
+ intervention_model: string;
125
+ primary_purpose: string;
126
+ masking: string;
127
+ who_masked: string[];
128
+ }
129
+ export interface ClinicalTrialDetail extends ClinicalTrialSummary {
130
+ official_title: string;
131
+ summary: string;
132
+ eligibility: {
133
+ criteria: string;
134
+ gender: string;
135
+ minimum_age: string;
136
+ maximum_age: string;
137
+ healthy_volunteers: string;
138
+ };
139
+ design: TrialDesign;
140
+ arms: TrialArmGroup[];
141
+ primary_outcomes: TrialOutcome[];
142
+ secondary_outcomes: TrialOutcome[];
143
+ locations_count: number;
144
+ lead_investigator: string;
145
+ associated_pmids: string[];
146
+ url: string;
147
+ }
93
148
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pharmatools/pubcrawl",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "MCP server for PubMed literature search and US/UK drug labelling — built by PharmaTools.AI",
5
5
  "mcpName": "io.github.nickjlamb/pubcrawl",
6
6
  "author": "PharmaTools.AI",
package/server.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
3
  "name": "io.github.nickjlamb/pubcrawl",
4
- "description": "MCP server for PubMed literature search and US/UK drug labelling. 10 tools: search PubMed, get abstracts, full text, related papers, citations, trending papers, US prescribing information (DailyMed), UK SmPC (eMC), compare US/UK labels, and search by indication (OpenFDA).",
4
+ "description": "PubMed literature search and US/UK drug labelling for AI assistants.",
5
5
  "repository": {
6
6
  "url": "https://github.com/nickjlamb/pubcrawl",
7
7
  "source": "github"