@pharmatools/pubcrawl 2.0.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.
Files changed (80) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +111 -0
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +45 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/lib/cache.d.ts +19 -0
  8. package/dist/lib/cache.d.ts.map +1 -0
  9. package/dist/lib/cache.js +52 -0
  10. package/dist/lib/cache.js.map +1 -0
  11. package/dist/lib/dailymed.d.ts +9 -0
  12. package/dist/lib/dailymed.d.ts.map +1 -0
  13. package/dist/lib/dailymed.js +58 -0
  14. package/dist/lib/dailymed.js.map +1 -0
  15. package/dist/lib/emc.d.ts +13 -0
  16. package/dist/lib/emc.d.ts.map +1 -0
  17. package/dist/lib/emc.js +215 -0
  18. package/dist/lib/emc.js.map +1 -0
  19. package/dist/lib/label-mapping.d.ts +8 -0
  20. package/dist/lib/label-mapping.d.ts.map +1 -0
  21. package/dist/lib/label-mapping.js +23 -0
  22. package/dist/lib/label-mapping.js.map +1 -0
  23. package/dist/lib/ncbi.d.ts +37 -0
  24. package/dist/lib/ncbi.d.ts.map +1 -0
  25. package/dist/lib/ncbi.js +175 -0
  26. package/dist/lib/ncbi.js.map +1 -0
  27. package/dist/lib/openfda.d.ts +8 -0
  28. package/dist/lib/openfda.d.ts.map +1 -0
  29. package/dist/lib/openfda.js +83 -0
  30. package/dist/lib/openfda.js.map +1 -0
  31. package/dist/lib/xml-parser.d.ts +23 -0
  32. package/dist/lib/xml-parser.d.ts.map +1 -0
  33. package/dist/lib/xml-parser.js +273 -0
  34. package/dist/lib/xml-parser.js.map +1 -0
  35. package/dist/tools/abstract.d.ts +3 -0
  36. package/dist/tools/abstract.d.ts.map +1 -0
  37. package/dist/tools/abstract.js +107 -0
  38. package/dist/tools/abstract.js.map +1 -0
  39. package/dist/tools/cite.d.ts +3 -0
  40. package/dist/tools/cite.d.ts.map +1 -0
  41. package/dist/tools/cite.js +188 -0
  42. package/dist/tools/cite.js.map +1 -0
  43. package/dist/tools/compare-labels.d.ts +3 -0
  44. package/dist/tools/compare-labels.d.ts.map +1 -0
  45. package/dist/tools/compare-labels.js +126 -0
  46. package/dist/tools/compare-labels.js.map +1 -0
  47. package/dist/tools/fulltext.d.ts +3 -0
  48. package/dist/tools/fulltext.d.ts.map +1 -0
  49. package/dist/tools/fulltext.js +88 -0
  50. package/dist/tools/fulltext.js.map +1 -0
  51. package/dist/tools/related.d.ts +3 -0
  52. package/dist/tools/related.d.ts.map +1 -0
  53. package/dist/tools/related.js +63 -0
  54. package/dist/tools/related.js.map +1 -0
  55. package/dist/tools/search-indication.d.ts +3 -0
  56. package/dist/tools/search-indication.d.ts.map +1 -0
  57. package/dist/tools/search-indication.js +73 -0
  58. package/dist/tools/search-indication.js.map +1 -0
  59. package/dist/tools/search.d.ts +3 -0
  60. package/dist/tools/search.d.ts.map +1 -0
  61. package/dist/tools/search.js +69 -0
  62. package/dist/tools/search.js.map +1 -0
  63. package/dist/tools/smpc.d.ts +3 -0
  64. package/dist/tools/smpc.d.ts.map +1 -0
  65. package/dist/tools/smpc.js +52 -0
  66. package/dist/tools/smpc.js.map +1 -0
  67. package/dist/tools/trending.d.ts +3 -0
  68. package/dist/tools/trending.d.ts.map +1 -0
  69. package/dist/tools/trending.js +106 -0
  70. package/dist/tools/trending.js.map +1 -0
  71. package/dist/tools/uspi.d.ts +3 -0
  72. package/dist/tools/uspi.d.ts.map +1 -0
  73. package/dist/tools/uspi.js +117 -0
  74. package/dist/tools/uspi.js.map +1 -0
  75. package/dist/types.d.ts +93 -0
  76. package/dist/types.d.ts.map +1 -0
  77. package/dist/types.js +2 -0
  78. package/dist/types.js.map +1 -0
  79. package/package.json +49 -0
  80. package/server.json +29 -0
@@ -0,0 +1,37 @@
1
+ export declare function setApiKey(key: string): void;
2
+ export declare function esearch(params: {
3
+ db?: string;
4
+ term: string;
5
+ retmax?: number;
6
+ sort?: string;
7
+ datetype?: string;
8
+ mindate?: string;
9
+ maxdate?: string;
10
+ }): Promise<{
11
+ idlist: string[];
12
+ count: number;
13
+ }>;
14
+ export declare function esummary(params: {
15
+ db?: string;
16
+ id: string[];
17
+ }): Promise<Record<string, unknown>>;
18
+ export declare function efetch(params: {
19
+ db?: string;
20
+ id: string;
21
+ rettype?: string;
22
+ retmode?: string;
23
+ }): Promise<string>;
24
+ export declare function elink(params: {
25
+ dbfrom?: string;
26
+ db?: string;
27
+ id: string;
28
+ cmd?: string;
29
+ linkname?: string;
30
+ }): Promise<{
31
+ links: Array<{
32
+ id: string;
33
+ score?: number;
34
+ }>;
35
+ }>;
36
+ export declare function pmidToPmcid(pmid: string): Promise<string | null>;
37
+ //# sourceMappingURL=ncbi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ncbi.d.ts","sourceRoot":"","sources":["../../src/lib/ncbi.ts"],"names":[],"mappings":"AAWA,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C;AAuCD,wBAAsB,OAAO,CAAC,MAAM,EAAE;IACpC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B/C;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE;IACrC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,EAAE,CAAC;CACd,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAoBnC;AAED,wBAAsB,MAAM,CAAC,MAAM,EAAE;IACnC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBlB;AAED,wBAAsB,KAAK,CAAC,MAAM,EAAE;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAsC5D;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkCtE"}
@@ -0,0 +1,175 @@
1
+ import { cache, TTL } from "./cache.js";
2
+ const BASE_URL = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils";
3
+ const TOOL = "pubcrawl";
4
+ const EMAIL = "nick@pharmatools.ai";
5
+ const REQUEST_DELAY_MS = 300;
6
+ const TIMEOUT_MS = 15000;
7
+ let apiKey;
8
+ let lastRequestTime = 0;
9
+ export function setApiKey(key) {
10
+ apiKey = key;
11
+ }
12
+ function buildParams(extra) {
13
+ const params = new URLSearchParams();
14
+ params.set("tool", TOOL);
15
+ params.set("email", EMAIL);
16
+ if (apiKey)
17
+ params.set("api_key", apiKey);
18
+ for (const [key, value] of Object.entries(extra)) {
19
+ if (value !== undefined)
20
+ params.set(key, value);
21
+ }
22
+ return params;
23
+ }
24
+ async function rateLimitedFetch(url) {
25
+ const minDelay = apiKey ? 100 : REQUEST_DELAY_MS;
26
+ const now = Date.now();
27
+ const elapsed = now - lastRequestTime;
28
+ if (elapsed < minDelay) {
29
+ await new Promise((resolve) => setTimeout(resolve, minDelay - elapsed));
30
+ }
31
+ lastRequestTime = Date.now();
32
+ const controller = new AbortController();
33
+ const timeout = setTimeout(() => controller.abort(), TIMEOUT_MS);
34
+ try {
35
+ const response = await fetch(url, { signal: controller.signal });
36
+ if (!response.ok) {
37
+ throw new Error(`NCBI API error: ${response.status} ${response.statusText}`);
38
+ }
39
+ return response;
40
+ }
41
+ finally {
42
+ clearTimeout(timeout);
43
+ }
44
+ }
45
+ export async function esearch(params) {
46
+ const cacheKey = `esearch:${JSON.stringify(params)}`;
47
+ const cached = cache.get(cacheKey);
48
+ if (cached)
49
+ return cached;
50
+ const urlParams = buildParams({
51
+ db: params.db ?? "pubmed",
52
+ term: params.term,
53
+ retmax: String(params.retmax ?? 10),
54
+ sort: params.sort,
55
+ datetype: params.datetype,
56
+ mindate: params.mindate,
57
+ maxdate: params.maxdate,
58
+ retmode: "json",
59
+ });
60
+ const url = `${BASE_URL}/esearch.fcgi?${urlParams}`;
61
+ const response = await rateLimitedFetch(url);
62
+ const data = await response.json();
63
+ const result = {
64
+ idlist: data.esearchresult?.idlist ?? [],
65
+ count: parseInt(data.esearchresult?.count ?? "0", 10),
66
+ };
67
+ cache.set(cacheKey, result, TTL.SEARCH);
68
+ return result;
69
+ }
70
+ export async function esummary(params) {
71
+ if (params.id.length === 0)
72
+ return {};
73
+ const cacheKey = `esummary:${params.db ?? "pubmed"}:${params.id.join(",")}`;
74
+ const cached = cache.get(cacheKey);
75
+ if (cached)
76
+ return cached;
77
+ const urlParams = buildParams({
78
+ db: params.db ?? "pubmed",
79
+ id: params.id.join(","),
80
+ retmode: "json",
81
+ });
82
+ const url = `${BASE_URL}/esummary.fcgi?${urlParams}`;
83
+ const response = await rateLimitedFetch(url);
84
+ const data = await response.json();
85
+ const result = data.result ?? {};
86
+ cache.set(cacheKey, result, TTL.SUMMARY);
87
+ return result;
88
+ }
89
+ export async function efetch(params) {
90
+ const cacheKey = `efetch:${params.db ?? "pubmed"}:${params.id}:${params.rettype ?? "xml"}`;
91
+ const cached = cache.get(cacheKey);
92
+ if (cached)
93
+ return cached;
94
+ const urlParams = buildParams({
95
+ db: params.db ?? "pubmed",
96
+ id: params.id,
97
+ rettype: params.rettype ?? "xml",
98
+ retmode: params.retmode ?? "xml",
99
+ });
100
+ const url = `${BASE_URL}/efetch.fcgi?${urlParams}`;
101
+ const response = await rateLimitedFetch(url);
102
+ const text = await response.text();
103
+ const ttl = params.db === "pmc" ? TTL.FULLTEXT : TTL.ABSTRACT;
104
+ cache.set(cacheKey, text, ttl);
105
+ return text;
106
+ }
107
+ export async function elink(params) {
108
+ const cacheKey = `elink:${JSON.stringify(params)}`;
109
+ const cached = cache.get(cacheKey);
110
+ if (cached)
111
+ return cached;
112
+ const urlParams = buildParams({
113
+ dbfrom: params.dbfrom ?? "pubmed",
114
+ db: params.db ?? "pubmed",
115
+ id: params.id,
116
+ cmd: params.cmd,
117
+ linkname: params.linkname,
118
+ retmode: "json",
119
+ });
120
+ const url = `${BASE_URL}/elink.fcgi?${urlParams}`;
121
+ const response = await rateLimitedFetch(url);
122
+ const data = await response.json();
123
+ const linkSets = data.linksets ?? [];
124
+ const links = [];
125
+ for (const linkSet of linkSets) {
126
+ const linkSetDbs = linkSet.linksetdbs ?? [];
127
+ for (const lsdb of linkSetDbs) {
128
+ const dbLinks = lsdb.links ?? [];
129
+ for (const link of dbLinks) {
130
+ if (typeof link === "object" && link !== null) {
131
+ links.push({ id: String(link.id), score: link.score ? Number(link.score) : undefined });
132
+ }
133
+ else {
134
+ links.push({ id: String(link) });
135
+ }
136
+ }
137
+ }
138
+ }
139
+ const result = { links };
140
+ cache.set(cacheKey, result, TTL.RELATED);
141
+ return result;
142
+ }
143
+ export async function pmidToPmcid(pmid) {
144
+ const cacheKey = `pmid2pmc:${pmid}`;
145
+ const cached = cache.get(cacheKey);
146
+ if (cached !== undefined)
147
+ return cached;
148
+ const urlParams = buildParams({
149
+ dbfrom: "pubmed",
150
+ db: "pmc",
151
+ id: pmid,
152
+ linkname: "pubmed_pmc",
153
+ retmode: "json",
154
+ });
155
+ const url = `${BASE_URL}/elink.fcgi?${urlParams}`;
156
+ const response = await rateLimitedFetch(url);
157
+ const data = await response.json();
158
+ const linkSets = data.linksets ?? [];
159
+ let pmcid = null;
160
+ for (const linkSet of linkSets) {
161
+ const linkSetDbs = linkSet.linksetdbs ?? [];
162
+ for (const lsdb of linkSetDbs) {
163
+ if (lsdb.linkname === "pubmed_pmc" && lsdb.links?.length > 0) {
164
+ const rawId = lsdb.links[0];
165
+ pmcid = `PMC${typeof rawId === "object" ? rawId.id : rawId}`;
166
+ break;
167
+ }
168
+ }
169
+ if (pmcid)
170
+ break;
171
+ }
172
+ cache.set(cacheKey, pmcid, TTL.ABSTRACT);
173
+ return pmcid;
174
+ }
175
+ //# sourceMappingURL=ncbi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ncbi.js","sourceRoot":"","sources":["../../src/lib/ncbi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface OpenFdaDrug {
2
+ generic_name: string;
3
+ brand_name: string;
4
+ manufacturer: string;
5
+ set_id: string;
6
+ }
7
+ export declare function searchByIndication(condition: string, limit?: number): Promise<OpenFdaDrug[]>;
8
+ //# sourceMappingURL=openfda.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openfda.d.ts","sourceRoot":"","sources":["../../src/lib/openfda.ts"],"names":[],"mappings":"AAgCA,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAmBD,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,KAAK,SAAK,GACT,OAAO,CAAC,WAAW,EAAE,CAAC,CAyDxB"}
@@ -0,0 +1,83 @@
1
+ import { cache, TTL } from "./cache.js";
2
+ const BASE_URL = "https://api.fda.gov/drug/label.json";
3
+ const REQUEST_DELAY_MS = 300;
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(`OpenFDA API error: ${response.status} ${response.statusText}`);
19
+ }
20
+ return response;
21
+ }
22
+ finally {
23
+ clearTimeout(timeout);
24
+ }
25
+ }
26
+ // OpenFDA max per request (unauthenticated)
27
+ const MAX_PER_PAGE = 99;
28
+ const MAX_PAGES = 3;
29
+ export async function searchByIndication(condition, limit = 20) {
30
+ const cacheKey = `openfda:indication:${condition.toLowerCase()}:${limit}`;
31
+ const cached = cache.get(cacheKey);
32
+ if (cached)
33
+ return cached;
34
+ // Use AND of individual terms so "rheumatoid arthritis" matches labels
35
+ // that say "moderately to severely active rheumatoid arthritis" etc.
36
+ const terms = condition.trim().split(/\s+/);
37
+ const query = terms
38
+ .map((t) => `indications_and_usage:${encodeURIComponent(t)}`)
39
+ .join("+AND+");
40
+ const seen = new Map();
41
+ // Always fetch all pages to maximise drug diversity, then trim.
42
+ // Page 1 is mostly NSAIDs; biologics appear on later pages.
43
+ for (let page = 0; page < MAX_PAGES; page++) {
44
+ const skip = page * MAX_PER_PAGE;
45
+ const url = `${BASE_URL}?search=${query}&limit=${MAX_PER_PAGE}&skip=${skip}`;
46
+ let data;
47
+ try {
48
+ const response = await rateLimitedFetch(url);
49
+ data = await response.json();
50
+ }
51
+ catch {
52
+ break;
53
+ }
54
+ if (!data.results || data.results.length === 0)
55
+ break;
56
+ for (const result of data.results) {
57
+ const openfda = result.openfda;
58
+ if (!openfda)
59
+ continue;
60
+ const genericName = openfda.generic_name?.[0] ?? "";
61
+ if (!genericName)
62
+ continue;
63
+ // Skip multi-ingredient kits/combos (e.g. "methylprednisolone acetate,
64
+ // lidocaine hydrochloride, bupivacaine hydrochloride") — these fill
65
+ // slots that should go to distinct therapeutic agents
66
+ if (genericName.includes(","))
67
+ continue;
68
+ const key = genericName.toLowerCase();
69
+ if (seen.has(key))
70
+ continue;
71
+ seen.set(key, {
72
+ generic_name: genericName,
73
+ brand_name: openfda.brand_name?.[0] ?? "",
74
+ manufacturer: openfda.manufacturer_name?.[0] ?? "",
75
+ set_id: openfda.spl_set_id?.[0] ?? "",
76
+ });
77
+ }
78
+ }
79
+ const drugs = [...seen.values()].slice(0, limit);
80
+ cache.set(cacheKey, drugs, TTL.SEARCH);
81
+ return drugs;
82
+ }
83
+ //# sourceMappingURL=openfda.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openfda.js","sourceRoot":"","sources":["../../src/lib/openfda.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,QAAQ,GAAG,qCAAqC,CAAC;AACvD,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,UAAU,GAAG,KAAK,CAAC;AAEzB,IAAI,eAAe,GAAG,CAAC,CAAC;AAExB,KAAK,UAAU,gBAAgB,CAAC,GAAW;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,GAAG,GAAG,eAAe,CAAC;IAEtC,IAAI,OAAO,GAAG,gBAAgB,EAAE,CAAC;QAC/B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,UAAU,CAAC,CAAC;IAEjE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAsBD,4CAA4C;AAC5C,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,SAAS,GAAG,CAAC,CAAC;AAEpB,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAAiB,EACjB,KAAK,GAAG,EAAE;IAEV,MAAM,QAAQ,GAAG,sBAAsB,SAAS,CAAC,WAAW,EAAE,IAAI,KAAK,EAAE,CAAC;IAC1E,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAgB,QAAQ,CAAC,CAAC;IAClD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,uEAAuE;IACvE,qEAAqE;IACrE,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,KAAK;SAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,yBAAyB,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5D,IAAI,CAAC,OAAO,CAAC,CAAC;IAEjB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE5C,gEAAgE;IAChE,4DAA4D;IAC5D,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,GAAG,YAAY,CAAC;QACjC,MAAM,GAAG,GAAG,GAAG,QAAQ,WAAW,KAAK,UAAU,YAAY,SAAS,IAAI,EAAE,CAAC;QAE7E,IAAI,IAAqB,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAC7C,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM;QACR,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM;QAEtD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YAC/B,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACpD,IAAI,CAAC,WAAW;gBAAE,SAAS;YAE3B,uEAAuE;YACvE,oEAAoE;YACpE,sDAAsD;YACtD,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,SAAS;YAExC,MAAM,GAAG,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAE5B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE;gBACZ,YAAY,EAAE,WAAW;gBACzB,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE;gBACzC,YAAY,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE;gBAClD,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE;aACtC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACjD,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,23 @@
1
+ export declare function parseXml(xml: string): any;
2
+ export declare function extractText(node: unknown): string;
3
+ export declare function parseAuthors(authorList: unknown): string[];
4
+ export declare function parseSummaryAuthors(authors: unknown): string[];
5
+ export declare function parseAbstractSections(abstractNode: unknown): Array<{
6
+ label: string;
7
+ text: string;
8
+ }>;
9
+ export declare function parseMeshTerms(meshList: unknown): string[];
10
+ export declare function parseKeywords(keywordList: unknown): string[];
11
+ export declare function parseJatsSections(body: unknown): Array<{
12
+ title: string;
13
+ content: string;
14
+ }>;
15
+ export declare function parseFigureCaptions(body: unknown): string[];
16
+ export declare function parseTableCaptions(body: unknown): string[];
17
+ export declare function countReferences(back: unknown): number;
18
+ export declare function parseSplSections(structuredBody: unknown, requestedCodes?: string[]): Array<{
19
+ code: string;
20
+ title: string;
21
+ content: string;
22
+ }>;
23
+ //# sourceMappingURL=xml-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml-parser.d.ts","sourceRoot":"","sources":["../../src/lib/xml-parser.ts"],"names":[],"mappings":"AAwCA,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAEzC;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAwBjD;AAOD,wBAAgB,YAAY,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,EAAE,CAiB1D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAQ9D;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,OAAO,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAoBnG;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,EAAE,CAU1D;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,OAAO,GAAG,MAAM,EAAE,CAK5D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAY1F;AA4BD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE,CAS3D;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE,CAS1D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAIrD;AAED,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,OAAO,EACvB,cAAc,CAAC,EAAE,MAAM,EAAE,GACxB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBzD"}
@@ -0,0 +1,273 @@
1
+ import { XMLParser } from "fast-xml-parser";
2
+ const parser = new XMLParser({
3
+ ignoreAttributes: false,
4
+ attributeNamePrefix: "@_",
5
+ textNodeName: "#text",
6
+ isArray: (name) => {
7
+ const arrayTags = [
8
+ "PubmedArticle",
9
+ "Author",
10
+ "AbstractText",
11
+ "MeshHeading",
12
+ "Keyword",
13
+ "sec",
14
+ "fig",
15
+ "table-wrap",
16
+ "ref",
17
+ "IdList",
18
+ "Link",
19
+ "LinkSet",
20
+ // SPL (DailyMed) tags
21
+ "component",
22
+ "section",
23
+ "paragraph",
24
+ "table",
25
+ "list",
26
+ "item",
27
+ "tbody",
28
+ "tr",
29
+ "td",
30
+ "thead",
31
+ "content",
32
+ "linkHtml",
33
+ ];
34
+ return arrayTags.includes(name);
35
+ },
36
+ trimValues: true,
37
+ });
38
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
39
+ export function parseXml(xml) {
40
+ return parser.parse(xml);
41
+ }
42
+ export function extractText(node) {
43
+ if (typeof node === "string")
44
+ return node;
45
+ if (typeof node === "number")
46
+ return String(node);
47
+ if (node === null || node === undefined)
48
+ return "";
49
+ if (typeof node === "object") {
50
+ const obj = node;
51
+ if ("#text" in obj)
52
+ return String(obj["#text"]);
53
+ // Concatenate text from child elements
54
+ const parts = [];
55
+ for (const [key, value] of Object.entries(obj)) {
56
+ if (!key.startsWith("@_")) {
57
+ if (Array.isArray(value)) {
58
+ parts.push(value.map(extractText).join(" "));
59
+ }
60
+ else {
61
+ parts.push(extractText(value));
62
+ }
63
+ }
64
+ }
65
+ return parts.join(" ").trim();
66
+ }
67
+ return String(node);
68
+ }
69
+ function ensureArray(val) {
70
+ if (val === undefined || val === null)
71
+ return [];
72
+ return Array.isArray(val) ? val : [val];
73
+ }
74
+ export function parseAuthors(authorList) {
75
+ if (!authorList)
76
+ return [];
77
+ const list = authorList?.Author;
78
+ const authors = ensureArray(list);
79
+ return authors.map((a) => {
80
+ const author = a;
81
+ const last = author.LastName ? String(author.LastName) : "";
82
+ const first = author.ForeName ? String(author.ForeName) : "";
83
+ const initials = author.Initials ? String(author.Initials) : "";
84
+ if (last && first)
85
+ return `${last} ${first}`;
86
+ if (last && initials)
87
+ return `${last} ${initials}`;
88
+ // CollectiveName for group authors
89
+ if (author.CollectiveName)
90
+ return String(author.CollectiveName);
91
+ return last || first || "";
92
+ }).filter(Boolean);
93
+ }
94
+ export function parseSummaryAuthors(authors) {
95
+ if (!authors)
96
+ return [];
97
+ const list = ensureArray(authors);
98
+ return list.map((a) => {
99
+ if (typeof a === "string")
100
+ return a;
101
+ const author = a;
102
+ return author.name ? String(author.name) : extractText(a);
103
+ }).filter(Boolean);
104
+ }
105
+ export function parseAbstractSections(abstractNode) {
106
+ if (!abstractNode)
107
+ return [];
108
+ const obj = abstractNode;
109
+ const textNodes = obj.AbstractText;
110
+ if (!textNodes)
111
+ return [];
112
+ const sections = ensureArray(textNodes);
113
+ return sections.map((section) => {
114
+ if (typeof section === "string") {
115
+ return { label: "", text: section };
116
+ }
117
+ const s = section;
118
+ const label = s["@_Label"] ? String(s["@_Label"]) : "";
119
+ const text = extractText(section);
120
+ return { label, text };
121
+ });
122
+ }
123
+ export function parseMeshTerms(meshList) {
124
+ if (!meshList)
125
+ return [];
126
+ const headings = ensureArray(meshList?.MeshHeading);
127
+ return headings.map((h) => {
128
+ const heading = h;
129
+ const descriptor = heading.DescriptorName;
130
+ return extractText(descriptor);
131
+ }).filter(Boolean);
132
+ }
133
+ export function parseKeywords(keywordList) {
134
+ if (!keywordList)
135
+ return [];
136
+ const keywords = ensureArray(keywordList?.Keyword);
137
+ return keywords.map(extractText).filter(Boolean);
138
+ }
139
+ export function parseJatsSections(body) {
140
+ if (!body)
141
+ return [];
142
+ const obj = body;
143
+ const sections = ensureArray(obj.sec);
144
+ return sections.map((sec) => {
145
+ const s = sec;
146
+ const title = s.title ? extractText(s.title) : "";
147
+ const content = extractJatsContent(s);
148
+ return { title, content };
149
+ });
150
+ }
151
+ function extractJatsContent(node) {
152
+ if (!node || typeof node !== "object")
153
+ return extractText(node);
154
+ const obj = node;
155
+ const parts = [];
156
+ for (const [key, value] of Object.entries(obj)) {
157
+ if (key === "title" || key.startsWith("@_"))
158
+ continue;
159
+ if (key === "p") {
160
+ const paragraphs = ensureArray(value);
161
+ parts.push(...paragraphs.map(extractText));
162
+ }
163
+ else if (key === "sec") {
164
+ // Nested sections
165
+ const subsections = ensureArray(value);
166
+ for (const sub of subsections) {
167
+ const subObj = sub;
168
+ if (subObj.title)
169
+ parts.push(`\n### ${extractText(subObj.title)}`);
170
+ parts.push(extractJatsContent(sub));
171
+ }
172
+ }
173
+ }
174
+ return parts.join("\n\n");
175
+ }
176
+ export function parseFigureCaptions(body) {
177
+ if (!body)
178
+ return [];
179
+ const figures = findAllElements(body, "fig");
180
+ return figures.map((fig) => {
181
+ const f = fig;
182
+ const label = f.label ? extractText(f.label) : "";
183
+ const caption = f.caption ? extractText(f.caption) : "";
184
+ return label ? `${label}: ${caption}` : caption;
185
+ }).filter(Boolean);
186
+ }
187
+ export function parseTableCaptions(body) {
188
+ if (!body)
189
+ return [];
190
+ const tables = findAllElements(body, "table-wrap");
191
+ return tables.map((tw) => {
192
+ const t = tw;
193
+ const label = t.label ? extractText(t.label) : "";
194
+ const caption = t.caption ? extractText(t.caption) : "";
195
+ return label ? `${label}: ${caption}` : caption;
196
+ }).filter(Boolean);
197
+ }
198
+ export function countReferences(back) {
199
+ if (!back)
200
+ return 0;
201
+ const refs = findAllElements(back, "ref");
202
+ return refs.length;
203
+ }
204
+ export function parseSplSections(structuredBody, requestedCodes) {
205
+ if (!structuredBody)
206
+ return [];
207
+ const obj = structuredBody;
208
+ const components = ensureArray(obj.component);
209
+ const results = [];
210
+ for (const comp of components) {
211
+ const c = comp;
212
+ const sections = ensureArray(c.section);
213
+ for (const sec of sections) {
214
+ extractSplSection(sec, results, requestedCodes);
215
+ }
216
+ }
217
+ return results;
218
+ }
219
+ function extractSplSection(section, results, requestedCodes) {
220
+ if (!section || typeof section !== "object")
221
+ return;
222
+ const s = section;
223
+ // Extract LOINC code from <code @_code>
224
+ const codeNode = s.code;
225
+ const code = codeNode?.["@_code"] ? String(codeNode["@_code"]) : "";
226
+ const title = s.title ? extractText(s.title) : "";
227
+ // Extract text content from <text> > <paragraph> elements
228
+ const textNode = s.text;
229
+ let content = "";
230
+ if (textNode) {
231
+ const paragraphs = ensureArray(textNode.paragraph);
232
+ content = paragraphs.map(extractText).filter(Boolean).join("\n\n");
233
+ if (!content) {
234
+ content = extractText(textNode);
235
+ }
236
+ }
237
+ if (code && (!requestedCodes || requestedCodes.includes(code))) {
238
+ results.push({ code, title, content });
239
+ }
240
+ // Recurse into nested components > sections
241
+ const nestedComponents = ensureArray(s.component);
242
+ for (const nc of nestedComponents) {
243
+ const ncObj = nc;
244
+ const nestedSections = ensureArray(ncObj.section);
245
+ for (const ns of nestedSections) {
246
+ extractSplSection(ns, results, requestedCodes);
247
+ }
248
+ }
249
+ }
250
+ function findAllElements(node, tagName) {
251
+ const results = [];
252
+ if (!node || typeof node !== "object")
253
+ return results;
254
+ const obj = node;
255
+ for (const [key, value] of Object.entries(obj)) {
256
+ if (key === tagName) {
257
+ const items = ensureArray(value);
258
+ results.push(...items);
259
+ }
260
+ else if (typeof value === "object" && value !== null) {
261
+ if (Array.isArray(value)) {
262
+ for (const item of value) {
263
+ results.push(...findAllElements(item, tagName));
264
+ }
265
+ }
266
+ else {
267
+ results.push(...findAllElements(value, tagName));
268
+ }
269
+ }
270
+ }
271
+ return results;
272
+ }
273
+ //# sourceMappingURL=xml-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml-parser.js","sourceRoot":"","sources":["../../src/lib/xml-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerAbstractTool(server: McpServer): void;
3
+ //# sourceMappingURL=abstract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstract.d.ts","sourceRoot":"","sources":["../../src/tools/abstract.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiBpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkH5D"}