@cyanheads/pubchem-mcp-server 0.6.2 → 0.6.3
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/AGENTS.md +371 -0
- package/CLAUDE.md +371 -0
- package/README.md +215 -86
- package/changelog/0.1.x/0.1.21.md +23 -0
- package/changelog/0.1.x/0.1.22.md +14 -0
- package/changelog/0.1.x/0.1.23.md +18 -0
- package/changelog/0.2.x/0.2.0.md +24 -0
- package/changelog/0.2.x/0.2.1.md +14 -0
- package/changelog/0.2.x/0.2.2.md +17 -0
- package/changelog/0.2.x/0.2.3.md +27 -0
- package/changelog/0.2.x/0.2.4.md +27 -0
- package/changelog/0.3.x/0.3.0.md +31 -0
- package/changelog/0.3.x/0.3.1.md +19 -0
- package/changelog/0.4.x/0.4.0.md +15 -0
- package/changelog/0.4.x/0.4.1.md +12 -0
- package/changelog/0.4.x/0.4.2.md +41 -0
- package/changelog/0.4.x/0.4.3.md +18 -0
- package/changelog/0.5.x/0.5.0.md +24 -0
- package/changelog/0.5.x/0.5.1.md +24 -0
- package/changelog/0.5.x/0.5.2.md +21 -0
- package/changelog/0.6.x/0.6.0.md +15 -0
- package/changelog/0.6.x/0.6.1.md +40 -0
- package/changelog/0.6.x/0.6.2.md +29 -0
- package/changelog/0.6.x/0.6.3.md +40 -0
- package/changelog/template.md +151 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-bioactivity.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-bioactivity.tool.js +4 -0
- package/dist/mcp-server/tools/definitions/get-bioactivity.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-compound-3d-structure.tool.d.ts +1 -0
- package/dist/mcp-server/tools/definitions/get-compound-3d-structure.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-compound-3d-structure.tool.js +3 -0
- package/dist/mcp-server/tools/definitions/get-compound-3d-structure.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-compound-image.tool.d.ts +1 -0
- package/dist/mcp-server/tools/definitions/get-compound-image.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-compound-image.tool.js +3 -0
- package/dist/mcp-server/tools/definitions/get-compound-image.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-compound-interactions.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-compound-interactions.tool.js +3 -0
- package/dist/mcp-server/tools/definitions/get-compound-interactions.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-compound-xrefs.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-compound-xrefs.tool.js +4 -0
- package/dist/mcp-server/tools/definitions/get-compound-xrefs.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/index.d.ts +2 -0
- package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-assays.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-assays.tool.js +3 -0
- package/dist/mcp-server/tools/definitions/search-assays.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/untrusted-text.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/untrusted-text.js +8 -1
- package/dist/mcp-server/tools/definitions/untrusted-text.js.map +1 -1
- package/dist/services/pubchem/pubchem-client.d.ts.map +1 -1
- package/dist/services/pubchem/pubchem-client.js +14 -3
- package/dist/services/pubchem/pubchem-client.js.map +1 -1
- package/manifest.json +1 -1
- package/package.json +18 -8
- package/server.json +3 -3
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
<div align="center">
|
|
9
9
|
|
|
10
|
-
[](./CHANGELOG.md) [](./LICENSE) [](https://github.com/users/cyanheads/packages/container/package/pubchem-mcp-server) [](https://modelcontextprotocol.io/) [](https://www.npmjs.com/package/@cyanheads/pubchem-mcp-server) [](https://www.typescriptlang.org/) [](https://bun.sh/)
|
|
11
11
|
|
|
12
12
|
</div>
|
|
13
13
|
|
|
@@ -27,12 +27,14 @@
|
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
-
##
|
|
30
|
+
## Overview
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
Chemical compound and bioassay data from PubChem's PUG REST and PUG View APIs. Search compounds by identifier, formula, or structure; fetch physicochemical properties, safety data, bioactivity, interactions, cross-references, and 3D structures; find bioassays by biological target. Runs as a stdio process, a local Streamable HTTP server, or the public hosted endpoint above.
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
### Tools
|
|
35
|
+
|
|
36
|
+
| Tool | Description |
|
|
37
|
+
|:---|:---|
|
|
36
38
|
| `pubchem_search_compounds` | Search for compounds by name, SMILES, InChIKey, formula, substructure, superstructure, or 2D similarity. |
|
|
37
39
|
| `pubchem_get_compound_details` | Get physicochemical properties, descriptions, synonyms, drug-likeness, and classification for compounds by CID. |
|
|
38
40
|
| `pubchem_get_compound_image` | Fetch a 2D structure diagram (PNG) for a compound by CID. |
|
|
@@ -44,104 +46,173 @@ Ten tools for querying PubChem's chemical information database:
|
|
|
44
46
|
| `pubchem_search_assays` | Find bioassays by biological target (gene symbol, protein, Gene ID, UniProt accession). |
|
|
45
47
|
| `pubchem_get_summary` | Get summaries for PubChem entities: assays, genes, proteins, taxonomy. |
|
|
46
48
|
|
|
47
|
-
###
|
|
49
|
+
### Resources
|
|
50
|
+
|
|
51
|
+
Compound and assay records are also exposed as URI-templated resources, backed by the same client methods as the tools; many MCP clients are tool-only and never surface resources.
|
|
52
|
+
|
|
53
|
+
| Resource | Description |
|
|
54
|
+
|:---|:---|
|
|
55
|
+
| `pubchem://compound/{cid}` | Core physicochemical properties (JSON). |
|
|
56
|
+
| `pubchem://compound/{cid}/safety` | GHS hazard classification (JSON). |
|
|
57
|
+
| `pubchem://compound/{cid}/image` | 2D structure diagram (PNG). |
|
|
58
|
+
| `pubchem://compound/{cid}/xrefs` | External cross-references (JSON). |
|
|
59
|
+
| `pubchem://compound/{cid}/bioactivity` | Bioassay activity profile (JSON). |
|
|
60
|
+
| `pubchem://assay/{aid}` | BioAssay summary (JSON). |
|
|
61
|
+
|
|
62
|
+
## Capability reference
|
|
63
|
+
|
|
64
|
+
### `pubchem_search_compounds` <sub>tool</sub>
|
|
65
|
+
|
|
66
|
+
- Five search strategies: identifier (name/SMILES/InChIKey, batched 1-25), formula (Hill notation, optional `allowOtherElements`), substructure/superstructure containment, or 2D Tanimoto similarity (threshold 70-100, default 90)
|
|
67
|
+
- Caps at 200 CIDs per page (default 20); `offset` pages to a ceiling of 10,000 — identifier lookups resolve every match up front so paging is free, while formula/structure/similarity searches cost more upstream per deep page
|
|
68
|
+
- Optional `properties` hydration avoids a follow-up `pubchem_get_compound_details` call
|
|
69
|
+
- Identifier mode reports `unresolvedIdentifiers` for inputs that resolved to no CID, plus notices when multiple inputs collide on one CID
|
|
70
|
+
- Reports an exact `totalFound` when the full match set was observed, or a `totalFoundAtLeast` floor when a bounded upstream search saturated
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
### `pubchem_get_compound_details` <sub>tool</sub>
|
|
75
|
+
|
|
76
|
+
- Up to 100 CIDs per call; 27 available properties, defaulting to a core set of 14 (formula, weight, IUPAC name, SMILES forms, InChIKey, XLogP, TPSA, H-bond/rotatable-bond counts, heavy atom count, charge, complexity)
|
|
77
|
+
- Optional textual descriptions, paged via `descriptionOffset`/`maxDescriptions` (default 3, up to 20) — fetched only for the first 10 CIDs in the batch, remaining CIDs listed in `skippedCids`
|
|
78
|
+
- Optional synonyms for every found CID, paged via `synonymOffset`/`maxSynonyms` (default 20, up to 100)
|
|
79
|
+
- Optional drug-likeness assessment (Lipinski Rule of Five + Veber rules), computed from the returned properties at no extra latency
|
|
80
|
+
- Optional pharmacological classification (FDA classes/mechanisms, MeSH classes, ATC codes) — same 10-CID fan-out cap as descriptions
|
|
81
|
+
- Per-CID `found: false` distinguishes a nonexistent CID from a real compound PubChem simply has no data for
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
### `pubchem_get_compound_image` <sub>tool</sub>
|
|
86
|
+
|
|
87
|
+
- Single CID; `size` is `"small"` (100x100) or `"large"` (300x300, default)
|
|
88
|
+
- Returns base64-encoded PNG plus width/height
|
|
89
|
+
- Typed `cid_not_found` error when PubChem has no record for the CID
|
|
90
|
+
|
|
91
|
+
---
|
|
48
92
|
|
|
49
|
-
|
|
93
|
+
### `pubchem_get_compound_3d_structure` <sub>tool</sub>
|
|
50
94
|
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
-
|
|
54
|
-
-
|
|
55
|
-
-
|
|
56
|
-
- Optionally hydrate results with properties to avoid a follow-up details call
|
|
95
|
+
- Single CID; `format="json"` (default) returns parsed atoms (element + x/y/z) and bonds, `format="sdf"` returns the raw V2000 SDF text
|
|
96
|
+
- `maxAtoms`/`maxBonds` cap the JSON preview (default 200 each); `atomCount`/`bondCount` always report the full totals, with any capping disclosed via enrichment
|
|
97
|
+
- `includeRawSdf` bypasses the default 500-line cap on the raw SDF text
|
|
98
|
+
- Optional `includeAlternateConformerIds` lists conformer IDs beyond the default
|
|
99
|
+
- Typed `no_3d_structure` error when PubChem has no computed 3D coordinates (large molecules, mixtures, some salts)
|
|
57
100
|
|
|
58
101
|
---
|
|
59
102
|
|
|
60
|
-
### `
|
|
103
|
+
### `pubchem_get_compound_xrefs` <sub>tool</sub>
|
|
61
104
|
|
|
62
|
-
|
|
105
|
+
- Single CID; one or more `xrefTypes` — string IDs (`RegistryID`, `RN` for CAS numbers, `PatentID`) and numeric IDs (`PubMedID`, `GeneID`, `ProteinGI`, `TaxonomyID`)
|
|
106
|
+
- Paged per type: `maxPerType` up to 500 (default 50), with the same `offset` applied across every requested type
|
|
107
|
+
- Each type reports its own `totalAvailable` and `truncated` flag
|
|
108
|
+
- Empty-result notice distinguishes "this compound has none of the requested types" from a possibly-mistyped CID
|
|
63
109
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
-
|
|
69
|
-
-
|
|
70
|
-
-
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
### `pubchem_get_compound_safety` <sub>tool</sub>
|
|
113
|
+
|
|
114
|
+
- Batch of 1-25 CIDs
|
|
115
|
+
- Returns GHS signal word, pictograms, hazard statements (H-codes), and precautionary statements (P-codes), with source attribution
|
|
116
|
+
- Per-CID `status`: `ok`, `no_ghs_data` (compound exists, no deposited classification), or `cid_not_found` (no PubChem record at all) — kept distinct so a bad CID never reads as "no hazards on file"
|
|
117
|
+
- Precautionary statements carry a `decoded` flag — false for codes needing label-specific fill text or outside the decoder table; the code itself is still authoritative
|
|
71
118
|
|
|
72
119
|
---
|
|
73
120
|
|
|
74
|
-
### `pubchem_get_bioactivity`
|
|
121
|
+
### `pubchem_get_bioactivity` <sub>tool</sub>
|
|
122
|
+
|
|
123
|
+
- Single CID; filter by `outcomeFilter` (`active`/`inactive`/`all`, default `all`) and/or `targetGeneId`/`targetAccession`
|
|
124
|
+
- Caps at 100 results per page (default 20); `offset` reaches the rest
|
|
125
|
+
- Reports `totalAssays`/`activeCount`/`inactiveCount` for the whole compound, plus `filteredCount`/`returnedCount` for the current page
|
|
126
|
+
- Notices distinguish "no bioactivity data at all" from "the filter excluded everything" from "offset past the end"
|
|
127
|
+
|
|
128
|
+
---
|
|
75
129
|
|
|
76
|
-
|
|
130
|
+
### `pubchem_get_compound_interactions` <sub>tool</sub>
|
|
77
131
|
|
|
78
|
-
-
|
|
79
|
-
-
|
|
80
|
-
-
|
|
132
|
+
- Single CID; one or more `kinds` — `drug-drug` (DrugBank), `drug-food`, `target` (binding/activity from BindingDB, ChEMBL, and others); default `["drug-drug"]`
|
|
133
|
+
- `maxEntries` per kind per page (1-50, default 10); `offset` counts source records rather than returned entries, capped at 2,147,483,646
|
|
134
|
+
- Each kind pages independently — `paging[]` reports per-kind `totalRecords`/`nextOffset`/`truncated`; the top-level `nextOffset` is populated only when exactly one requested kind still has records left
|
|
135
|
+
- A kind that fails to retrieve is named in `failedKinds` without failing the kinds that succeeded
|
|
81
136
|
|
|
82
137
|
---
|
|
83
138
|
|
|
84
|
-
### `
|
|
139
|
+
### `pubchem_search_assays` <sub>tool</sub>
|
|
85
140
|
|
|
86
|
-
|
|
141
|
+
- Search by `targetType`: `genesymbol`/`proteinname` (text), `geneid` (NCBI Gene ID), `proteinaccession` (UniProt)
|
|
142
|
+
- Caps at 200 AIDs per page (default 50); `offset` pages to the total found
|
|
143
|
+
- Rejects a blank `targetQuery` and a non-numeric `geneid` query before the upstream call
|
|
144
|
+
- Reports `totalFound` across all pages and distinguishes "no match" from "offset past the end"
|
|
87
145
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
### `pubchem_get_summary` <sub>tool</sub>
|
|
149
|
+
|
|
150
|
+
- `entityType`: `assay` (AID), `gene` (NCBI Gene ID), `protein` (UniProt accession), or `taxonomy` (Tax ID); up to 10 identifiers per call
|
|
151
|
+
- Per-identifier `found` flag; populated fields depend on `entityType` (taxonomy includes an ordered `lineage`, gene includes `symbol`/`taxonomy`)
|
|
152
|
+
- Notice reports how many identifiers were not found and which ID type `entityType` expects
|
|
91
153
|
|
|
92
154
|
---
|
|
93
155
|
|
|
94
|
-
### `
|
|
156
|
+
### `pubchem://compound/{cid}` <sub>resource</sub>
|
|
157
|
+
|
|
158
|
+
- Core physicochemical properties (the same default 14-property set as `pubchem_get_compound_details`), as `application/json`
|
|
159
|
+
- Throws a typed not-found when the CID doesn't exist in PubChem
|
|
160
|
+
- Use `pubchem_get_compound_details` to select specific properties or add descriptions, synonyms, drug-likeness, and classification
|
|
161
|
+
|
|
162
|
+
---
|
|
95
163
|
|
|
96
|
-
|
|
164
|
+
### `pubchem://compound/{cid}/safety` <sub>resource</sub>
|
|
97
165
|
|
|
98
|
-
-
|
|
99
|
-
-
|
|
100
|
-
- Paged per kind: each reports its source-record total and its own `nextOffset`, and `offset` reaches the records past a page
|
|
101
|
-
- Each entry carries its originating source — coverage is richest for approved drugs
|
|
166
|
+
- GHS hazard classification as `application/json`
|
|
167
|
+
- `status` (`ok`/`no_ghs_data`/`cid_not_found`) is the only signal distinguishing a bad CID from a compound with no deposited classification — a resource read has no notice surface
|
|
102
168
|
|
|
103
169
|
---
|
|
104
170
|
|
|
105
|
-
### `
|
|
171
|
+
### `pubchem://compound/{cid}/image` <sub>resource</sub>
|
|
106
172
|
|
|
107
|
-
|
|
173
|
+
- 2D structure diagram, 300x300 PNG, returned as a base64 blob
|
|
174
|
+
- Use `pubchem_get_compound_image` for the 100x100 size option
|
|
108
175
|
|
|
109
|
-
|
|
110
|
-
- `maxAtoms`/`maxBonds` bound the atom/bond preview and `includeRawSdf` opts into a large raw SDF past the safe line cap; `atomCount`/`bondCount` always report the totals and any capping is disclosed
|
|
111
|
-
- Optionally lists alternate conformer IDs
|
|
112
|
-
- Returns a typed not-found when PubChem has no computed 3D coordinates (large molecules, mixtures, some salts)
|
|
176
|
+
---
|
|
113
177
|
|
|
114
|
-
|
|
178
|
+
### `pubchem://compound/{cid}/xrefs` <sub>resource</sub>
|
|
115
179
|
|
|
116
|
-
|
|
180
|
+
- Focused default set — `RN` (CAS), `RegistryID`, `PubMedID` — up to 25 IDs per type, as `application/json`
|
|
181
|
+
- Use `pubchem_get_compound_xrefs` for the full set of xref types, a higher per-type cap, and offset paging
|
|
117
182
|
|
|
118
|
-
|
|
119
|
-
|:-------------|:--------|
|
|
120
|
-
| `pubchem://compound/{cid}` | Core physicochemical properties (JSON). |
|
|
121
|
-
| `pubchem://compound/{cid}/safety` | GHS hazard classification (JSON). |
|
|
122
|
-
| `pubchem://compound/{cid}/image` | 2D structure diagram (PNG). |
|
|
123
|
-
| `pubchem://compound/{cid}/xrefs` | External cross-references (JSON). |
|
|
124
|
-
| `pubchem://compound/{cid}/bioactivity` | Bioassay activity profile (JSON). |
|
|
125
|
-
| `pubchem://assay/{aid}` | BioAssay summary (JSON). |
|
|
183
|
+
---
|
|
126
184
|
|
|
127
|
-
|
|
185
|
+
### `pubchem://compound/{cid}/bioactivity` <sub>resource</sub>
|
|
186
|
+
|
|
187
|
+
- Up to 25 assays as `application/json`, plus `totalAssays`/`activeCount` for the whole compound
|
|
188
|
+
- Use `pubchem_get_bioactivity` to filter by outcome or target, raise the cap, or page with offset
|
|
128
189
|
|
|
129
|
-
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
### `pubchem://assay/{aid}` <sub>resource</sub>
|
|
193
|
+
|
|
194
|
+
- BioAssay summary as `application/json` — name, description, source, protocol, substance counts
|
|
195
|
+
- Throws a typed not-found when the AID doesn't exist
|
|
130
196
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
-
|
|
134
|
-
- Swappable storage backends: `in-memory`, `filesystem`, `Supabase`, `Cloudflare KV/R2/D1`
|
|
135
|
-
- Structured logging with optional OpenTelemetry tracing
|
|
136
|
-
- Runs locally (stdio/HTTP) or containerized via Docker
|
|
197
|
+
## Features
|
|
198
|
+
|
|
199
|
+
Built on [`@cyanheads/mcp-ts-core`](https://github.com/cyanheads/mcp-ts-core): stdio and Streamable HTTP transports, pluggable auth (`none` / `jwt` / `oauth`), swappable storage (`in-memory`, `filesystem`, `Supabase`, `Cloudflare KV/R2/D1`), structured logging with optional OpenTelemetry tracing.
|
|
137
200
|
|
|
138
201
|
PubChem-specific:
|
|
139
202
|
|
|
140
|
-
-
|
|
141
|
-
-
|
|
142
|
-
-
|
|
203
|
+
- Covers both PUG REST (search, properties, cross-references, safety, bioactivity, interactions) and PUG View (textual descriptions, pharmacological classification) endpoints
|
|
204
|
+
- Rate-limited client (5 req/s) with automatic request queuing, and retry with exponential backoff on 5xx errors and network failures
|
|
205
|
+
- Hand-rolled V2000 SDF parser for 3D conformer atoms and bonds; drug-likeness (Lipinski/Veber) computed from already-fetched properties, adding no extra latency
|
|
206
|
+
- All tools are read-only and idempotent — no API keys required, PubChem's API is freely accessible
|
|
207
|
+
|
|
208
|
+
Agent-friendly output:
|
|
143
209
|
|
|
144
|
-
|
|
210
|
+
- Discriminated output contracts — per-CID `status` (`ok` / `no_ghs_data` / `cid_not_found`) and `found` flags let callers branch on data instead of matching an error string
|
|
211
|
+
- Graceful partial failure — batch tools return per-item results alongside `unresolvedIdentifiers`, `skippedCids`, and `failedKinds` rather than failing the whole call
|
|
212
|
+
- Response shaping — truncation disclosure (`truncated`, `shown`/`cap`, `nextOffset`) on every capped list, plus a `totalFoundAtLeast` floor in place of a count when an upstream search saturates
|
|
213
|
+
- Typed error reasons — validation and not-found failures declare a `reason` (e.g. `cid_not_found`, `missing_identifier_args`, `invalid_cid_query`) with actionable recovery text, not generic messages
|
|
214
|
+
|
|
215
|
+
## Getting started
|
|
145
216
|
|
|
146
217
|
### Public Hosted Instance
|
|
147
218
|
|
|
@@ -160,7 +231,7 @@ A public instance is available at `https://pubchem.caseyjhand.com/mcp` — no in
|
|
|
160
231
|
|
|
161
232
|
### Self-Hosted / Local
|
|
162
233
|
|
|
163
|
-
Add to your MCP client
|
|
234
|
+
Add the following to your MCP client configuration file.
|
|
164
235
|
|
|
165
236
|
```json
|
|
166
237
|
{
|
|
@@ -177,9 +248,48 @@ Add to your MCP client config (e.g., `claude_desktop_config.json`):
|
|
|
177
248
|
}
|
|
178
249
|
```
|
|
179
250
|
|
|
251
|
+
Or with npx (no Bun required):
|
|
252
|
+
|
|
253
|
+
```json
|
|
254
|
+
{
|
|
255
|
+
"mcpServers": {
|
|
256
|
+
"pubchem-mcp-server": {
|
|
257
|
+
"type": "stdio",
|
|
258
|
+
"command": "npx",
|
|
259
|
+
"args": ["-y", "@cyanheads/pubchem-mcp-server@latest"],
|
|
260
|
+
"env": {
|
|
261
|
+
"MCP_TRANSPORT_TYPE": "stdio"
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
Or with Docker:
|
|
269
|
+
|
|
270
|
+
```json
|
|
271
|
+
{
|
|
272
|
+
"mcpServers": {
|
|
273
|
+
"pubchem-mcp-server": {
|
|
274
|
+
"type": "stdio",
|
|
275
|
+
"command": "docker",
|
|
276
|
+
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/pubchem-mcp-server:latest"]
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
For Streamable HTTP, set the transport and start the server:
|
|
283
|
+
|
|
284
|
+
```sh
|
|
285
|
+
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
|
|
286
|
+
# Server listens at http://localhost:3010/mcp
|
|
287
|
+
```
|
|
288
|
+
|
|
180
289
|
### Prerequisites
|
|
181
290
|
|
|
182
|
-
- [Bun v1.4.0](https://bun.sh/) or higher (or Node.js v24+)
|
|
291
|
+
- [Bun v1.4.0](https://bun.sh/) or higher (or Node.js v24+).
|
|
292
|
+
- No API keys required — PubChem's API is freely accessible.
|
|
183
293
|
|
|
184
294
|
### Installation
|
|
185
295
|
|
|
@@ -189,73 +299,92 @@ Add to your MCP client config (e.g., `claude_desktop_config.json`):
|
|
|
189
299
|
git clone https://github.com/cyanheads/pubchem-mcp-server.git
|
|
190
300
|
```
|
|
191
301
|
|
|
192
|
-
|
|
302
|
+
2. **Navigate into the directory:**
|
|
193
303
|
|
|
194
304
|
```sh
|
|
195
305
|
cd pubchem-mcp-server
|
|
196
306
|
```
|
|
197
307
|
|
|
198
|
-
|
|
308
|
+
3. **Install dependencies:**
|
|
199
309
|
|
|
200
310
|
```sh
|
|
201
311
|
bun install
|
|
202
312
|
```
|
|
203
313
|
|
|
204
|
-
|
|
314
|
+
4. **Configure environment (optional):**
|
|
205
315
|
|
|
206
|
-
|
|
316
|
+
```sh
|
|
317
|
+
cp .env.example .env
|
|
318
|
+
# edit .env to override transport, session mode, storage, or logging defaults
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
## Configuration
|
|
207
322
|
|
|
208
323
|
| Variable | Description | Default |
|
|
209
324
|
|:---------|:------------|:--------|
|
|
210
325
|
| `MCP_TRANSPORT_TYPE` | Transport: `stdio` or `http`. | `stdio` |
|
|
211
|
-
| `MCP_HTTP_PORT` | Port for HTTP server. | `
|
|
212
|
-
| `
|
|
213
|
-
| `
|
|
326
|
+
| `MCP_HTTP_PORT` | Port for HTTP server. | `3010` |
|
|
327
|
+
| `MCP_HTTP_HOST` | Host for HTTP server. | `127.0.0.1` |
|
|
328
|
+
| `MCP_SESSION_MODE` | `stateless`, `stateful`, or `auto`. PubChem needs no multi-round-trip input, so the server declares `stateless`; the example and Docker set it to match. | `stateless` |
|
|
214
329
|
| `MCP_AUTH_MODE` | Auth mode: `none`, `jwt`, or `oauth`. | `none` |
|
|
215
330
|
| `MCP_LOG_LEVEL` | Log level (RFC 5424). | `info` |
|
|
216
331
|
| `STORAGE_PROVIDER_TYPE` | Storage backend. | `in-memory` |
|
|
217
332
|
| `OTEL_ENABLED` | Enable OpenTelemetry. | `false` |
|
|
218
333
|
|
|
219
|
-
|
|
334
|
+
See [`.env.example`](./.env.example) for the full list of optional overrides.
|
|
335
|
+
|
|
336
|
+
## Running the server
|
|
220
337
|
|
|
221
|
-
### Local
|
|
338
|
+
### Local development
|
|
222
339
|
|
|
223
340
|
- **Build and run:**
|
|
224
341
|
|
|
225
342
|
```sh
|
|
343
|
+
# One-time build
|
|
226
344
|
bun run rebuild
|
|
227
|
-
|
|
345
|
+
|
|
346
|
+
# Run the built server
|
|
347
|
+
bun run start:stdio
|
|
348
|
+
# or
|
|
349
|
+
bun run start:http
|
|
228
350
|
```
|
|
229
351
|
|
|
230
352
|
- **Run checks and tests:**
|
|
231
353
|
|
|
232
354
|
```sh
|
|
233
|
-
bun run devcheck
|
|
234
|
-
bun run test
|
|
355
|
+
bun run devcheck # Lint, format, typecheck, security
|
|
356
|
+
bun run test # Vitest test suite
|
|
357
|
+
bun run lint:mcp # Validate MCP definitions against spec
|
|
235
358
|
```
|
|
236
359
|
|
|
237
360
|
### Docker
|
|
238
361
|
|
|
239
362
|
```sh
|
|
240
363
|
docker build -t pubchem-mcp-server .
|
|
241
|
-
docker run -p 3010:3010 pubchem-mcp-server
|
|
364
|
+
docker run --rm -p 3010:3010 pubchem-mcp-server
|
|
242
365
|
```
|
|
243
366
|
|
|
244
|
-
|
|
367
|
+
The Dockerfile defaults to HTTP transport, stateless session mode, and logs to `/var/log/pubchem-mcp-server`. OpenTelemetry peer dependencies are installed by default — build with `--build-arg OTEL_ENABLED=false` to omit them.
|
|
368
|
+
|
|
369
|
+
## Project structure
|
|
245
370
|
|
|
246
371
|
| Directory | Purpose |
|
|
247
372
|
|:----------|:--------|
|
|
373
|
+
| `src/index.ts` | `createApp()` entry point — registers tools/resources and inits the PubChem client. |
|
|
248
374
|
| `src/mcp-server/tools/definitions/` | Tool definitions (`*.tool.ts`). |
|
|
249
|
-
| `src/
|
|
375
|
+
| `src/mcp-server/resources/definitions/` | Resource definitions (`*.resource.ts`). |
|
|
376
|
+
| `src/services/pubchem/` | PubChem API client — rate limiting, retry, and response/SDF parsing. |
|
|
250
377
|
| `scripts/` | Build, clean, devcheck, and tree generation scripts. |
|
|
378
|
+
| `tests/` | Unit and integration tests. |
|
|
251
379
|
|
|
252
|
-
## Development
|
|
380
|
+
## Development guide
|
|
253
381
|
|
|
254
382
|
See [`CLAUDE.md`](./CLAUDE.md) for development guidelines and architectural rules. The short version:
|
|
255
383
|
|
|
256
384
|
- Handlers throw, framework catches — no `try/catch` in tool logic
|
|
257
|
-
- Use `ctx.log` for
|
|
258
|
-
-
|
|
385
|
+
- Use `ctx.log` for request-scoped logging
|
|
386
|
+
- Wrap external API calls: validate the raw PubChem response → normalize to a domain type → return the output schema; never fabricate missing fields
|
|
387
|
+
- Register new tools and resources in the `index.ts` barrel files
|
|
259
388
|
|
|
260
389
|
## Contributing
|
|
261
390
|
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "mcp-ts-core ^0.9.6 → ^0.9.13: HTTP body cap, session-init gate, quieter 4xx logs, GET /mcp keywords; httpErrorFromResponse adoption; keyword additions"
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.1.21 — 2026-05-28
|
|
8
|
+
|
|
9
|
+
## Changed
|
|
10
|
+
|
|
11
|
+
- **`@cyanheads/mcp-ts-core`** `^0.9.6 → ^0.9.13` — adopted across seven patch releases:
|
|
12
|
+
- **`MCP_HTTP_MAX_BODY_BYTES`** (0.9.13) — configurable inbound body cap; oversized requests rejected with 413 before the SDK parses the body. Default 1 MiB; set to `0` to disable.
|
|
13
|
+
- **HTTP session-init gate** (0.9.10) — stateful HTTP mode now rejects non-`initialize` requests without an `Mcp-Session-Id` header with HTTP 400.
|
|
14
|
+
- **`httpErrorHandler` log-level split** (0.9.10) — 401, 403, 400, 404 responses downgraded to `warning`; stack traces removed from expected client errors.
|
|
15
|
+
- **`GET /mcp` keywords** (0.9.12) — `package.json` `keywords` now surfaced on the HTTP status endpoint alongside name/version/description.
|
|
16
|
+
- 0.9.7–0.9.9, 0.9.11 — skill refreshes, `git-wrapup` skill, fuzz pre-parse fixes, `code-simplifier` skill, `biome` lint adjustment.
|
|
17
|
+
- **`pubchem-client.ts`** — `httpStatusToErrorCode` + manual `McpError` construction replaced with `httpErrorFromResponse` (framework util that classifies by status and body). Both `fetchJson` and `fetchBinary` error paths updated; fault message passed as `data.fault` alongside `data.url`.
|
|
18
|
+
- **`package.json` keywords** — added `typescript`, `bun`, `stdio`, `streamable-http` (surfaces on `GET /mcp` endpoint via 0.9.12 framework support).
|
|
19
|
+
- **`@biomejs/biome`** `^2.4.15 → ^2.4.16`.
|
|
20
|
+
|
|
21
|
+
## Skills
|
|
22
|
+
|
|
23
|
+
- **Skills synced** from `@cyanheads/mcp-ts-core@0.9.13` — refreshed `api-canvas`, `api-config`, `design-mcp-server`, `polish-docs-meta`, `release-and-publish`, `report-issue-framework`; added `code-simplifier`, `git-wrapup`; removed `migrate-mcp-ts-template`.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Enrichment adoption: search_compounds and search_assays surface search-type/target echoes, true upstream totals, and empty-result guidance via a typed enrichment block"
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.1.22 — 2026-05-30
|
|
8
|
+
|
|
9
|
+
## Changed
|
|
10
|
+
|
|
11
|
+
- **`pubchem_search_compounds`** — `searchType` and `totalFound` moved from `output` to a typed `enrichment` block; `output` now contains only `results`. Both fields reach `structuredContent` and `content[]` automatically via `ctx.enrich()`; an empty-result `notice` is appended when no compounds match.
|
|
12
|
+
- **`pubchem_search_assays`** — `targetType`, `targetQuery`, and `totalFound` moved from `output` to `enrichment`; `output` now contains only `aids`. An empty-result `notice` is appended when no assays match, suggesting alternative `targetType` values or `pubchem_get_summary` for entity lookups.
|
|
13
|
+
- **`@cyanheads/mcp-ts-core`** `^0.9.13 → ^0.9.16` — skill refreshes, `enrichment` contract support, and associated framework patches.
|
|
14
|
+
- **Skills synced** from `@cyanheads/mcp-ts-core@0.9.16`.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Typed cid_not_found error on get_compound_image; enrichment for get_bioactivity, get_compound_safety, and get_summary"
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.1.23 — 2026-06-01
|
|
8
|
+
|
|
9
|
+
## Added
|
|
10
|
+
|
|
11
|
+
- **`pubchem_get_compound_image`** — a 404 for a missing CID now returns a typed `cid_not_found` (`NotFound`) error carrying `data.reason: 'cid_not_found'` and a recovery hint, instead of a bare not-found with a null reason. The other six CID tools surface absence as a structured success response and need no error contract. ([#17](https://github.com/cyanheads/pubchem-mcp-server/issues/17))
|
|
12
|
+
- **`pubchem_get_bioactivity`** — enrichment block with `outcomeFilter` echo, `filteredCount` (matching the filter) and `returnedCount` (after the `maxResults` cap), plus a notice distinguishing no-data from filter-excluded results. ([#19](https://github.com/cyanheads/pubchem-mcp-server/issues/19))
|
|
13
|
+
- **`pubchem_get_compound_safety`** — enrichment notice pointing to `pubchem_get_compound_details` when no GHS data is on file. ([#19](https://github.com/cyanheads/pubchem-mcp-server/issues/19))
|
|
14
|
+
- **`pubchem_get_summary`** — enrichment with `requestedCount`, `foundCount`, and a per-miss notice. ([#19](https://github.com/cyanheads/pubchem-mcp-server/issues/19))
|
|
15
|
+
|
|
16
|
+
## Changed
|
|
17
|
+
|
|
18
|
+
- **`vitest`** `^4.1.7 → ^4.1.8`.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "interactions and 3D structure tools, URI-templated resources, target filter for bioactivity, batch safety"
|
|
3
|
+
breaking: true
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.2.0 — 2026-06-01
|
|
8
|
+
|
|
9
|
+
## Added
|
|
10
|
+
|
|
11
|
+
- **`pubchem_get_compound_interactions`** — drug-drug, drug-food, and chemical-target interactions with per-entry source attribution ([#12](https://github.com/cyanheads/pubchem-mcp-server/issues/12)). Drug-drug and target interactions fetched from PubChem's SDQ external tables (`drugbankddi`, `consolidatedcompoundtarget`); drug-food interactions from PUG-View inline. `severity` is not normalized across sources — reported faithfully from source prose.
|
|
12
|
+
- **`pubchem_get_compound_3d_structure`** — 3D conformer as parsed JSON atoms/bonds (`format: 'json'`, default) or raw SDF text (`format: 'sdf'`), with optional alternate conformer IDs ([#15](https://github.com/cyanheads/pubchem-mcp-server/issues/15)). Returns `notFound` for compounds without computed 3D coordinates.
|
|
13
|
+
- **URI-templated MCP resources** — six resources backed by existing `PubChemClient` methods, no new API calls ([#14](https://github.com/cyanheads/pubchem-mcp-server/issues/14)):
|
|
14
|
+
- `pubchem://compound/{cid}` — compound properties
|
|
15
|
+
- `pubchem://compound/{cid}/safety` — GHS classification
|
|
16
|
+
- `pubchem://compound/{cid}/image` — 2D structure diagram (PNG)
|
|
17
|
+
- `pubchem://compound/{cid}/xrefs` — external database cross-references
|
|
18
|
+
- `pubchem://compound/{cid}/bioactivity` — assay activity
|
|
19
|
+
- `pubchem://assay/{aid}` — assay entity summary
|
|
20
|
+
- **`targetGeneId` / `targetAccession` filters** on `pubchem_get_bioactivity` input — pure client-side filter on existing `BioactivityRow` fields; both echoed in enrichment when set ([#9](https://github.com/cyanheads/pubchem-mcp-server/issues/9)).
|
|
21
|
+
|
|
22
|
+
## Changed
|
|
23
|
+
|
|
24
|
+
- **`pubchem_get_compound_safety` input is now `cids` (array, 1–25)** — replaces the single `cid: number` parameter; output is now `results[]` with one entry per CID ([#13](https://github.com/cyanheads/pubchem-mcp-server/issues/13)). **Breaking:** callers must update to pass an array.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "interactions target source, per-kind isolation, fetch resilience for image and 3D structure"
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.2.1 — 2026-06-02
|
|
8
|
+
|
|
9
|
+
## Fixed
|
|
10
|
+
|
|
11
|
+
- **`pubchem_get_compound_interactions` (`target` kind)** — now returns chemical–target binding and activity for the requested compound, sourced from PubChem's CID-keyed `bioactivity` collection (BindingDB, ChEMBL, and others). Previously queried a gene-indexed collection whose compound filter was silently ignored, causing every compound to return the same unrelated compound's records ([#20](https://github.com/cyanheads/pubchem-mcp-server/issues/20)).
|
|
12
|
+
- **`pubchem_get_compound_interactions` (per-kind isolation)** — a failure in one requested interaction kind no longer discards the kinds that succeeded. Successful kinds are returned and unavailable kinds are reported via a `failedKinds` notice (`Promise.allSettled` per-kind isolation) ([#21](https://github.com/cyanheads/pubchem-mcp-server/issues/21)).
|
|
13
|
+
- **`pubchem_get_compound_image` and `pubchem_get_compound_3d_structure`** — image and 3D-structure fetches now retry once on transient upstream 5xx errors and surface a clear `PubChem request timed out (30s)` message on timeout instead of a raw abort error, matching the JSON fetch path ([#16](https://github.com/cyanheads/pubchem-mcp-server/issues/16)).
|
|
14
|
+
- **SDQ-backed interaction fetches** — PubChem's occasional malformed JSON now returns a contextful error instead of an opaque `Failed to parse JSON`.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "adopt @cyanheads/mcp-ts-core 0.9.21 — per-request log context fix, secret scrubbing in fetch errors, fail-fast retries"
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.2.2 — 2026-06-02
|
|
8
|
+
|
|
9
|
+
## Changed
|
|
10
|
+
|
|
11
|
+
- **`@cyanheads/mcp-ts-core`** `^0.9.16 → ^0.9.21` — adopts three framework fixes: per-request logs and traces now carry fresh request/trace/span IDs instead of the frozen boot context (HTTP transport); `fetchWithTimeout` strips query-string secrets (e.g. `?api_key=`) from error messages and logs; `withRetry` fails fast on non-retryable errors and `ctx.fail` auto-populates the `retryable` flag.
|
|
12
|
+
- **`release:github` script** — new `scripts/release-github.ts` added to `package.json`; creates a GitHub Release from the annotated tag with correct title formatting.
|
|
13
|
+
- **`devcheck`** — adds Open-Indexed Interfaces and Skill Versions checks from framework 0.9.21 skill sync.
|
|
14
|
+
|
|
15
|
+
## Dependencies
|
|
16
|
+
|
|
17
|
+
- `@cyanheads/mcp-ts-core` `^0.9.16 → ^0.9.21`
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "adopt @cyanheads/mcp-ts-core ^0.10.6 — truncation disclosure on capped searches, explicit createApp identity, MCPB bundle-content hardening"
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.2.3 — 2026-06-12
|
|
8
|
+
|
|
9
|
+
## Added
|
|
10
|
+
|
|
11
|
+
- **Truncation disclosure** — `pubchem_search_compounds`, `pubchem_search_assays`, and `pubchem_get_bioactivity` now emit `truncated`/`shown`/`cap` via `ctx.enrich.truncated()` when results are capped at `maxResults`, so callers know more matches exist beyond what was returned.
|
|
12
|
+
- **`scripts/clean-mcpb.ts`** — post-pack bundle cleaner wired into the `bundle` script: runs `mcpb clean`, then strips dependency-shipped agent-doc entries (`skills/`, `.claude/`, `.agents/`, `SKILL.md`) nested under `node_modules/` that root-anchored `.mcpbignore` patterns cannot reach.
|
|
13
|
+
- **Dockerfile `HEALTHCHECK`** — bun-native `fetch` against `/healthz` (slim image ships no curl/wget), plus an `org.opencontainers.image.version` OCI label sourced from the `APP_VERSION` build arg.
|
|
14
|
+
|
|
15
|
+
## Changed
|
|
16
|
+
|
|
17
|
+
- **`createApp()`** — sets explicit `name` and `title` to `pubchem-mcp-server`, pinning the served identity to the repo name on every surface instead of relying on the scoped-package fallback.
|
|
18
|
+
- **`scripts/lint-packaging.ts`** — adds bundle-content and identity guards: `.mcpbignore` dev-dir exclusion and anchoring (unanchored patterns also strip `node_modules/…/skills/`), critical-runtime-path protection, a post-bundle `node_modules` agent-doc scan, and a `createApp()`/manifest `display_name` identity check against the unscoped package name.
|
|
19
|
+
- **`scripts/check-framework-antipatterns.ts`** — adds rule 4 flagging `z.coerce.boolean()` on env flags (`Boolean("false")` is `true`, so the flag can't be disabled via env — use `z.stringbool()`); comment-line matches are now skipped so JSDoc naming an antipattern no longer false-positives.
|
|
20
|
+
- **`.mcpbignore`** — root dev-dir patterns anchored with a leading `/` so they no longer match nested runtime paths under `node_modules/`.
|
|
21
|
+
|
|
22
|
+
## Dependencies
|
|
23
|
+
|
|
24
|
+
- `@cyanheads/mcp-ts-core` `^0.9.21 → ^0.10.6`
|
|
25
|
+
- `@biomejs/biome` `^2.4.16 → ^2.5.0`
|
|
26
|
+
- `@types/node` `^25.9.1 → ^25.9.3`
|
|
27
|
+
- `packageManager` `bun@1.3.2 → bun@1.3.11`
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "adopt @cyanheads/mcp-ts-core ^0.10.9 — check-dependency-specifiers devcheck step, plugin-manifest packaging lint, fresh-scaffold devcheck guards, vendored skill re-sync"
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.2.4 — 2026-06-20
|
|
8
|
+
|
|
9
|
+
## Added
|
|
10
|
+
|
|
11
|
+
- **`scripts/check-dependency-specifiers.ts`** — new devcheck step (`Dependency Specifiers`, `--no-dep-specifiers`) rejecting floating specifiers (`latest`, `*`, pre-release dist-tags) in `package.json`'s dependency sections and `bun.lock`'s `workspaces` map, catching the case where `bun update --latest` writes a literal `latest` dist-tag into the lock and lets a later `bun install` re-resolve past an intentional version hold. ([cyanheads/mcp-ts-core#246](https://github.com/cyanheads/mcp-ts-core/issues/246))
|
|
12
|
+
- **Plugin marketplace manifest checks in `scripts/lint-packaging.ts`** — check 10 validates `.claude-plugin/plugin.json`, `.codex-plugin/plugin.json`, and `.codex-plugin/mcp.json`: non-empty descriptions, display fields carry the unscoped machine name, and the `npx -y` install arg carries the full scoped package name. Gated by the new `devcheck.config.json` `packaging.pluginManifests` flag (default on). ([cyanheads/mcp-ts-core#240](https://github.com/cyanheads/mcp-ts-core/issues/240))
|
|
13
|
+
|
|
14
|
+
## Changed
|
|
15
|
+
|
|
16
|
+
- **Fresh-scaffold devcheck guards** — `scripts/build-changelog.ts`, `scripts/devcheck.ts`, and `scripts/check-framework-antipatterns.ts` skip git-dependent checks when `.git` is absent; `scripts/check-skill-versions.ts` guards against a `SKILL.md` deleted from the worktree. ([cyanheads/mcp-ts-core#237](https://github.com/cyanheads/mcp-ts-core/issues/237), [#242](https://github.com/cyanheads/mcp-ts-core/issues/242), [#243](https://github.com/cyanheads/mcp-ts-core/issues/243))
|
|
17
|
+
- **Vendored skills re-synced** to mcp-ts-core 0.10.7–0.10.9 — `metadata.version` bumps across `api-auth`, `api-errors`, `api-services`, `api-telemetry`, `field-test`, `report-issue-local`, `tool-defs-analysis`, plus body updates to `git-wrapup`, `orchestrations`, `api-context`, and others. ([cyanheads/mcp-ts-core#238](https://github.com/cyanheads/mcp-ts-core/issues/238))
|
|
18
|
+
|
|
19
|
+
## Removed
|
|
20
|
+
|
|
21
|
+
- **`skills/references/{formatting,parsing,security}.md`** — stray framework reference docs vendored in error; removed.
|
|
22
|
+
|
|
23
|
+
## Dependencies
|
|
24
|
+
|
|
25
|
+
- `@cyanheads/mcp-ts-core` `^0.10.6 → ^0.10.9`
|
|
26
|
+
- `@types/node` `^25.9.3 → ^26.0.0`
|
|
27
|
+
- `vitest` `^4.1.8 → ^4.1.9`
|