@cyanheads/pubchem-mcp-server 0.1.23 → 0.2.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 (65) hide show
  1. package/README.md +43 -8
  2. package/dist/index.js +3 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/mcp-server/resources/definitions/assay.resource.d.ts +9 -0
  5. package/dist/mcp-server/resources/definitions/assay.resource.d.ts.map +1 -0
  6. package/dist/mcp-server/resources/definitions/assay.resource.js +24 -0
  7. package/dist/mcp-server/resources/definitions/assay.resource.js.map +1 -0
  8. package/dist/mcp-server/resources/definitions/compound-bioactivity.resource.d.ts +9 -0
  9. package/dist/mcp-server/resources/definitions/compound-bioactivity.resource.d.ts.map +1 -0
  10. package/dist/mcp-server/resources/definitions/compound-bioactivity.resource.js +28 -0
  11. package/dist/mcp-server/resources/definitions/compound-bioactivity.resource.js.map +1 -0
  12. package/dist/mcp-server/resources/definitions/compound-image.resource.d.ts +11 -0
  13. package/dist/mcp-server/resources/definitions/compound-image.resource.d.ts.map +1 -0
  14. package/dist/mcp-server/resources/definitions/compound-image.resource.js +28 -0
  15. package/dist/mcp-server/resources/definitions/compound-image.resource.js.map +1 -0
  16. package/dist/mcp-server/resources/definitions/compound-safety.resource.d.ts +9 -0
  17. package/dist/mcp-server/resources/definitions/compound-safety.resource.d.ts.map +1 -0
  18. package/dist/mcp-server/resources/definitions/compound-safety.resource.js +32 -0
  19. package/dist/mcp-server/resources/definitions/compound-safety.resource.js.map +1 -0
  20. package/dist/mcp-server/resources/definitions/compound-xrefs.resource.d.ts +9 -0
  21. package/dist/mcp-server/resources/definitions/compound-xrefs.resource.d.ts.map +1 -0
  22. package/dist/mcp-server/resources/definitions/compound-xrefs.resource.js +29 -0
  23. package/dist/mcp-server/resources/definitions/compound-xrefs.resource.js.map +1 -0
  24. package/dist/mcp-server/resources/definitions/compound.resource.d.ts +9 -0
  25. package/dist/mcp-server/resources/definitions/compound.resource.d.ts.map +1 -0
  26. package/dist/mcp-server/resources/definitions/compound.resource.js +28 -0
  27. package/dist/mcp-server/resources/definitions/compound.resource.js.map +1 -0
  28. package/dist/mcp-server/resources/definitions/index.d.ts +14 -0
  29. package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -0
  30. package/dist/mcp-server/resources/definitions/index.js +19 -0
  31. package/dist/mcp-server/resources/definitions/index.js.map +1 -0
  32. package/dist/mcp-server/tools/definitions/get-bioactivity.tool.d.ts +3 -0
  33. package/dist/mcp-server/tools/definitions/get-bioactivity.tool.d.ts.map +1 -1
  34. package/dist/mcp-server/tools/definitions/get-bioactivity.tool.js +38 -6
  35. package/dist/mcp-server/tools/definitions/get-bioactivity.tool.js.map +1 -1
  36. package/dist/mcp-server/tools/definitions/get-compound-3d-structure.tool.d.ts +38 -0
  37. package/dist/mcp-server/tools/definitions/get-compound-3d-structure.tool.d.ts.map +1 -0
  38. package/dist/mcp-server/tools/definitions/get-compound-3d-structure.tool.js +133 -0
  39. package/dist/mcp-server/tools/definitions/get-compound-3d-structure.tool.js.map +1 -0
  40. package/dist/mcp-server/tools/definitions/get-compound-interactions.tool.d.ts +33 -0
  41. package/dist/mcp-server/tools/definitions/get-compound-interactions.tool.d.ts.map +1 -0
  42. package/dist/mcp-server/tools/definitions/get-compound-interactions.tool.js +110 -0
  43. package/dist/mcp-server/tools/definitions/get-compound-interactions.tool.js.map +1 -0
  44. package/dist/mcp-server/tools/definitions/get-compound-safety.tool.d.ts +19 -15
  45. package/dist/mcp-server/tools/definitions/get-compound-safety.tool.d.ts.map +1 -1
  46. package/dist/mcp-server/tools/definitions/get-compound-safety.tool.js +106 -73
  47. package/dist/mcp-server/tools/definitions/get-compound-safety.tool.js.map +1 -1
  48. package/dist/mcp-server/tools/definitions/index.d.ts +75 -12
  49. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
  50. package/dist/mcp-server/tools/definitions/index.js +4 -0
  51. package/dist/mcp-server/tools/definitions/index.js.map +1 -1
  52. package/dist/services/pubchem/pubchem-client.d.ts +36 -1
  53. package/dist/services/pubchem/pubchem-client.d.ts.map +1 -1
  54. package/dist/services/pubchem/pubchem-client.js +191 -23
  55. package/dist/services/pubchem/pubchem-client.js.map +1 -1
  56. package/dist/services/pubchem/sdf-parser.d.ts +20 -0
  57. package/dist/services/pubchem/sdf-parser.d.ts.map +1 -0
  58. package/dist/services/pubchem/sdf-parser.js +55 -0
  59. package/dist/services/pubchem/sdf-parser.js.map +1 -0
  60. package/dist/services/pubchem/types.d.ts +55 -0
  61. package/dist/services/pubchem/types.d.ts.map +1 -1
  62. package/dist/services/pubchem/types.js.map +1 -1
  63. package/manifest.json +1 -1
  64. package/package.json +1 -1
  65. package/server.json +3 -3
@@ -1,108 +1,141 @@
1
1
  /**
2
- * @fileoverview Get GHS hazard classification and safety data for a PubChem compound.
2
+ * @fileoverview Get GHS hazard classification and safety data for PubChem compounds (batched).
3
3
  * @module mcp-server/tools/definitions/get-compound-safety
4
4
  */
5
5
  import { tool, z } from '@cyanheads/mcp-ts-core';
6
6
  import { getPubChemClient } from '../../../services/pubchem/pubchem-client.js';
7
+ const ghsSchema = z
8
+ .object({
9
+ signalWord: z.string().optional().describe('GHS signal word: "Danger" or "Warning".'),
10
+ pictograms: z.array(z.string()).describe('GHS pictogram labels (e.g. "Flammable", "Toxic").'),
11
+ hazardStatements: z
12
+ .array(z
13
+ .object({
14
+ code: z.string().describe('H-code (e.g. "H225").'),
15
+ statement: z.string().describe('Hazard statement text.'),
16
+ })
17
+ .describe('GHS hazard statement entry.'))
18
+ .describe('GHS hazard statements.'),
19
+ precautionaryStatements: z
20
+ .array(z
21
+ .object({
22
+ code: z.string().describe('P-code (e.g. "P210").'),
23
+ statement: z.string().describe('Precautionary statement text.'),
24
+ })
25
+ .describe('GHS precautionary statement entry.'))
26
+ .describe('GHS precautionary statements.'),
27
+ })
28
+ .describe('GHS classification data.');
29
+ /** Fan-out cap: at most this many PUG View calls in flight at once (mirrors get_compound_details). */
30
+ const MAX_IN_FLIGHT = 10;
7
31
  export const getCompoundSafety = tool('pubchem_get_compound_safety', {
8
32
  title: 'Get Compound Safety',
9
- description: 'Get GHS (Globally Harmonized System) hazard classification and safety data for a compound. Returns signal word, pictograms, hazard statements (H-codes), and precautionary statements (P-codes). Data sourced from PubChem depositors — source attribution included.',
33
+ description: 'Get GHS (Globally Harmonized System) hazard classification and safety data for one or more compounds by CID. Returns signal word, pictograms, hazard statements (H-codes), and precautionary statements (P-codes) per compound. Data sourced from PubChem depositors — source attribution included.',
10
34
  annotations: {
11
35
  readOnlyHint: true,
12
36
  idempotentHint: true,
13
37
  openWorldHint: true,
14
38
  },
15
39
  input: z.object({
16
- cid: z
17
- .number()
18
- .int()
19
- .positive()
20
- .describe('PubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds.'),
40
+ cids: z
41
+ .array(z.number().int().positive())
42
+ .min(1)
43
+ .max(25)
44
+ .describe('PubChem Compound IDs to fetch safety data for (1-25). Resolve from names/SMILES with pubchem_search_compounds.'),
21
45
  }),
22
46
  output: z.object({
23
- cid: z.number().describe('PubChem Compound ID.'),
24
- hasData: z.boolean().describe('Whether GHS safety data is available for this compound.'),
25
- ghs: z
47
+ results: z
48
+ .array(z
26
49
  .object({
27
- signalWord: z.string().optional().describe('GHS signal word: "Danger" or "Warning".'),
28
- pictograms: z
29
- .array(z.string())
30
- .describe('GHS pictogram labels (e.g. "Flammable", "Toxic").'),
31
- hazardStatements: z
32
- .array(z
33
- .object({
34
- code: z.string().describe('H-code (e.g. "H225").'),
35
- statement: z.string().describe('Hazard statement text.'),
36
- })
37
- .describe('GHS hazard statement entry.'))
38
- .describe('GHS hazard statements.'),
39
- precautionaryStatements: z
40
- .array(z
41
- .object({
42
- code: z.string().describe('P-code (e.g. "P210").'),
43
- statement: z.string().describe('Precautionary statement text.'),
44
- })
45
- .describe('GHS precautionary statement entry.'))
46
- .describe('GHS precautionary statements.'),
50
+ cid: z.number().describe('PubChem Compound ID.'),
51
+ hasData: z
52
+ .boolean()
53
+ .describe('Whether GHS safety data is available for this compound.'),
54
+ ghs: ghsSchema.optional(),
55
+ source: z.string().optional().describe('Data source attribution.'),
47
56
  })
48
- .optional()
49
- .describe('GHS classification data.'),
50
- source: z.string().optional().describe('Data source attribution.'),
57
+ .describe('Per-CID safety result.'))
58
+ .describe('Safety results, one per requested CID (input order preserved).'),
51
59
  }),
52
- // Agent-facing context — a cross-tool notice when no GHS data exists, pointing to an
53
- // alternative source. Reaches structuredContent and content[]; disjoint from output.
60
+ // Agent-facing context — requested/with-data counts and a cross-tool notice listing the CIDs
61
+ // that lack GHS data. Reaches structuredContent and content[]; keys disjoint from output.
54
62
  enrichment: {
63
+ requestedCount: z.number().describe('CIDs requested.'),
64
+ withDataCount: z.number().describe('CIDs with GHS safety data available.'),
55
65
  notice: z
56
66
  .string()
57
67
  .optional()
58
- .describe('Cross-tool guidance when no GHS data is available, pointing to an alternative source.'),
68
+ .describe('Cross-tool guidance when one or more CIDs have no GHS data, pointing to an alternative source.'),
59
69
  },
60
70
  async handler(input, ctx) {
61
71
  const client = getPubChemClient();
62
- const data = await client.getSafetyData(input.cid);
63
- ctx.log.info('Safety data fetched', { cid: input.cid, hasData: data !== null });
64
- if (!data) {
65
- ctx.enrich.notice(`No GHS classification on file for CID ${input.cid}. Try pubchem_get_compound_details with includeDescription for hazard context, or the compound may simply lack deposited safety data.`);
66
- return { cid: input.cid, hasData: false };
72
+ // Fan out per CID, capped at MAX_IN_FLIGHT in flight.
73
+ const dataByCid = new Map();
74
+ for (let i = 0; i < input.cids.length; i += MAX_IN_FLIGHT) {
75
+ const chunk = input.cids.slice(i, i + MAX_IN_FLIGHT);
76
+ const chunkData = await Promise.all(chunk.map(async (cid) => [cid, await client.getSafetyData(cid)]));
77
+ for (const [cid, data] of chunkData)
78
+ dataByCid.set(cid, data);
79
+ }
80
+ const results = input.cids.map((cid) => {
81
+ const data = dataByCid.get(cid) ?? null;
82
+ if (!data)
83
+ return { cid, hasData: false };
84
+ return {
85
+ cid,
86
+ hasData: true,
87
+ ghs: {
88
+ signalWord: data.signalWord,
89
+ pictograms: data.pictograms,
90
+ hazardStatements: data.hazardStatements,
91
+ precautionaryStatements: data.precautionaryStatements,
92
+ },
93
+ source: data.source,
94
+ };
95
+ });
96
+ const withDataCount = results.filter((r) => r.hasData).length;
97
+ ctx.log.info('Safety data fetched', {
98
+ requested: input.cids.length,
99
+ withData: withDataCount,
100
+ });
101
+ ctx.enrich({ requestedCount: input.cids.length, withDataCount });
102
+ if (withDataCount < input.cids.length) {
103
+ const missing = results.filter((r) => !r.hasData).map((r) => r.cid);
104
+ ctx.enrich.notice(`No GHS classification on file for ${missing.length} of ${input.cids.length} CID(s): ${missing.join(', ')}. Try pubchem_get_compound_details with includeDescription for hazard context, or those compounds may simply lack deposited safety data.`);
67
105
  }
68
- return {
69
- cid: input.cid,
70
- hasData: true,
71
- ghs: {
72
- signalWord: data.signalWord,
73
- pictograms: data.pictograms,
74
- hazardStatements: data.hazardStatements,
75
- precautionaryStatements: data.precautionaryStatements,
76
- },
77
- source: data.source,
78
- };
106
+ return { results };
79
107
  },
80
108
  format(result) {
81
- if (!result.hasData || !result.ghs) {
82
- return [{ type: 'text', text: `No GHS safety data available for CID ${result.cid}.` }];
109
+ if (result.results.length === 0) {
110
+ return [{ type: 'text', text: 'No compounds requested.' }];
83
111
  }
84
- const lines = [`## GHS Safety Data — CID ${result.cid}`, ''];
85
- const g = result.ghs;
86
- if (g.signalWord)
87
- lines.push(`**Signal Word:** ${g.signalWord}`);
88
- if (g.pictograms.length > 0)
89
- lines.push(`**Pictograms:** ${g.pictograms.join(', ')}`);
90
- if (g.hazardStatements.length > 0) {
91
- lines.push('', '**Hazard Statements:**');
92
- for (const h of g.hazardStatements) {
93
- lines.push(` ${h.code}: ${h.statement}`);
112
+ const blocks = [];
113
+ for (const r of result.results) {
114
+ if (!r.hasData || !r.ghs) {
115
+ blocks.push(`## CID ${r.cid} — no GHS safety data`, '');
116
+ continue;
94
117
  }
95
- }
96
- if (g.precautionaryStatements.length > 0) {
97
- lines.push('', '**Precautionary Statements:**');
98
- for (const p of g.precautionaryStatements) {
99
- lines.push(` ${p.code}: ${p.statement}`);
118
+ const lines = [`## GHS Safety Data — CID ${r.cid}`];
119
+ const g = r.ghs;
120
+ if (g.signalWord)
121
+ lines.push(`**Signal Word:** ${g.signalWord}`);
122
+ if (g.pictograms.length > 0)
123
+ lines.push(`**Pictograms:** ${g.pictograms.join(', ')}`);
124
+ if (g.hazardStatements.length > 0) {
125
+ lines.push('', '**Hazard Statements:**');
126
+ for (const h of g.hazardStatements)
127
+ lines.push(` ${h.code}: ${h.statement}`);
100
128
  }
129
+ if (g.precautionaryStatements.length > 0) {
130
+ lines.push('', '**Precautionary Statements:**');
131
+ for (const p of g.precautionaryStatements)
132
+ lines.push(` ${p.code}: ${p.statement}`);
133
+ }
134
+ if (r.source)
135
+ lines.push('', `*Source: ${r.source}*`);
136
+ blocks.push(lines.join('\n'), '');
101
137
  }
102
- if (result.source) {
103
- lines.push('', `*Source: ${result.source}*`);
104
- }
105
- return [{ type: 'text', text: lines.join('\n') }];
138
+ return [{ type: 'text', text: blocks.join('\n') }];
106
139
  },
107
140
  });
108
141
  //# sourceMappingURL=get-compound-safety.tool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-compound-safety.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-compound-safety.tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"get-compound-safety.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-compound-safety.tool.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,8 @@ export declare const allToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolD
9
9
  inactive: "inactive";
10
10
  all: "all";
11
11
  }>>;
12
+ targetGeneId: import("zod").ZodOptional<import("zod").ZodNumber>;
13
+ targetAccession: import("zod").ZodOptional<import("zod").ZodString>;
12
14
  maxResults: import("zod").ZodDefault<import("zod").ZodNumber>;
13
15
  }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
14
16
  cid: import("zod").ZodNumber;
@@ -29,10 +31,41 @@ export declare const allToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolD
29
31
  }, import("zod/v4/core").$strip>>;
30
32
  }, import("zod/v4/core").$strip>, undefined, {
31
33
  readonly outcomeFilter: import("zod").ZodString;
34
+ readonly targetFilter: import("zod").ZodOptional<import("zod").ZodString>;
32
35
  readonly filteredCount: import("zod").ZodNumber;
33
36
  readonly returnedCount: import("zod").ZodNumber;
34
37
  readonly notice: import("zod").ZodOptional<import("zod").ZodString>;
35
38
  }> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
39
+ cid: import("zod").ZodNumber;
40
+ format: import("zod").ZodDefault<import("zod").ZodEnum<{
41
+ sdf: "sdf";
42
+ json: "json";
43
+ }>>;
44
+ includeAlternateConformerIds: import("zod").ZodDefault<import("zod").ZodBoolean>;
45
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
46
+ cid: import("zod").ZodNumber;
47
+ conformerId: import("zod").ZodOptional<import("zod").ZodString>;
48
+ atomCount: import("zod").ZodNumber;
49
+ bondCount: import("zod").ZodNumber;
50
+ atoms: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
51
+ element: import("zod").ZodString;
52
+ x: import("zod").ZodNumber;
53
+ y: import("zod").ZodNumber;
54
+ z: import("zod").ZodNumber;
55
+ }, import("zod/v4/core").$strip>>>;
56
+ bonds: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
57
+ a1: import("zod").ZodNumber;
58
+ a2: import("zod").ZodNumber;
59
+ order: import("zod").ZodNumber;
60
+ }, import("zod/v4/core").$strip>>>;
61
+ sdf: import("zod").ZodOptional<import("zod").ZodString>;
62
+ alternateConformerIds: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
63
+ }, import("zod/v4/core").$strip>, readonly [{
64
+ readonly reason: "no_3d_structure";
65
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
66
+ readonly when: "PubChem has no computed 3D conformer for the requested CID";
67
+ readonly recovery: "Use pubchem_get_compound_image for the 2D structure, or verify the CID with pubchem_search_compounds.";
68
+ }], undefined> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
36
69
  cids: import("zod").ZodArray<import("zod").ZodNumber>;
37
70
  properties: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodEnum<{
38
71
  [x: string]: string;
@@ -121,23 +154,53 @@ export declare const allToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolD
121
154
  readonly recovery: "Verify the CID with pubchem_search_compounds before retrying.";
122
155
  }], undefined> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
123
156
  cid: import("zod").ZodNumber;
157
+ kinds: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodEnum<{
158
+ "drug-drug": "drug-drug";
159
+ "drug-food": "drug-food";
160
+ target: "target";
161
+ }>>>;
162
+ maxEntries: import("zod").ZodDefault<import("zod").ZodNumber>;
124
163
  }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
125
164
  cid: import("zod").ZodNumber;
126
- hasData: import("zod").ZodBoolean;
127
- ghs: import("zod").ZodOptional<import("zod").ZodObject<{
128
- signalWord: import("zod").ZodOptional<import("zod").ZodString>;
129
- pictograms: import("zod").ZodArray<import("zod").ZodString>;
130
- hazardStatements: import("zod").ZodArray<import("zod").ZodObject<{
131
- code: import("zod").ZodString;
132
- statement: import("zod").ZodString;
133
- }, import("zod/v4/core").$strip>>;
134
- precautionaryStatements: import("zod").ZodArray<import("zod").ZodObject<{
135
- code: import("zod").ZodString;
136
- statement: import("zod").ZodString;
165
+ entries: import("zod").ZodArray<import("zod").ZodObject<{
166
+ kind: import("zod").ZodEnum<{
167
+ "drug-drug": "drug-drug";
168
+ "drug-food": "drug-food";
169
+ target: "target";
170
+ }>;
171
+ partner: import("zod").ZodOptional<import("zod").ZodString>;
172
+ source: import("zod").ZodString;
173
+ severity: import("zod").ZodOptional<import("zod").ZodString>;
174
+ text: import("zod").ZodString;
175
+ }, import("zod/v4/core").$strip>>;
176
+ }, import("zod/v4/core").$strip>, undefined, {
177
+ readonly requestedKinds: import("zod").ZodString;
178
+ readonly returnedCount: import("zod").ZodNumber;
179
+ readonly failedKinds: import("zod").ZodOptional<import("zod").ZodString>;
180
+ readonly notice: import("zod").ZodOptional<import("zod").ZodString>;
181
+ }> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
182
+ cids: import("zod").ZodArray<import("zod").ZodNumber>;
183
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
184
+ results: import("zod").ZodArray<import("zod").ZodObject<{
185
+ cid: import("zod").ZodNumber;
186
+ hasData: import("zod").ZodBoolean;
187
+ ghs: import("zod").ZodOptional<import("zod").ZodObject<{
188
+ signalWord: import("zod").ZodOptional<import("zod").ZodString>;
189
+ pictograms: import("zod").ZodArray<import("zod").ZodString>;
190
+ hazardStatements: import("zod").ZodArray<import("zod").ZodObject<{
191
+ code: import("zod").ZodString;
192
+ statement: import("zod").ZodString;
193
+ }, import("zod/v4/core").$strip>>;
194
+ precautionaryStatements: import("zod").ZodArray<import("zod").ZodObject<{
195
+ code: import("zod").ZodString;
196
+ statement: import("zod").ZodString;
197
+ }, import("zod/v4/core").$strip>>;
137
198
  }, import("zod/v4/core").$strip>>;
199
+ source: import("zod").ZodOptional<import("zod").ZodString>;
138
200
  }, import("zod/v4/core").$strip>>;
139
- source: import("zod").ZodOptional<import("zod").ZodString>;
140
201
  }, import("zod/v4/core").$strip>, undefined, {
202
+ readonly requestedCount: import("zod").ZodNumber;
203
+ readonly withDataCount: import("zod").ZodNumber;
141
204
  readonly notice: import("zod").ZodOptional<import("zod").ZodString>;
142
205
  }> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
143
206
  cid: import("zod").ZodNumber;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAS9B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAW9B,CAAC"}
@@ -3,8 +3,10 @@
3
3
  * @module mcp-server/tools/definitions
4
4
  */
5
5
  import { getBioactivity } from './get-bioactivity.tool.js';
6
+ import { getCompound3dStructure } from './get-compound-3d-structure.tool.js';
6
7
  import { getCompoundDetails } from './get-compound-details.tool.js';
7
8
  import { getCompoundImage } from './get-compound-image.tool.js';
9
+ import { getCompoundInteractions } from './get-compound-interactions.tool.js';
8
10
  import { getCompoundSafety } from './get-compound-safety.tool.js';
9
11
  import { getCompoundXrefs } from './get-compound-xrefs.tool.js';
10
12
  import { getSummary } from './get-summary.tool.js';
@@ -14,9 +16,11 @@ export const allToolDefinitions = [
14
16
  searchCompounds,
15
17
  getCompoundDetails,
16
18
  getCompoundImage,
19
+ getCompound3dStructure,
17
20
  getCompoundXrefs,
18
21
  getCompoundSafety,
19
22
  getBioactivity,
23
+ getCompoundInteractions,
20
24
  searchAssays,
21
25
  getSummary,
22
26
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,eAAe;IACf,kBAAkB;IAClB,gBAAgB;IAChB,gBAAgB;IAChB,iBAAiB;IACjB,cAAc;IACd,YAAY;IACZ,UAAU;CACX,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,eAAe;IACf,kBAAkB;IAClB,gBAAgB;IAChB,sBAAsB;IACtB,gBAAgB;IAChB,iBAAiB;IACjB,cAAc;IACd,uBAAuB;IACvB,YAAY;IACZ,UAAU;CACX,CAAC"}
@@ -3,13 +3,22 @@
3
3
  * Wraps both PUG REST and PUG View APIs behind a shared rate limiter.
4
4
  * @module services/pubchem/pubchem-client
5
5
  */
6
- import type { BioactivityRow, CompoundClassification, GHSClassification } from './types.js';
6
+ import type { BioactivityRow, CompoundClassification, GHSClassification, InteractionsResult } from './types.js';
7
7
  export declare class PubChemClient {
8
8
  private readonly pugBase;
9
9
  private readonly viewBase;
10
+ private readonly sdqBase;
10
11
  private readonly rateLimiter;
12
+ /** Shared HTTP core: rate-limit, 30s timeout, retry once on 5xx and once on a transient
13
+ * network error, and surface a clean timeout message. Returns the ok Response; callers
14
+ * extract the body (JSON, bytes, or text). Centralizing this keeps every fetch variant on
15
+ * one resilience contract — the divergence that left fetchBinary without retry or a clean
16
+ * timeout message (#16) cannot recur. */
17
+ private fetchResponse;
11
18
  private fetchJson;
12
19
  private fetchBinary;
20
+ /** Fetch a text/plain body (e.g. an SDF record). Non-2xx is classified and thrown. */
21
+ private fetchText;
13
22
  /** Fetch CID list, with automatic ListKey polling for async searches */
14
23
  private fetchCids;
15
24
  /** Poll a PubChem ListKey until results are ready */
@@ -35,6 +44,32 @@ export declare class PubChemClient {
35
44
  private parseAssayTable;
36
45
  searchAssaysByTarget(targetType: string, query: string): Promise<number[]>;
37
46
  getEntitySummary(entityType: string, identifier: string | number): Promise<Record<string, unknown> | null>;
47
+ /** Fetch drug-drug, drug-food, and/or chemical-target interactions for a compound.
48
+ * Drug-drug and target data live in PubChem SDQ external tables (drugbankddi,
49
+ * consolidatedcompoundtarget); drug-food is inline PUG View text. Each kind is capped
50
+ * at maxEntries; absent data for a kind contributes nothing rather than erroring. */
51
+ getInteractions(cid: number, kinds: Array<'drug-drug' | 'drug-food' | 'target'>, maxEntries: number): Promise<InteractionsResult>;
52
+ private getInteractionsForKind;
53
+ private getDrugDrugInteractions;
54
+ /** Chemical-target binding/activity from PubChem's `bioactivity` SDQ collection (BindingDB,
55
+ * ChEMBL, and others). That collection is cid-keyed and scopes correctly to the requested
56
+ * compound; the `consolidatedcompoundtarget` collection used previously is gene-indexed, so
57
+ * its `cid` filter was silently ignored — every CID returned the same default compound (#20).
58
+ * Only rows naming a molecular target are returned; untargeted assay outcomes are the domain
59
+ * of pubchem_get_bioactivity. */
60
+ private getTargetInteractions;
61
+ private getDrugFoodInteractions;
62
+ /** Query a PubChem SDQ external table for a single CID, projecting only the columns the
63
+ * caller maps. Projection keeps payloads small and excludes the free-text `citations` column
64
+ * whose unescaped quotes make PubChem emit invalid JSON (#20). Returns [] on not-found; on an
65
+ * unparseable body throws a contextful error rather than the bare `Failed to parse JSON`, so
66
+ * the caller and per-kind isolation can report it cleanly. */
67
+ private fetchSdq;
68
+ /** Fetch the default 3D conformer as raw V2000 SDF text. Throws a typed not-found when
69
+ * PubChem has no computed 3D coordinates (large molecules, mixtures, undefined salts). */
70
+ getSdf3d(cid: number): Promise<string>;
71
+ /** List the conformer IDs PubChem has computed for a compound. Returns [] on not-found. */
72
+ getConformerIds(cid: number): Promise<string[]>;
38
73
  }
39
74
  export declare function initPubChemClient(): void;
40
75
  export declare function getPubChemClient(): PubChemClient;
@@ -1 +1 @@
1
- {"version":3,"file":"pubchem-client.d.ts","sourceRoot":"","sources":["../../../src/services/pubchem/pubchem-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAGV,cAAc,EAEd,sBAAsB,EACtB,iBAAiB,EAQlB,MAAM,YAAY,CAAC;AA8MpB,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+C;IACvE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoD;IAC7E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;YAIpC,SAAS;YAgDT,WAAW;IA2BzB,wEAAwE;YAC1D,SAAS;IAWvB,qDAAqD;YACvC,WAAW;IAgBzB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAI7C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAQjD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAMrD,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAOvE,iBAAiB,CACf,IAAI,EAAE,cAAc,GAAG,gBAAgB,GAAG,YAAY,EACtD,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,QAAQ,GAAG,KAAK,EAC3B,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC;IA2Bd,aAAa,CACjB,IAAI,EAAE,MAAM,EAAE,EACd,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IA0BtD,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAY3C,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,OAAO,GAAG,OAAiB,GAAG,OAAO,CAAC,WAAW,CAAC;IAkB9E,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAiBrE,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IA8B9E,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAgE7D,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAwEtE,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAY7D,OAAO,CAAC,eAAe;IA0EjB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAgB1E,gBAAgB,CACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAAG,MAAM,GAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAiC3C;AAMD,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAIhD"}
1
+ {"version":3,"file":"pubchem-client.d.ts","sourceRoot":"","sources":["../../../src/services/pubchem/pubchem-client.ts"],"names":[],"mappings":"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"}