@cyanheads/pubchem-mcp-server 0.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.
Files changed (51) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +198 -0
  3. package/dist/index.d.ts +8 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +16 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/mcp-server/tools/definitions/get-bioactivity.tool.d.ts +33 -0
  8. package/dist/mcp-server/tools/definitions/get-bioactivity.tool.d.ts.map +1 -0
  9. package/dist/mcp-server/tools/definitions/get-bioactivity.tool.js +115 -0
  10. package/dist/mcp-server/tools/definitions/get-bioactivity.tool.js.map +1 -0
  11. package/dist/mcp-server/tools/definitions/get-compound-details.tool.d.ts +22 -0
  12. package/dist/mcp-server/tools/definitions/get-compound-details.tool.d.ts.map +1 -0
  13. package/dist/mcp-server/tools/definitions/get-compound-details.tool.js +190 -0
  14. package/dist/mcp-server/tools/definitions/get-compound-details.tool.js.map +1 -0
  15. package/dist/mcp-server/tools/definitions/get-compound-image.tool.d.ts +19 -0
  16. package/dist/mcp-server/tools/definitions/get-compound-image.tool.d.ts.map +1 -0
  17. package/dist/mcp-server/tools/definitions/get-compound-image.tool.js +57 -0
  18. package/dist/mcp-server/tools/definitions/get-compound-image.tool.js.map +1 -0
  19. package/dist/mcp-server/tools/definitions/get-compound-safety.tool.d.ts +25 -0
  20. package/dist/mcp-server/tools/definitions/get-compound-safety.tool.d.ts.map +1 -0
  21. package/dist/mcp-server/tools/definitions/get-compound-safety.tool.js +94 -0
  22. package/dist/mcp-server/tools/definitions/get-compound-safety.tool.js.map +1 -0
  23. package/dist/mcp-server/tools/definitions/get-compound-xrefs.tool.d.ts +21 -0
  24. package/dist/mcp-server/tools/definitions/get-compound-xrefs.tool.d.ts.map +1 -0
  25. package/dist/mcp-server/tools/definitions/get-compound-xrefs.tool.js +90 -0
  26. package/dist/mcp-server/tools/definitions/get-compound-xrefs.tool.js.map +1 -0
  27. package/dist/mcp-server/tools/definitions/get-summary.tool.d.ts +23 -0
  28. package/dist/mcp-server/tools/definitions/get-summary.tool.d.ts.map +1 -0
  29. package/dist/mcp-server/tools/definitions/get-summary.tool.js +143 -0
  30. package/dist/mcp-server/tools/definitions/get-summary.tool.js.map +1 -0
  31. package/dist/mcp-server/tools/definitions/index.d.ts +152 -0
  32. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
  33. package/dist/mcp-server/tools/definitions/index.js +23 -0
  34. package/dist/mcp-server/tools/definitions/index.js.map +1 -0
  35. package/dist/mcp-server/tools/definitions/search-assays.tool.d.ts +22 -0
  36. package/dist/mcp-server/tools/definitions/search-assays.tool.d.ts.map +1 -0
  37. package/dist/mcp-server/tools/definitions/search-assays.tool.js +76 -0
  38. package/dist/mcp-server/tools/definitions/search-assays.tool.js.map +1 -0
  39. package/dist/mcp-server/tools/definitions/search-compounds.tool.d.ts +42 -0
  40. package/dist/mcp-server/tools/definitions/search-compounds.tool.d.ts.map +1 -0
  41. package/dist/mcp-server/tools/definitions/search-compounds.tool.js +204 -0
  42. package/dist/mcp-server/tools/definitions/search-compounds.tool.js.map +1 -0
  43. package/dist/services/pubchem/pubchem-client.d.ts +37 -0
  44. package/dist/services/pubchem/pubchem-client.d.ts.map +1 -0
  45. package/dist/services/pubchem/pubchem-client.js +546 -0
  46. package/dist/services/pubchem/pubchem-client.js.map +1 -0
  47. package/dist/services/pubchem/types.d.ts +133 -0
  48. package/dist/services/pubchem/types.d.ts.map +1 -0
  49. package/dist/services/pubchem/types.js +68 -0
  50. package/dist/services/pubchem/types.js.map +1 -0
  51. package/package.json +67 -0
@@ -0,0 +1,546 @@
1
+ /**
2
+ * @fileoverview PubChem API client with rate limiting, retry, and response parsing.
3
+ * Wraps both PUG REST and PUG View APIs behind a shared rate limiter.
4
+ * @module services/pubchem/pubchem-client
5
+ */
6
+ import { PubChemNotFoundError } from './types.js';
7
+ // ── Rate Limiter ─────────────────────────────────────────────────────
8
+ /** Sliding-window rate limiter. Queues requests exceeding maxPerSecond. */
9
+ class RateLimiter {
10
+ timestamps = [];
11
+ max;
12
+ queue = [];
13
+ draining = false;
14
+ constructor(maxPerSecond) {
15
+ this.max = maxPerSecond;
16
+ }
17
+ acquire() {
18
+ return new Promise((resolve) => {
19
+ this.queue.push(resolve);
20
+ if (!this.draining)
21
+ void this.drain();
22
+ });
23
+ }
24
+ async drain() {
25
+ this.draining = true;
26
+ while (this.queue.length > 0) {
27
+ const now = Date.now();
28
+ const cutoff = now - 1000;
29
+ while (this.timestamps[0] != null && this.timestamps[0] <= cutoff) {
30
+ this.timestamps.shift();
31
+ }
32
+ if (this.timestamps.length < this.max) {
33
+ this.timestamps.push(Date.now());
34
+ this.queue.shift()?.();
35
+ }
36
+ else {
37
+ const oldest = this.timestamps[0] ?? Date.now();
38
+ const wait = oldest + 1000 - Date.now();
39
+ await new Promise((r) => setTimeout(r, Math.max(10, wait)));
40
+ }
41
+ }
42
+ this.draining = false;
43
+ }
44
+ }
45
+ // ── Helpers ──────────────────────────────────────────────────────────
46
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
47
+ /** PubChem returns different field names than the request parameter names for some properties */
48
+ const PROPERTY_NAME_MAP = {
49
+ SMILES: 'CanonicalSMILES',
50
+ ConnectivitySMILES: 'IsomericSMILES',
51
+ };
52
+ function normalizePropertyNames(row) {
53
+ const result = {};
54
+ for (const [key, value] of Object.entries(row)) {
55
+ result[PROPERTY_NAME_MAP[key] ?? key] = value;
56
+ }
57
+ return result;
58
+ }
59
+ function parseFaultMessage(text) {
60
+ try {
61
+ const data = JSON.parse(text);
62
+ if (data.Fault?.Message) {
63
+ return `${data.Fault.Code ?? 'Error'}: ${data.Fault.Message}`;
64
+ }
65
+ }
66
+ catch {
67
+ /* not JSON */
68
+ }
69
+ return;
70
+ }
71
+ // ── PUG View Parsing ─────────────────────────────────────────────────
72
+ /** Recursively search PUG View sections for a heading */
73
+ function findSection(sections, heading) {
74
+ for (const section of sections) {
75
+ if (section.TOCHeading === heading)
76
+ return section;
77
+ if (section.Section) {
78
+ const found = findSection(section.Section, heading);
79
+ if (found)
80
+ return found;
81
+ }
82
+ }
83
+ return;
84
+ }
85
+ /** Extract all text strings from a PUG View section and its children */
86
+ function extractStrings(section) {
87
+ const strings = [];
88
+ if (section.Information) {
89
+ for (const info of section.Information) {
90
+ if (info.Value.StringWithMarkup) {
91
+ for (const swm of info.Value.StringWithMarkup) {
92
+ if (swm.String)
93
+ strings.push(swm.String);
94
+ }
95
+ }
96
+ }
97
+ }
98
+ if (section.Section) {
99
+ for (const sub of section.Section) {
100
+ strings.push(...extractStrings(sub));
101
+ }
102
+ }
103
+ return strings;
104
+ }
105
+ /** Extract GHS info items from a PUG View section */
106
+ function extractGHSInfo(section) {
107
+ const infos = [];
108
+ if (section.Information)
109
+ infos.push(...section.Information);
110
+ if (section.Section) {
111
+ for (const sub of section.Section) {
112
+ infos.push(...extractGHSInfo(sub));
113
+ }
114
+ }
115
+ return infos;
116
+ }
117
+ /** Parse "H225: Highly flammable..." into { code, statement } */
118
+ function parseCodedStatement(text) {
119
+ const match = text.match(/^([HP]\d{3}(?:\+[HP]\d{3})*)\s*[:\-–]\s*(.+)/);
120
+ if (match?.[1] && match[2])
121
+ return { code: match[1], statement: match[2].trim() };
122
+ const codeOnly = text.match(/^([HP]\d{3}(?:\+[HP]\d{3})*)$/);
123
+ if (codeOnly?.[1])
124
+ return { code: codeOnly[1], statement: '' };
125
+ return;
126
+ }
127
+ /** Map PubChem pictogram markup strings to human labels */
128
+ const PICTOGRAM_LABELS = {
129
+ GHS01: 'Explosive',
130
+ GHS02: 'Flammable',
131
+ GHS03: 'Oxidizer',
132
+ GHS04: 'Compressed Gas',
133
+ GHS05: 'Corrosive',
134
+ GHS06: 'Toxic',
135
+ GHS07: 'Irritant',
136
+ GHS08: 'Health Hazard',
137
+ GHS09: 'Environmental Hazard',
138
+ };
139
+ function parsePictogram(text) {
140
+ for (const [code, label] of Object.entries(PICTOGRAM_LABELS)) {
141
+ if (text.includes(code))
142
+ return label;
143
+ }
144
+ return text.replace(/.*\//, '').replace(/\..*/, '');
145
+ }
146
+ // ── Client ───────────────────────────────────────────────────────────
147
+ export class PubChemClient {
148
+ pugBase = 'https://pubchem.ncbi.nlm.nih.gov/rest/pug';
149
+ viewBase = 'https://pubchem.ncbi.nlm.nih.gov/rest/pug_view';
150
+ rateLimiter = new RateLimiter(5);
151
+ // ── Core HTTP ────────────────────────────────────────────────────
152
+ async fetchJson(url, init) {
153
+ for (let attempt = 0;; attempt++) {
154
+ await this.rateLimiter.acquire();
155
+ const controller = new AbortController();
156
+ const timeoutId = setTimeout(() => controller.abort(), 30_000);
157
+ try {
158
+ const response = await fetch(url, { ...init, signal: controller.signal });
159
+ if (response.ok) {
160
+ return (await response.json());
161
+ }
162
+ const text = await response.text();
163
+ const message = parseFaultMessage(text) ?? text.slice(0, 300);
164
+ if (response.status === 404) {
165
+ throw new PubChemNotFoundError(message);
166
+ }
167
+ // Retry once on 5xx
168
+ if (response.status >= 500 && attempt < 1) {
169
+ await sleep(1000 * 2 ** attempt);
170
+ continue;
171
+ }
172
+ throw new Error(`PubChem HTTP ${response.status}: ${message}`);
173
+ }
174
+ catch (error) {
175
+ if (error instanceof PubChemNotFoundError)
176
+ throw error;
177
+ if (error instanceof Error && error.message.startsWith('PubChem HTTP 4'))
178
+ throw error;
179
+ // Retry once on network errors
180
+ if (attempt < 1) {
181
+ await sleep(1000 * 2 ** attempt);
182
+ continue;
183
+ }
184
+ if (error instanceof Error && error.name === 'AbortError') {
185
+ throw new Error('PubChem request timed out (30s)');
186
+ }
187
+ throw error;
188
+ }
189
+ finally {
190
+ clearTimeout(timeoutId);
191
+ }
192
+ }
193
+ }
194
+ async fetchBinary(url) {
195
+ await this.rateLimiter.acquire();
196
+ const controller = new AbortController();
197
+ const timeoutId = setTimeout(() => controller.abort(), 30_000);
198
+ try {
199
+ const response = await fetch(url, { signal: controller.signal });
200
+ if (!response.ok) {
201
+ const text = await response.text();
202
+ const message = parseFaultMessage(text) ?? text.slice(0, 300);
203
+ if (response.status === 404)
204
+ throw new PubChemNotFoundError(message);
205
+ throw new Error(`PubChem HTTP ${response.status}: ${message}`);
206
+ }
207
+ return await response.arrayBuffer();
208
+ }
209
+ finally {
210
+ clearTimeout(timeoutId);
211
+ }
212
+ }
213
+ // ── CID Resolution ──────────────────────────────────────────────
214
+ /** Fetch CID list, with automatic ListKey polling for async searches */
215
+ async fetchCids(url, init) {
216
+ try {
217
+ const data = await this.fetchJson(url, init);
218
+ if ('Waiting' in data)
219
+ return this.pollListKey(data.Waiting.ListKey);
220
+ return data.IdentifierList.CID;
221
+ }
222
+ catch (error) {
223
+ if (error instanceof PubChemNotFoundError)
224
+ return [];
225
+ throw error;
226
+ }
227
+ }
228
+ /** Poll a PubChem ListKey until results are ready */
229
+ async pollListKey(listKey, maxAttempts = 20) {
230
+ const pollUrl = `${this.pugBase}/compound/listkey/${listKey}/cids/JSON`;
231
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
232
+ await sleep(1500);
233
+ try {
234
+ const data = await this.fetchJson(pollUrl);
235
+ if ('Waiting' in data)
236
+ continue;
237
+ return data.IdentifierList.CID;
238
+ }
239
+ catch (error) {
240
+ if (error instanceof PubChemNotFoundError)
241
+ return [];
242
+ throw error;
243
+ }
244
+ }
245
+ throw new Error('PubChem async search timed out after polling');
246
+ }
247
+ searchByName(name) {
248
+ return this.fetchCids(`${this.pugBase}/compound/name/${encodeURIComponent(name)}/cids/JSON`);
249
+ }
250
+ searchBySmiles(smiles) {
251
+ return this.fetchCids(`${this.pugBase}/compound/smiles/cids/JSON`, {
252
+ method: 'POST',
253
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
254
+ body: new URLSearchParams({ smiles }).toString(),
255
+ });
256
+ }
257
+ searchByInchiKey(inchikey) {
258
+ return this.fetchCids(`${this.pugBase}/compound/inchikey/${encodeURIComponent(inchikey)}/cids/JSON`);
259
+ }
260
+ searchByFormula(formula, allowOther = false) {
261
+ const params = allowOther ? '?AllowOtherElements=true' : '';
262
+ return this.fetchCids(`${this.pugBase}/compound/fastformula/${encodeURIComponent(formula)}/cids/JSON${params}`);
263
+ }
264
+ searchByStructure(mode, query, queryType, threshold) {
265
+ const endpoint = mode === 'similarity'
266
+ ? 'fastsimilarity_2d'
267
+ : mode === 'substructure'
268
+ ? 'fastsubstructure'
269
+ : 'fastsuperstructure';
270
+ const thresholdParam = mode === 'similarity' ? `?Threshold=${threshold ?? 90}` : '';
271
+ if (queryType === 'cid') {
272
+ return this.fetchCids(`${this.pugBase}/compound/${endpoint}/cid/${query}/cids/JSON${thresholdParam}`);
273
+ }
274
+ // POST for SMILES to avoid encoding issues
275
+ const url = `${this.pugBase}/compound/${endpoint}/smiles/cids/JSON${thresholdParam}`;
276
+ return this.fetchCids(url, {
277
+ method: 'POST',
278
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
279
+ body: new URLSearchParams({ smiles: query }).toString(),
280
+ });
281
+ }
282
+ // ── Compound Data ───────────────────────────────────────────────
283
+ async getProperties(cids, properties) {
284
+ if (cids.length === 0 || properties.length === 0)
285
+ return [];
286
+ const propsPath = properties.join(',');
287
+ const cidStr = cids.join(',');
288
+ let rows;
289
+ // POST for large CID lists, GET for small ones
290
+ if (cids.length > 50) {
291
+ const data = await this.fetchJson(`${this.pugBase}/compound/cid/property/${propsPath}/JSON`, {
292
+ method: 'POST',
293
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
294
+ body: new URLSearchParams({ cid: cidStr }).toString(),
295
+ });
296
+ rows = data.PropertyTable.Properties;
297
+ }
298
+ else {
299
+ const data = await this.fetchJson(`${this.pugBase}/compound/cid/${cidStr}/property/${propsPath}/JSON`);
300
+ rows = data.PropertyTable.Properties;
301
+ }
302
+ // PubChem returns different field names than the request names for some properties.
303
+ // Normalize so consumers see the names they requested.
304
+ return rows.map((row) => normalizePropertyNames(row));
305
+ }
306
+ async getSynonyms(cid) {
307
+ try {
308
+ const data = await this.fetchJson(`${this.pugBase}/compound/cid/${cid}/synonyms/JSON`);
309
+ return data.InformationList.Information[0]?.Synonym ?? [];
310
+ }
311
+ catch (error) {
312
+ if (error instanceof PubChemNotFoundError)
313
+ return [];
314
+ throw error;
315
+ }
316
+ }
317
+ getImage(cid, size = 'large') {
318
+ const sizeParam = size === 'small' ? '?image_size=small' : '?image_size=large';
319
+ return this.fetchBinary(`${this.pugBase}/compound/cid/${cid}/PNG${sizeParam}`);
320
+ }
321
+ async getXrefs(cid, xrefType) {
322
+ try {
323
+ const data = await this.fetchJson(`${this.pugBase}/compound/cid/${cid}/xrefs/${xrefType}/JSON`);
324
+ const info = data.InformationList.Information[0];
325
+ if (!info)
326
+ return [];
327
+ const values = info[xrefType];
328
+ return Array.isArray(values) ? values : [];
329
+ }
330
+ catch (error) {
331
+ if (error instanceof PubChemNotFoundError)
332
+ return [];
333
+ throw error;
334
+ }
335
+ }
336
+ // ── PUG View ────────────────────────────────────────────────────
337
+ async getDescription(cid) {
338
+ try {
339
+ const data = await this.fetchJson(`${this.viewBase}/data/compound/${cid}/JSON?heading=Record+Description`);
340
+ const sections = data.Record.Section;
341
+ if (!sections)
342
+ return null;
343
+ const descSection = findSection(sections, 'Record Description');
344
+ if (!descSection)
345
+ return null;
346
+ const strings = extractStrings(descSection);
347
+ return strings.length > 0 ? strings.join('\n\n') : null;
348
+ }
349
+ catch (error) {
350
+ if (error instanceof PubChemNotFoundError)
351
+ return null;
352
+ throw error;
353
+ }
354
+ }
355
+ async getSafetyData(cid) {
356
+ try {
357
+ const data = await this.fetchJson(`${this.viewBase}/data/compound/${cid}/JSON?heading=Safety+and+Hazards`);
358
+ const sections = data.Record.Section;
359
+ if (!sections)
360
+ return null;
361
+ const ghsSection = findSection(sections, 'GHS Classification');
362
+ if (!ghsSection)
363
+ return null;
364
+ const infos = extractGHSInfo(ghsSection);
365
+ const result = {
366
+ pictograms: [],
367
+ hazardStatements: [],
368
+ precautionaryStatements: [],
369
+ };
370
+ for (const info of infos) {
371
+ const name = info.Name?.toLowerCase() ?? '';
372
+ const strings = info.Value.StringWithMarkup?.map((s) => s.String).filter(Boolean) ?? [];
373
+ if (name.includes('signal') && strings[0]) {
374
+ result.signalWord = strings[0];
375
+ }
376
+ else if (name.includes('pictogram')) {
377
+ const extras = info.Value.StringWithMarkup?.flatMap((s) => s.Markup?.map((m) => m.Extra).filter((e) => e != null) ?? []) ?? [];
378
+ result.pictograms.push(...(extras.length > 0 ? extras : strings).map(parsePictogram));
379
+ }
380
+ else if (name.includes('hazard') && name.includes('statement')) {
381
+ for (const s of strings) {
382
+ const parsed = parseCodedStatement(s);
383
+ if (parsed)
384
+ result.hazardStatements.push(parsed);
385
+ }
386
+ }
387
+ else if (name.includes('precautionary') && name.includes('statement')) {
388
+ for (const s of strings) {
389
+ const parsed = parseCodedStatement(s);
390
+ if (parsed)
391
+ result.precautionaryStatements.push(parsed);
392
+ }
393
+ }
394
+ }
395
+ // Deduplicate across depositors
396
+ result.pictograms = [...new Set(result.pictograms)];
397
+ const seenH = new Set();
398
+ result.hazardStatements = result.hazardStatements.filter((h) => {
399
+ if (seenH.has(h.code))
400
+ return false;
401
+ seenH.add(h.code);
402
+ return true;
403
+ });
404
+ const seenP = new Set();
405
+ result.precautionaryStatements = result.precautionaryStatements.filter((p) => {
406
+ if (seenP.has(p.code))
407
+ return false;
408
+ seenP.add(p.code);
409
+ return true;
410
+ });
411
+ // Extract source from references
412
+ const refs = data.Record.Reference;
413
+ if (refs?.[0]?.SourceName) {
414
+ result.source = refs[0].SourceName;
415
+ }
416
+ return result.signalWord || result.pictograms.length > 0 || result.hazardStatements.length > 0
417
+ ? result
418
+ : null;
419
+ }
420
+ catch (error) {
421
+ if (error instanceof PubChemNotFoundError)
422
+ return null;
423
+ throw error;
424
+ }
425
+ }
426
+ // ── Bioactivity ─────────────────────────────────────────────────
427
+ async getAssaySummary(cid) {
428
+ try {
429
+ const data = await this.fetchJson(`${this.pugBase}/compound/cid/${cid}/assaysummary/JSON`);
430
+ return this.parseAssayTable(data);
431
+ }
432
+ catch (error) {
433
+ if (error instanceof PubChemNotFoundError)
434
+ return [];
435
+ throw error;
436
+ }
437
+ }
438
+ parseAssayTable(data) {
439
+ const columns = data.Table.Columns.Column;
440
+ const rows = data.Table.Row;
441
+ // Build column index lookup — exact match
442
+ const col = (name) => columns.indexOf(name);
443
+ // Prefix match for columns with embedded units like "Activity Value [uM]"
444
+ const colPrefix = (prefix) => columns.findIndex((c) => c.startsWith(prefix));
445
+ const aidIdx = col('AID');
446
+ const nameIdx = col('Assay Name');
447
+ const outcomeIdx = col('Activity Outcome');
448
+ const targetAccIdx = col('Target Accession');
449
+ const geneIdIdx = col('Target GeneID');
450
+ const actValueIdx = colPrefix('Activity Value');
451
+ const actNameIdx = col('Activity Name');
452
+ // Extract unit from column name if present, e.g. "Activity Value [uM]" → "uM"
453
+ const actValueUnit = actValueIdx >= 0 ? (columns[actValueIdx]?.match(/\[(.+)\]/)?.[1] ?? '') : '';
454
+ // Group by AID to collect multiple activity values
455
+ const byAid = new Map();
456
+ for (const row of rows) {
457
+ const cell = row.Cell;
458
+ const aid = Number(cell[aidIdx]);
459
+ if (!aid || Number.isNaN(aid))
460
+ continue;
461
+ if (!byAid.has(aid)) {
462
+ const entry = {
463
+ aid,
464
+ assayName: String(cell[nameIdx] ?? ''),
465
+ outcome: String(cell[outcomeIdx] ?? ''),
466
+ activityValues: [],
467
+ };
468
+ if (targetAccIdx >= 0 && cell[targetAccIdx])
469
+ entry.targetAccession = String(cell[targetAccIdx]);
470
+ if (geneIdIdx >= 0 && cell[geneIdIdx] != null) {
471
+ const gid = Number(cell[geneIdIdx]);
472
+ if (!Number.isNaN(gid) && gid > 0)
473
+ entry.targetGeneId = gid;
474
+ }
475
+ byAid.set(aid, entry);
476
+ }
477
+ // Collect activity value if present
478
+ if (actValueIdx >= 0 && cell[actValueIdx] != null) {
479
+ const value = Number(cell[actValueIdx]);
480
+ if (!Number.isNaN(value)) {
481
+ byAid.get(aid)?.activityValues.push({
482
+ name: actNameIdx >= 0 ? String(cell[actNameIdx] ?? '') : '',
483
+ value,
484
+ unit: actValueUnit,
485
+ });
486
+ }
487
+ }
488
+ }
489
+ return [...byAid.values()];
490
+ }
491
+ // ── Assay Search ────────────────────────────────────────────────
492
+ async searchAssaysByTarget(targetType, query) {
493
+ // PubChem API expects "accession" not "proteinaccession"
494
+ const apiTargetType = targetType === 'proteinaccession' ? 'accession' : targetType;
495
+ try {
496
+ const data = await this.fetchJson(`${this.pugBase}/assay/target/${apiTargetType}/${encodeURIComponent(query)}/aids/JSON`);
497
+ return data.IdentifierList.AID;
498
+ }
499
+ catch (error) {
500
+ if (error instanceof PubChemNotFoundError)
501
+ return [];
502
+ throw error;
503
+ }
504
+ }
505
+ // ── Entity Summaries ────────────────────────────────────────────
506
+ async getEntitySummary(entityType, identifier) {
507
+ const pathMap = {
508
+ assay: `/assay/aid/${identifier}/summary/JSON`,
509
+ gene: `/gene/geneid/${identifier}/summary/JSON`,
510
+ protein: `/protein/accession/${encodeURIComponent(String(identifier))}/summary/JSON`,
511
+ taxonomy: `/taxonomy/taxid/${identifier}/summary/JSON`,
512
+ };
513
+ const path = pathMap[entityType];
514
+ if (!path)
515
+ throw new Error(`Unknown entity type: ${entityType}`);
516
+ try {
517
+ const data = await this.fetchJson(`${this.pugBase}${path}`);
518
+ // Response shape: { XxxSummaries: { XxxSummary: [{...}] } }
519
+ const summariesKey = Object.keys(data).find((k) => k.endsWith('Summaries'));
520
+ if (!summariesKey)
521
+ return null;
522
+ const summaries = data[summariesKey];
523
+ const summaryKey = Object.keys(summaries).find((k) => k.endsWith('Summary'));
524
+ if (!summaryKey)
525
+ return null;
526
+ const arr = summaries[summaryKey];
527
+ return arr[0] ?? null;
528
+ }
529
+ catch (error) {
530
+ if (error instanceof PubChemNotFoundError)
531
+ return null;
532
+ throw error;
533
+ }
534
+ }
535
+ }
536
+ // ── Init/Accessor ────────────────────────────────────────────────────
537
+ let _client;
538
+ export function initPubChemClient() {
539
+ _client = new PubChemClient();
540
+ }
541
+ export function getPubChemClient() {
542
+ if (!_client)
543
+ throw new Error('PubChemClient not initialized — call initPubChemClient() in setup()');
544
+ return _client;
545
+ }
546
+ //# sourceMappingURL=pubchem-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pubchem-client.js","sourceRoot":"","sources":["../../../src/services/pubchem/pubchem-client.ts"],"names":[],"mappings":"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"}