@pharmatools/pubcrawl 2.0.0 → 2.1.1
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 +37 -11
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/cache.d.ts +1 -0
- package/dist/lib/cache.d.ts.map +1 -1
- package/dist/lib/cache.js +2 -0
- package/dist/lib/cache.js.map +1 -1
- package/dist/lib/clinicaltrials.d.ts +15 -0
- package/dist/lib/clinicaltrials.d.ts.map +1 -0
- package/dist/lib/clinicaltrials.js +213 -0
- package/dist/lib/clinicaltrials.js.map +1 -0
- package/dist/tools/trials-detail.d.ts +3 -0
- package/dist/tools/trials-detail.d.ts.map +1 -0
- package/dist/tools/trials-detail.js +38 -0
- package/dist/tools/trials-detail.js.map +1 -0
- package/dist/tools/trials-search.d.ts +3 -0
- package/dist/tools/trials-search.d.ts.map +1 -0
- package/dist/tools/trials-search.js +66 -0
- package/dist/tools/trials-search.js.map +1 -0
- package/dist/types.d.ts +55 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/server.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# PubCrawl
|
|
2
2
|
|
|
3
|
-
An [MCP server](https://modelcontextprotocol.io) that gives LLM clients access to PubMed, FDA drug labelling,
|
|
3
|
+
An [MCP server](https://modelcontextprotocol.io) that gives LLM clients access to PubMed, FDA drug labelling, UK medicines data, and ClinicalTrials.gov. A peer-reviewed pub crawl through the literature — the label — and the trial.
|
|
4
4
|
|
|
5
5
|
Built by [PharmaTools.AI](https://pharmatools.ai).
|
|
6
6
|
|
|
@@ -26,20 +26,24 @@ Built by [PharmaTools.AI](https://pharmatools.ai).
|
|
|
26
26
|
| `compare_labels` | Side-by-side comparison of US (USPI) and UK (SmPC) labelling for the same drug. Spot regulatory differences in indications, warnings, and dosing. |
|
|
27
27
|
| `search_by_indication` | Find drugs approved for a medical condition. Searches FDA labelling via OpenFDA, then cross-references UK availability on the eMC. |
|
|
28
28
|
|
|
29
|
+
### Clinical Trials
|
|
30
|
+
|
|
31
|
+
| Tool | What it does |
|
|
32
|
+
|------|-------------|
|
|
33
|
+
| `search_trials` | Search ClinicalTrials.gov for clinical trials. Filter by condition, intervention, recruitment status, and phase. Returns NCT IDs, sponsors, enrollment, and links. |
|
|
34
|
+
| `get_trial` | Get full details for a clinical trial by NCT ID — eligibility criteria, study design, arms, primary/secondary outcomes, locations, and associated PubMed IDs. |
|
|
35
|
+
|
|
29
36
|
## Setup
|
|
30
37
|
|
|
31
38
|
### Prerequisites
|
|
32
39
|
|
|
33
|
-
- Node.js
|
|
40
|
+
- Node.js 20+
|
|
34
41
|
- An MCP-compatible client (Claude Desktop, Cursor, etc.)
|
|
35
42
|
|
|
36
|
-
### Install
|
|
43
|
+
### Install via npm
|
|
37
44
|
|
|
38
45
|
```bash
|
|
39
|
-
|
|
40
|
-
cd pubcrawl
|
|
41
|
-
npm install
|
|
42
|
-
npm run build
|
|
46
|
+
npm install -g @pharmatools/pubcrawl
|
|
43
47
|
```
|
|
44
48
|
|
|
45
49
|
### Configure Claude Desktop
|
|
@@ -53,8 +57,7 @@ Add to your `claude_desktop_config.json`:
|
|
|
53
57
|
{
|
|
54
58
|
"mcpServers": {
|
|
55
59
|
"pubcrawl": {
|
|
56
|
-
"command": "
|
|
57
|
-
"args": ["/path/to/pubcrawl/dist/index.js"]
|
|
60
|
+
"command": "pubcrawl"
|
|
58
61
|
}
|
|
59
62
|
}
|
|
60
63
|
}
|
|
@@ -62,6 +65,28 @@ Add to your `claude_desktop_config.json`:
|
|
|
62
65
|
|
|
63
66
|
Restart Claude Desktop. PubCrawl will appear under **+ → Connectors**.
|
|
64
67
|
|
|
68
|
+
### Install from source
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
git clone https://github.com/nickjlamb/pubcrawl.git
|
|
72
|
+
cd pubcrawl
|
|
73
|
+
npm install
|
|
74
|
+
npm run build
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Then point the config at the built file:
|
|
78
|
+
|
|
79
|
+
```json
|
|
80
|
+
{
|
|
81
|
+
"mcpServers": {
|
|
82
|
+
"pubcrawl": {
|
|
83
|
+
"command": "node",
|
|
84
|
+
"args": ["/path/to/pubcrawl/dist/index.js"]
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
65
90
|
### NCBI API key (optional)
|
|
66
91
|
|
|
67
92
|
Without an API key, requests are rate-limited to 3/second. With one, you get 10/second.
|
|
@@ -74,8 +99,7 @@ Without an API key, requests are rate-limited to 3/second. With one, you get 10/
|
|
|
74
99
|
{
|
|
75
100
|
"mcpServers": {
|
|
76
101
|
"pubcrawl": {
|
|
77
|
-
"command": "
|
|
78
|
-
"args": ["/path/to/pubcrawl/dist/index.js"],
|
|
102
|
+
"command": "pubcrawl",
|
|
79
103
|
"env": {
|
|
80
104
|
"NCBI_API_KEY": "your_key_here"
|
|
81
105
|
}
|
|
@@ -97,6 +121,8 @@ Once connected, just ask naturally:
|
|
|
97
121
|
- "Pull the UK SmPC for atorvastatin"
|
|
98
122
|
- "Compare US and UK labelling for lisinopril"
|
|
99
123
|
- "What drugs are approved for type 2 diabetes?"
|
|
124
|
+
- "Find recruiting Phase 3 trials for pembrolizumab in breast cancer"
|
|
125
|
+
- "Get details on clinical trial NCT03086486"
|
|
100
126
|
|
|
101
127
|
## Development
|
|
102
128
|
|
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;
|
|
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"}
|
package/dist/lib/cache.d.ts
CHANGED
package/dist/lib/cache.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/lib/cache.ts"],"names":[],"mappings":"
|
|
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();
|
package/dist/lib/cache.js.map
CHANGED
|
@@ -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;
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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
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": "
|
|
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"
|