encode-toolkit 0.3.2__tar.gz → 0.3.4__tar.gz

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 (37) hide show
  1. encode_toolkit-0.3.4/CHANGELOG.md +329 -0
  2. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/CITATION.cff +1 -1
  3. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/PKG-INFO +9 -9
  4. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/README.md +8 -8
  5. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/pyproject.toml +1 -1
  6. encode_toolkit-0.3.4/src/encode_connector/__init__.py +9 -0
  7. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/src/encode_connector/client/constants.py +55 -4
  8. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/src/encode_connector/client/encode_client.py +66 -34
  9. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/src/encode_connector/client/models.py +27 -5
  10. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/src/encode_connector/client/tracker.py +48 -10
  11. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/src/encode_connector/server/main.py +39 -11
  12. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/tests/test_client.py +252 -0
  13. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/tests/test_models.py +40 -0
  14. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/tests/test_packaging.py +9 -0
  15. encode_toolkit-0.3.4/tests/test_skill_scripts.py +690 -0
  16. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/tests/test_tool_responses.py +175 -0
  17. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/tests/test_tracker.py +113 -0
  18. encode_toolkit-0.3.2/CHANGELOG.md +0 -85
  19. encode_toolkit-0.3.2/src/encode_connector/__init__.py +0 -4
  20. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/.gitignore +0 -0
  21. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/LICENSE +0 -0
  22. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/PRIVACY.md +0 -0
  23. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/SECURITY.md +0 -0
  24. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/conftest.py +0 -0
  25. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/src/encode_connector/__main__.py +0 -0
  26. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/src/encode_connector/client/__init__.py +0 -0
  27. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/src/encode_connector/client/auth.py +0 -0
  28. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/src/encode_connector/client/downloader.py +0 -0
  29. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/src/encode_connector/client/validation.py +0 -0
  30. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/src/encode_connector/server/__init__.py +0 -0
  31. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/src/encode_connector/server/__main__.py +0 -0
  32. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/tests/__init__.py +0 -0
  33. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/tests/test_auth.py +0 -0
  34. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/tests/test_bioinformatics_audit.py +0 -0
  35. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/tests/test_downloader.py +0 -0
  36. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/tests/test_server.py +0 -0
  37. {encode_toolkit-0.3.2 → encode_toolkit-0.3.4}/tests/test_validation.py +0 -0
@@ -0,0 +1,329 @@
1
+ # Changelog
2
+
3
+ All notable changes to the ENCODE Toolkit will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.3.4] - 2026-09-20
9
+
10
+ Bug-fix release for the MCP server, with the pipeline skills, their images and conda environments, the validation scripts and all documentation checked against the code.
11
+
12
+ ### Fixed
13
+
14
+ - **`encode_track_experiment` failed for every experiment.** The tool passed the experiment's
15
+ assemblies to the tracker as a list, which SQLite cannot store, so tracking stopped with
16
+ `Error binding parameter 13: type 'list' is not supported`. The tests did not see it because
17
+ they mocked the tracker. Assemblies are now stored as joined text, two experiments count as
18
+ compatible when they share an assembly, and a test runs the tool against a real tracker.
19
+ - **Search results lost half their fields.** `encode_search_experiments` asked the API for
20
+ `frame=object`, which returns linked objects as paths, so every hit had an empty organism,
21
+ organ and assembly list, and targets and labs came back as slugs (`H3K4me1-human`,
22
+ `bradley-bernstein`) that the tool's own `target` and `lab` filters do not accept. The search
23
+ now names the fields it needs. Checked against a live ENCODE response.
24
+ - **Publications without a PMID overwrote each other.** ENCODE lists some papers by PMCID only;
25
+ they collided on the `(experiment, pmid)` key, so one survived while the count reported all of
26
+ them. They are now kept apart, and storing them again does not duplicate them (including a
27
+ row that an older version stored with an empty PMID).
28
+ - **`encode_search_files` with an organism ignored `offset`** and reported the number of files
29
+ it had collected as the total, so every page was the first page and `has_more` was false.
30
+ `encode_batch_download` always took that path. Pages now advance and `total` is a lower bound
31
+ that exceeds the page when more files exist. The search also stopped after the first 200
32
+ experiments, and after the first 200 files of each experiment, so later files were never
33
+ found; it now reads further pages of both until the requested page is full (at most 1,000
34
+ experiments, and it says so when it stops there, also in `encode_batch_download`'s replies).
35
+ - A negative `offset` in `encode_search_experiments` and `encode_search_files` is treated as 0,
36
+ in the request, in the reported `offset` and in `has_more` / `next_offset`, instead of hiding
37
+ or repeating pages.
38
+ - **`encode_get_experiment` always reported zero audit flags.** It asked ENCODE for
39
+ `frame=embedded`, which leaves out the `audit` property, so every experiment looked free of
40
+ errors and warnings (the search tool was not affected). It now asks for `frame=page`. Checked
41
+ against the portal: ENCSR133RZO has 8 warnings and 2 internal-action flags, not 0.
42
+ - BibTeX export joined author names with commas, which BibTeX reads as a single author; they
43
+ are joined with `and`.
44
+ - **`encode_list_tracked` and `encode_export_data` ignored a filter that matched nothing** and
45
+ returned every tracked experiment. They now return none.
46
+ - `encode_batch_download` reported `next_offset` but had no `offset` parameter to continue with;
47
+ it has one now.
48
+ - The description of `encode_get_experiment` promised quality metrics. It returns audit counts,
49
+ replicate counts and possible controls, and now says so.
50
+ - The value lists behind `encode_get_metadata` named three values ENCODE does not have (file
51
+ format `dat`, output type `stable peaks`, output category `quality metric`) and lacked eleven
52
+ file formats (among them `h5ad`) and eight assemblies. File formats, assemblies and output
53
+ categories now match ENCODE's file schema, and the output types include the single-cell
54
+ sparse gene count matrices.
55
+ - `encode_connector.__version__` was a hard-coded `0.2.1`; it now reports the installed version.
56
+ - **Four pipelines failed at their last step.** MultiQC names its report after `--title`, so
57
+ CUT&RUN, DNase-seq, Hi-C and WGBS never produced the `multiqc_report.html` they declare. They
58
+ now pass `--filename multiqc_report` (checked against MultiQC 1.21).
59
+ - **WGBS**: `MethylDackel extract` was given `--maxDepth`, which 0.6.1 does not accept, so
60
+ extraction could not start. The `--nOT/--nOB` values excluded the 3' ends of reads rather than
61
+ the end-repair bias they were documented to remove (Trim Galore's `--clip_R2 10` already does
62
+ that), so they are gone. The M-bias report captured stdout while MethylDackel prints its
63
+ suggested bounds on stderr. The final sorted BAM was never published. `--min_coverage` now
64
+ filters the bedMethyl files only, so the coverage statistics describe every covered CpG.
65
+ - **RNA-seq**: plus- and minus-strand signal tracks were swapped for reverse-stranded (dUTP)
66
+ libraries, the default. Track naming now follows `--strandedness` the way ENCODE's
67
+ `STAR_RSEM.sh` does, and unstranded libraries get a single track. `--strandedness` is
68
+ validated. The kallisto index and the RSeQC gene model were hard-wired to file names in the
69
+ launch directory; they are now `--kallisto_index` and `--rseqc_bed`.
70
+ - **DNase-seq**: insert sizes used Picard `CollectInsertSizeMetrics`, which needs R for its
71
+ mandatory histogram and the image has none. It now uses `samtools stats`.
72
+ - **ChIP-seq**: `--chrom_sizes` is required up front instead of failing on a missing
73
+ `chrom.sizes` file, the BWA index directory is a parameter (`--bwa_index`), and duplication
74
+ metrics are published (the `publishDir` pattern never matched the file name).
75
+ - **ATAC-seq**: the Bowtie2 index directory is a parameter (`--bowtie2_index`), the
76
+ mitochondrial statistics are published, and two parameters that nothing read are removed.
77
+ - **CUT&RUN** publishes the fragment BED and the spike-in counts. **Hi-C** publishes the
78
+ pairtools parse statistics and passes the normalization to HiCCUPS explicitly.
79
+ - **Cloud profiles**: every pipeline takes `--gcp_project`/`--gcp_workdir` and
80
+ `--aws_queue`/`--aws_workdir`, and stops with a clear message when `-profile gcp` or `aws` is
81
+ used without them. All seven configs now come from one template, so resource limits, SLURM
82
+ queue/account and report settings no longer differ between pipelines.
83
+ - `install-nextflow.sh` accepted any Nextflow already on the PATH, which skipped both the pinned
84
+ version and the checksum. It now accepts only the pinned release.
85
+ - Trimmed-read FastQC reports are kept and passed to MultiQC in every pipeline that trims.
86
+ - Conda environments: `idr` added to ATAC-seq, `picard` added to DNase-seq, BWA 0.7.18.
87
+
88
+ - **The four validation scripts that ship in the aggregation skills had no tests and several
89
+ bugs.** `validate_methylation.py` rescaled every methylation value at or below 1 by 100, so in
90
+ an ENCODE bedMethyl (percentages) a CpG at 1% was reported as 100% methylated and every real
91
+ file triggered a "mixed formats" warning; the scale is now decided once per file (`--scale`).
92
+ Reversed intervals entered the statistics in the histone and Hi-C scripts, 9- and 10-column
93
+ bedMethyl files were read with the wrong columns, percentages were taken over malformed lines
94
+ too, gzipped inputs crashed, and an empty file passed. All fixed, with 37 tests that run the
95
+ scripts on synthetic files. The skills now say how to run them.
96
+
97
+ ### Changed
98
+
99
+ - **One version of every tool.** The ChIP-seq, ATAC-seq and RNA-seq images move to the versions
100
+ the other four images and all seven conda environments already pinned: samtools 1.19, Picard
101
+ 3.1.1 (Java 17), MultiQC 1.21, cutadapt 4.6, Trim Galore 0.6.10, FastQC 0.12.1, STAR 2.7.11b,
102
+ kallisto 0.50.1, RSeQC 5.0.3. Bowtie2 is 2.5.4 in every image. A kallisto index has to be
103
+ built with 0.50.1; older index files are rejected.
104
+ - **FRiP is computed** by the ChIP-seq, ATAC-seq and CUT&RUN workflows
105
+ (`qc/<sample>.frip_mqc.tsv`, shown as a table in MultiQC).
106
+ - **IDR compares every pair of replicates** instead of only the first two. Outputs are named
107
+ `peaks/idr/<sampleA>_vs_<sampleB>.idr_peaks.txt`.
108
+ - **Hi-C honours `--resolutions`**: the cooler base bin is the smallest requested resolution,
109
+ and the new `--hiccups_resolutions` selects the loop-calling resolutions. Both lists are
110
+ validated before anything runs (positive integers with no empty fields, multiples of the
111
+ smallest), and HiCCUPS
112
+ gets one peak width, window width and merge radius per resolution (juicer_tools exits when
113
+ the `-d` list has a different length).
114
+ - The conda environments pin every tool with `==` (a single `=` is a prefix match in conda) and
115
+ add cutadapt 4.6 and OpenJDK 17, as in the images; they resolved to cutadapt 5.2, samtools
116
+ 1.19.2 and Java 22 before. Every pin now resolves as written. cutadapt 4.6 has no
117
+ Python 3.11 build, so all seven environments use Python 3.10. The Hi-C and WGBS images
118
+ install `openjdk-17-jre-headless` like the other five instead of Ubuntu's `default-jre`
119
+ (Java 11), and the image smoke tests assert Java 17.
120
+ - ATAC-seq publishes `samtools idxstats` (which MultiQC reads) in place of a text line that
121
+ needed `bc` and failed on genomes without the mitochondrial contig.
122
+ - WGBS coverage statistics also report the run's `--min_coverage`; deduplication reports reach
123
+ MultiQC. RNA-seq publishes the unique-mapper signal bedGraphs and kallisto's HDF5 output.
124
+ - In WGBS, Hi-C, DNase-seq and CUT&RUN every process asks for more memory on a retry.
125
+
126
+ ### Documentation
127
+
128
+ - Every pipeline skill was reconciled with its workflow: parameters, example commands, output
129
+ layouts, step lists and QC tables now describe what the workflow does. Analyses it does not
130
+ run (for example FRiP, NSC/RSC, TSS enrichment, TAD and compartment calling, bisulfite
131
+ conversion rate) are labelled as manual steps instead of being listed as outputs.
132
+ - `encode_*` tool calls in 40 skills used 135 parameter names the server does not have (for
133
+ example `encode_list_files(accession=...)` instead of `experiment_accession=`). All are
134
+ corrected.
135
+ - Reference commands were checked against the pinned tool versions (Hotspot2, MethylDackel,
136
+ SEACR, Juicer tools, pairtools, RGT, MPRAflow) and corrected.
137
+ - **`docs/`, the README, `agents/` and `commands/` were never checked against the code.** The
138
+ API reference, showcase, walkthrough and vignettes showed invented response shapes (facets as
139
+ `key`/`doc_count`, a nested `audit` object, `href`, `files_found`, wrong compatibility verdicts);
140
+ all are corrected to what the server returns, and the API reference documents all 20 tools
141
+ instead of 16. The seven pipeline agents described steps the workflows do not run (Arrowhead
142
+ TAD calling, a WGBS conversion-rate stage, RNA-SeQC, Trimmomatic) and flags they do not use.
143
+ The doc checker now covers all of these folders, and CI also compares `agents/` and
144
+ `commands/` with their copies under `plugin/`.
145
+ - The pipeline vignettes and the pipeline-execution walkthrough told users to run
146
+ `nextflow run ENCODE-DCC/chip-seq-pipeline2` (the official ENCODE pipelines are WDL, not
147
+ Nextflow), to pull images that were never verified, and to pass options that no longer exist
148
+ (`--motif_db`, `--restriction_site`, `--gtf`, `--lambda_genome`, `--single_end`). They now
149
+ build the image from the skill's Dockerfile and run the toolkit's own workflows with real
150
+ parameters, outputs and versions; DNase-seq is documented as paired-end only, and WGBS
151
+ conversion rate as a manual check.
152
+ - Examples used values ENCODE does not have: the assay title `RNA-seq` (it is `total RNA-seq`,
153
+ `polyA plus RNA-seq`, ...), and the output types `chromatin interactions` (it is `loops`) and
154
+ `filtered feature barcode matrix`. Four `encode_link_reference` calls omitted the experiment.
155
+ The WGBS CpG-coverage one-liner piped BAM output into `awk`; it uses `bedtools coverage` now.
156
+
157
+ ### CI
158
+
159
+ - The seven `nextflow.config` files are generated by `.github/scripts/gen-pipeline-configs.py`, and CI fails
160
+ when a config differs from what the generator writes.
161
+ - `check-tool-versions.py` fails the build when a pipeline image and its conda environment pin
162
+ different versions of the same tool, when the image pins a package the environment does not,
163
+ or when both install a tool the environment leaves unpinned. It compares Java too and rejects
164
+ an unversioned `default-jre`. Dockerfile comments do not count as evidence, and the few
165
+ deliberate exceptions (packages from the Ubuntu base) are printed.
166
+ - `check-skill-docs.py` fails the build when a skill shows a tool call the server would reject
167
+ or a `nextflow run` example with a parameter or profile the pipeline does not declare, and
168
+ when an example output uses a field the server never emits (model fields, dict keys and
169
+ SQLite columns, read from the source with `ast`). It also rejects a call that omits a required
170
+ argument, and filter values ENCODE does not use (`assay_title="RNA-seq"`), in calls to the
171
+ tools that query the portal and in example outputs (single values, lists and facet terms).
172
+ Example outputs are checked against the fields that the documented tool itself can return,
173
+ followed through the code it calls, its models and the SQL rows it reads, not against one
174
+ list for the whole server.
175
+ - Image smoke tests start FastQC and Trim Galore; the preview suite covers the new parameters
176
+ and the cloud-profile checks.
177
+
178
+ ## [0.3.3] - 2026-09-20
179
+
180
+ Pipeline skills release. The Python package (MCP server) is functionally identical to 0.3.2.
181
+
182
+ ### Fixed
183
+
184
+ - **All seven Nextflow pipelines now run on current Nextflow (validated on 26.04.6).** The
185
+ workflows mixed top-level statements with process definitions and four configs defined a
186
+ function, both of which the strict parser rejects. Validation and channel setup moved into the
187
+ `workflow` block, and `check_max` was replaced by `process.resourceLimits`.
188
+ - **ChIP-seq**: the workflow called each process twice (samples, then controls), which Nextflow
189
+ does not allow, so it could not start. Controls now go through the same calls and are split
190
+ off before peak calling, where they are pooled. `--control` is optional. Signal tracks now
191
+ receive the sample ID they were missing.
192
+ - **CUT&RUN**: SEACR was given the control BAM instead of a control bedGraph; spike-in scale
193
+ factors were computed but never applied to the signal track; `--seacr_mode` was ignored;
194
+ MACS2 peak calling always failed on a no-op `mv`; fragments were extracted from a
195
+ coordinate-sorted BAM, which drops most read pairs; `--control` and chromosome sizes were
196
+ not staged into tasks.
197
+ - **DNase-seq**: Hotspot2 was called with options it does not have and without its mandatory
198
+ center-sites file; the image pinned a Hotspot2 tag that does not exist and lacked `modwt`
199
+ and `bc`. Footprinting could pair a BAM with another sample's peaks. `--hotspot_index` is
200
+ replaced by `--hotspot_center_sites` and `--hotspot_mappable`.
201
+ HINT footprinting needs an RGT data directory that the container's unprivileged user could
202
+ never find; it is now an explicit input, `--rgt_data`, checked before the run starts.
203
+ - **WGBS**: the bedMethyl conversion divided by zero on MethylDackel's header line, so
204
+ extraction always failed; only CpG was converted although CHG and CHH were promised;
205
+ `--no_overlap` toggled `--mergeContext`, which is unrelated to mate overlap (renamed
206
+ `--merge_context`). bedMethyl score and strand now follow the ENCODE format.
207
+ - **RNA-seq**: the RSEM reference is a file prefix but was required to be a directory.
208
+ - **ATAC-seq**: the BAM index was not passed to the Tn5 shift step, which `alignmentSieve`
209
+ requires; the mitochondrial fraction used `bc`, which the image lacked, and silently wrote an
210
+ empty value; duplication metrics were never published. The workflow now states that it needs
211
+ paired-end reads instead of filtering every single-end read away.
212
+ - **Hi-C**: `pairtools sort` was given a temporary directory that was never created. HiCCUPS
213
+ now runs its CPU mode by default, because the image has no CUDA runtime (`--hiccups_gpu`).
214
+ - **IDR** (ChIP-seq, ATAC-seq) picked two peak files in arbitrary order and crashed with a
215
+ single replicate. The pair is now sorted, and IDR is skipped below two replicates.
216
+ - **Pipeline images had never been built.** Beyond missing `build-essential`, `unzip`, `bc`, and
217
+ Boost: `idr`, `trim-galore`, and `phantompeakqualtools` are not PyPI packages; `deeptools
218
+ 3.5.4` was never published; BWA 0.7.17 does not link with current GCC (now 0.7.18); Picard 3
219
+ needs Java 17; MethylDackel needs libBigWig; SEACR could not find its R script through a
220
+ symlink; RGT 0.13.2 and pairtools 1.0.3 no longer install (now 1.0.2 and 1.1.2). Index
221
+ prefixes are resolved from staged files, so cloud executors work.
222
+ - **Conda environment files** pinned packages that do not exist (`hotspot2`, `hint`, `f-seq2`)
223
+ or cannot be installed together. All seven now solve, and the Anaconda `defaults` channel is
224
+ no longer used.
225
+ - Pipelines referenced container images that do not exist. Each config now uses an image built
226
+ from the skill's own Dockerfile, with a fixed tag and a `--container` override.
227
+ - `gcp` profiles used the retired `google-lifesciences` executor; they now use `google-batch`.
228
+ - QC references: `samtools view` needs `-L` for a BED file; the WGBS coverage one-liner never
229
+ counted bases at 5x or more.
230
+
231
+ ### Changed
232
+
233
+ - **Removed parameters that had no effect**: `--aligner` and `--lambda_genome` (WGBS),
234
+ `--motif_db` (DNase-seq), `--restriction_site` (Hi-C), `--gtf` (RNA-seq). The skills now
235
+ describe what the workflows actually do.
236
+ - `install-nextflow.sh` installs a pinned Nextflow release and verifies its SHA-256 before use,
237
+ instead of piping a remote script into a shell. It no longer fails when the install
238
+ directory is not on the `PATH`.
239
+ - `install-python-packages.sh` installs against `constraints.txt`, a lock file with exact
240
+ versions for Python 3.10+, generated from `requirements.in`.
241
+ - The pipeline guide now separates the official ENCODE WDL pipelines from this toolkit's own
242
+ Nextflow implementations, and no longer cites repositories or images that do not exist.
243
+ Pipeline images are no longer labelled as maintained by the ENCODE DCC.
244
+
245
+ ### Added
246
+
247
+ - `Pipelines` CI workflow: `nextflow lint`, `nextflow run -preview` across parameter
248
+ combinations, profile resolution, a Docker build of every pipeline image with checks that
249
+ the tools each workflow calls are present and actually start, a dry-run solve of every conda
250
+ environment, shellcheck, and a `skills/` vs `plugin/skills/` identity check.
251
+
252
+ ## [0.3.2] - 2026-09-20
253
+
254
+ Maintenance release. The Python package is functionally identical to 0.3.1.
255
+
256
+ ### Fixed
257
+
258
+ - `bioinformatics-installer` skill: the ChIP-seq walkthrough pointed at `scripts/chipseq-env.yml`
259
+ (the file lives in `environments/`) and at an `annotation-env.yml` that did not exist. The first
260
+ path is corrected and the second is replaced with an explicit `conda create` command.
261
+
262
+ ### Changed
263
+
264
+ - Removed local tooling configuration files from the repository and ignored them going forward.
265
+ - `CONTRIBUTING.md` and `docs/SHOWCASE.md` now use the ENCODE Toolkit name and the current skill
266
+ count (47).
267
+
268
+ ## [0.3.1] - 2026-09-20
269
+
270
+ ### Fixed
271
+
272
+ - **Server failed to start on fresh installs.** The `mcp` dependency had no upper bound, so new
273
+ environments resolved `mcp` 2.x, which removed `mcp.server.fastmcp`. Startup then crashed with
274
+ `ModuleNotFoundError: No module named 'mcp.server.fastmcp'`. The dependency is now capped at
275
+ `mcp[cli]>=1.0,<2`. Existing installs that already had `mcp` 1.x were not affected.
276
+
277
+ If you hit this error, uv may have cached the broken environment. Refresh it once with
278
+ `uvx --refresh encode-toolkit` (or `uv cache clean encode-toolkit`); pip users can run
279
+ `pip install --upgrade encode-toolkit`.
280
+
281
+ ### Security
282
+
283
+ - The ChIP-seq, ATAC-seq, and RNA-seq pipeline Dockerfiles now download the UCSC
284
+ `bedGraphToBigWig` executable over HTTPS instead of plain HTTP.
285
+
286
+ ### Changed
287
+
288
+ - The source distribution now contains only the Python package, tests, and project documents.
289
+ It previously bundled the whole repository, including editor configuration and a duplicate
290
+ copy of the plugin tree (1.6 MB down to 118 KB). The wheel is unchanged.
291
+ - Updated dead GREAT links in the `peak-annotation` and `multi-omics-integration` skills.
292
+
293
+ ### Added
294
+
295
+ - Packaging regression test that fails if the `mcp` dependency loses its upper bound.
296
+
297
+ ## [0.3.0-beta.1] - 2026-03-08
298
+
299
+ Initial public beta release.
300
+
301
+ ### Features
302
+
303
+ - **20 MCP tools** for searching, downloading, and tracking ENCODE data
304
+ - Search experiments and files with comprehensive filters and pagination
305
+ - Download files with MD5 verification, concurrent downloads, and directory organization
306
+ - Local experiment tracking with SQLite (publications, pipelines, quality metrics)
307
+ - Cross-reference with PubMed, bioRxiv, ClinicalTrials.gov, GEO
308
+ - Citation export (BibTeX, RIS) for reference managers
309
+ - Data provenance chain for derived files
310
+ - Batch download with dry-run preview
311
+
312
+ - **47 skills** across 10 categories
313
+ - Core: setup, search, download, track, cross-reference
314
+ - Analysis: quality assessment, integrative analysis, regulatory elements, epigenome profiling, compare biosamples, visualization, motif analysis, peak annotation, batch analysis
315
+ - Functional genomics: CRISPR/MPRA/STARR-seq screen analysis
316
+ - Data aggregation: histone, accessibility, Hi-C, methylation
317
+ - External databases: UCSC, GEO, gnomAD, Ensembl, GTEx, ClinVar, CELLxGENE, GWAS Catalog, JASPAR
318
+ - Workflows: provenance, citations, variant annotation, pipelines, single-cell, disease research, publication trust, bioinformatics installer, scientific writing, liftover coordinates
319
+ - Pipeline execution: ChIP-seq, ATAC-seq, RNA-seq, WGBS, Hi-C, DNase-seq, CUT&RUN (Nextflow + Docker)
320
+ - Meta-analysis: scRNA-seq meta-analysis, multi-omics integration
321
+
322
+ - **Async ENCODE API client** with retry logic, 1-hour TTL cache, and rate limiting
323
+ - **OS keyring credential management** with Fernet-encrypted file fallback
324
+ - **Thread-safe SQLite tracker** with full transaction safety
325
+ - **Streaming downloads** with 64KB chunks and SSRF-safe redirect validation
326
+ - **568 tests** with 98% code coverage
327
+ - **34 literature reference documents** (~320 papers cataloged with DOI, PMID, key findings)
328
+ - **9 scientist-facing vignettes** with real ENCODE API output
329
+ - **GitHub Actions CI/CD** (pytest across Python 3.10–3.13, ruff lint, plugin validation)
@@ -8,7 +8,7 @@ authors:
8
8
  given-names: Alex M.
9
9
  orcid: "https://orcid.org/0000-0003-0907-464X"
10
10
  affiliation: "Independent Researcher"
11
- version: 0.3.2
11
+ version: 0.3.4
12
12
  date-released: "2026-09-20"
13
13
  license: AGPL-3.0-only
14
14
  repository-code: "https://github.com/ammawla/encode-toolkit"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: encode-toolkit
3
- Version: 0.3.2
3
+ Version: 0.3.4
4
4
  Summary: MCP server for querying and downloading ENCODE Project genomics data directly from Claude
5
5
  Project-URL: Homepage, https://github.com/ammawla/encode-toolkit
6
6
  Project-URL: Repository, https://github.com/ammawla/encode-toolkit
@@ -37,7 +37,7 @@ Description-Content-Type: text/markdown
37
37
 
38
38
  [![License: AGPL-3.0](https://img.shields.io/badge/license-AGPL--3.0-green.svg)](LICENSE)
39
39
  [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
40
- [![Version](https://img.shields.io/badge/version-0.3.2-green)](CHANGELOG.md)
40
+ [![Version](https://img.shields.io/badge/version-0.3.4-green)](CHANGELOG.md)
41
41
  [![Status](https://img.shields.io/badge/status-beta-yellow)]()
42
42
  [![Skills](https://img.shields.io/badge/skills-47-orange)](docs/skill-vignettes/)
43
43
  [![Tools](https://img.shields.io/badge/MCP_tools-20-purple)](src/encode_connector/server/main.py)
@@ -331,7 +331,7 @@ Search ENCODE experiments with 20+ filters.
331
331
 
332
332
  | Parameter | Type | Description |
333
333
  |-----------|------|-------------|
334
- | `assay_title` | string | Assay type: "Histone ChIP-seq", "ATAC-seq", "RNA-seq", "Hi-C", etc. |
334
+ | `assay_title` | string | Assay type: "Histone ChIP-seq", "ATAC-seq", "total RNA-seq", "Hi-C", etc. |
335
335
  | `organism` | string | Species (default: "Homo sapiens") |
336
336
  | `organ` | string | Organ: "pancreas", "brain", "liver", "heart", "kidney", etc. |
337
337
  | `biosample_type` | string | "tissue", "cell line", "primary cell", "organoid" |
@@ -496,7 +496,7 @@ Get grouped statistics of your tracked experiment collection.
496
496
  </details>
497
497
 
498
498
  <details>
499
- <summary><strong>Provenance and export tools (4)</strong></summary>
499
+ <summary><strong>Provenance and export tools (5)</strong></summary>
500
500
 
501
501
  ### `encode_log_derived_file`
502
502
 
@@ -624,7 +624,7 @@ When installed as a Claude Code plugin, ENCODE Toolkit includes 47 literature-ba
624
624
  </details>
625
625
 
626
626
  <details>
627
- <summary><strong>Workflow skills (7)</strong></summary>
627
+ <summary><strong>Workflow skills (10)</strong></summary>
628
628
 
629
629
  | Skill | Description |
630
630
  |-------|-------------|
@@ -681,7 +681,7 @@ Each pipeline includes a SKILL.md overview, 5-stage reference files (preprocessi
681
681
  | File | Description |
682
682
  |-------|-------------|
683
683
  | `skills/histone-aggregation/references/histone-marks-reference.md` | Comprehensive chromatin biology catalog (1,442 lines) — 21 histone marks with writers/erasers/readers, 5 novel acylation marks, ChromHMM state models (5 to 51 states), TF co-binding patterns, chromatin remodeling complexes, DNA methylation-chromatin interplay, nucleosome dynamics, 3D genome organization, chromatin in disease. 74 primary references |
684
- | `skills/*/references/literature.md` | 33 per-skill literature reference documents — ~250 papers cataloged with DOI, PMID, citation counts, and skill-relevant key findings |
684
+ | `skills/*/references/literature.md` | 47 per-skill literature reference documents — about 240 papers cataloged with DOI, PMID, citation counts, and skill-relevant key findings |
685
685
 
686
686
  </details>
687
687
 
@@ -710,12 +710,12 @@ Most genomics tools give you one thing. ENCODE Toolkit gives you the full resear
710
710
  | Category | Assays |
711
711
  |----------|--------|
712
712
  | **Histone/Chromatin** | Histone ChIP-seq, TF ChIP-seq, ATAC-seq, DNase-seq, CUT&RUN, CUT&Tag, MNase-seq |
713
- | **Transcription** | RNA-seq, total RNA-seq, small RNA-seq, long read RNA-seq, CAGE, RAMPAGE, PRO-seq, GRO-seq |
713
+ | **Transcription** | total RNA-seq, polyA plus RNA-seq, small RNA-seq, long read RNA-seq, CAGE, RAMPAGE, PRO-seq, GRO-seq |
714
714
  | **3D Genome** | Hi-C, intact Hi-C, Micro-C, ChIA-PET, HiChIP, PLAC-seq, 5C |
715
715
  | **DNA Methylation** | WGBS, RRBS, MeDIP-seq, MRE-seq |
716
716
  | **Functional** | STARR-seq, MPRA, CRISPR screen, eCLIP, iCLIP |
717
- | **Single Cell** | scRNA-seq, snATAC-seq, 10x multiome, SHARE-seq, Parse SPLiT-seq |
718
- | **Perturbation** | CRISPRi + RNA-seq, shRNA + RNA-seq, siRNA + RNA-seq |
717
+ | **Single Cell** | scRNA-seq, snATAC-seq, snRNA-seq, long read scRNA-seq |
718
+ | **Perturbation** | CRISPRi RNA-seq, shRNA RNA-seq, siRNA RNA-seq, CRISPR RNA-seq |
719
719
 
720
720
  **Supported file formats**: `fastq` `bam` `bed` `bigWig` `bigBed` `tsv` `csv` `hic` `tagAlign` `bedpe` `pairs` `fasta` `vcf` `tar`
721
721
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  [![License: AGPL-3.0](https://img.shields.io/badge/license-AGPL--3.0-green.svg)](LICENSE)
6
6
  [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
7
- [![Version](https://img.shields.io/badge/version-0.3.2-green)](CHANGELOG.md)
7
+ [![Version](https://img.shields.io/badge/version-0.3.4-green)](CHANGELOG.md)
8
8
  [![Status](https://img.shields.io/badge/status-beta-yellow)]()
9
9
  [![Skills](https://img.shields.io/badge/skills-47-orange)](docs/skill-vignettes/)
10
10
  [![Tools](https://img.shields.io/badge/MCP_tools-20-purple)](src/encode_connector/server/main.py)
@@ -298,7 +298,7 @@ Search ENCODE experiments with 20+ filters.
298
298
 
299
299
  | Parameter | Type | Description |
300
300
  |-----------|------|-------------|
301
- | `assay_title` | string | Assay type: "Histone ChIP-seq", "ATAC-seq", "RNA-seq", "Hi-C", etc. |
301
+ | `assay_title` | string | Assay type: "Histone ChIP-seq", "ATAC-seq", "total RNA-seq", "Hi-C", etc. |
302
302
  | `organism` | string | Species (default: "Homo sapiens") |
303
303
  | `organ` | string | Organ: "pancreas", "brain", "liver", "heart", "kidney", etc. |
304
304
  | `biosample_type` | string | "tissue", "cell line", "primary cell", "organoid" |
@@ -463,7 +463,7 @@ Get grouped statistics of your tracked experiment collection.
463
463
  </details>
464
464
 
465
465
  <details>
466
- <summary><strong>Provenance and export tools (4)</strong></summary>
466
+ <summary><strong>Provenance and export tools (5)</strong></summary>
467
467
 
468
468
  ### `encode_log_derived_file`
469
469
 
@@ -591,7 +591,7 @@ When installed as a Claude Code plugin, ENCODE Toolkit includes 47 literature-ba
591
591
  </details>
592
592
 
593
593
  <details>
594
- <summary><strong>Workflow skills (7)</strong></summary>
594
+ <summary><strong>Workflow skills (10)</strong></summary>
595
595
 
596
596
  | Skill | Description |
597
597
  |-------|-------------|
@@ -648,7 +648,7 @@ Each pipeline includes a SKILL.md overview, 5-stage reference files (preprocessi
648
648
  | File | Description |
649
649
  |-------|-------------|
650
650
  | `skills/histone-aggregation/references/histone-marks-reference.md` | Comprehensive chromatin biology catalog (1,442 lines) — 21 histone marks with writers/erasers/readers, 5 novel acylation marks, ChromHMM state models (5 to 51 states), TF co-binding patterns, chromatin remodeling complexes, DNA methylation-chromatin interplay, nucleosome dynamics, 3D genome organization, chromatin in disease. 74 primary references |
651
- | `skills/*/references/literature.md` | 33 per-skill literature reference documents — ~250 papers cataloged with DOI, PMID, citation counts, and skill-relevant key findings |
651
+ | `skills/*/references/literature.md` | 47 per-skill literature reference documents — about 240 papers cataloged with DOI, PMID, citation counts, and skill-relevant key findings |
652
652
 
653
653
  </details>
654
654
 
@@ -677,12 +677,12 @@ Most genomics tools give you one thing. ENCODE Toolkit gives you the full resear
677
677
  | Category | Assays |
678
678
  |----------|--------|
679
679
  | **Histone/Chromatin** | Histone ChIP-seq, TF ChIP-seq, ATAC-seq, DNase-seq, CUT&RUN, CUT&Tag, MNase-seq |
680
- | **Transcription** | RNA-seq, total RNA-seq, small RNA-seq, long read RNA-seq, CAGE, RAMPAGE, PRO-seq, GRO-seq |
680
+ | **Transcription** | total RNA-seq, polyA plus RNA-seq, small RNA-seq, long read RNA-seq, CAGE, RAMPAGE, PRO-seq, GRO-seq |
681
681
  | **3D Genome** | Hi-C, intact Hi-C, Micro-C, ChIA-PET, HiChIP, PLAC-seq, 5C |
682
682
  | **DNA Methylation** | WGBS, RRBS, MeDIP-seq, MRE-seq |
683
683
  | **Functional** | STARR-seq, MPRA, CRISPR screen, eCLIP, iCLIP |
684
- | **Single Cell** | scRNA-seq, snATAC-seq, 10x multiome, SHARE-seq, Parse SPLiT-seq |
685
- | **Perturbation** | CRISPRi + RNA-seq, shRNA + RNA-seq, siRNA + RNA-seq |
684
+ | **Single Cell** | scRNA-seq, snATAC-seq, snRNA-seq, long read scRNA-seq |
685
+ | **Perturbation** | CRISPRi RNA-seq, shRNA RNA-seq, siRNA RNA-seq, CRISPR RNA-seq |
686
686
 
687
687
  **Supported file formats**: `fastq` `bam` `bed` `bigWig` `bigBed` `tsv` `csv` `hic` `tagAlign` `bedpe` `pairs` `fasta` `vcf` `tar`
688
688
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "encode-toolkit"
7
- version = "0.3.2"
7
+ version = "0.3.4"
8
8
  description = "MCP server for querying and downloading ENCODE Project genomics data directly from Claude"
9
9
  readme = "README.md"
10
10
  license = "AGPL-3.0-only"
@@ -0,0 +1,9 @@
1
+ """ENCODE Project connector - MCP server and Python client."""
2
+
3
+ from importlib.metadata import PackageNotFoundError, version
4
+
5
+ try:
6
+ __version__ = version("encode-toolkit")
7
+ except PackageNotFoundError: # a source tree that is not installed
8
+ __version__ = "0+unknown"
9
+ __author__ = "Dr. Alex M. Mawla, PhD"
@@ -12,12 +12,21 @@ DOWNLOAD_CONCURRENCY = 3
12
12
  DEFAULT_TIMEOUT = 30.0
13
13
  DOWNLOAD_TIMEOUT = 300.0
14
14
  DEFAULT_LIMIT = 25
15
+ # Frame for a single experiment. "page" is "embedded" plus the "audit" property; with
16
+ # "embedded" ENCODE omits the audits and every experiment looks free of errors and warnings.
17
+ EXPERIMENT_FRAME = "page"
18
+ # experiments read per request while a file search walks the experiments of one organism
19
+ EXPERIMENT_PAGE_SIZE = 200
20
+ # ...and how many experiments it reads at most: each one costs a request to ENCODE
21
+ MAX_EXPERIMENTS_SCANNED = 1000
22
+ # files of one experiment read per request during that walk
23
+ FILES_PAGE_SIZE = 200
15
24
  try:
16
25
  import importlib.metadata
17
26
 
18
27
  _version = importlib.metadata.version("encode-toolkit")
19
28
  except importlib.metadata.PackageNotFoundError:
20
- _version = "0.3.2"
29
+ _version = "0.3.4"
21
30
  USER_AGENT = f"encode-toolkit/{_version} (MCP; +https://github.com/ammawla/encode-toolkit)"
22
31
 
23
32
  # Keyring service name for credential storage
@@ -239,8 +248,18 @@ FILE_FORMATS = [
239
248
  "vcf",
240
249
  "bigInteract",
241
250
  "idx",
242
- "dat",
243
251
  "txt",
252
+ "h5ad",
253
+ "hdf5",
254
+ "sam",
255
+ "wig",
256
+ "starch",
257
+ "chain",
258
+ "PWM",
259
+ "btr",
260
+ "cndb",
261
+ "nucle3d",
262
+ "yaml",
244
263
  ]
245
264
 
246
265
  OUTPUT_TYPES = [
@@ -277,7 +296,6 @@ OUTPUT_TYPES = [
277
296
  "pseudoreplicated peaks",
278
297
  "pseudoreplicated IDR thresholded peaks",
279
298
  "replicated peaks",
280
- "stable peaks",
281
299
  "hotspots",
282
300
  "footprints",
283
301
  "peaks and background as input for IDR",
@@ -289,6 +307,10 @@ OUTPUT_TYPES = [
289
307
  "filtered peaks",
290
308
  # Quantifications
291
309
  "gene quantifications",
310
+ "sparse gene count matrix of unique reads",
311
+ "sparse gene count matrix of all reads",
312
+ "unfiltered sparse gene count matrix of unique reads",
313
+ "unfiltered sparse gene count matrix of all reads",
292
314
  "transcript quantifications",
293
315
  "exon quantifications",
294
316
  "microRNA quantifications",
@@ -347,7 +369,6 @@ OUTPUT_CATEGORIES = [
347
369
  "annotation",
348
370
  "quantification",
349
371
  "reference",
350
- "quality metric",
351
372
  ]
352
373
 
353
374
  FILE_STATUSES = [
@@ -381,6 +402,14 @@ ASSEMBLIES = [
381
402
  "dm3",
382
403
  "ce11",
383
404
  "ce10",
405
+ "GRCh38-minimal",
406
+ "mm10-minimal",
407
+ "T2T-CHM13",
408
+ "J02459.1",
409
+ "ENC001.1",
410
+ "ENC002.1",
411
+ "ENC003.1",
412
+ "ENC004.1",
384
413
  ]
385
414
 
386
415
  LIFE_STAGES = [
@@ -416,6 +445,28 @@ METADATA_MAP = {
416
445
  }
417
446
 
418
447
  # ENCODE API parameter name mapping (user-friendly -> API param)
448
+ # Fields requested from /search/?type=Experiment. They are what ExperimentSummary.from_api
449
+ # reads; naming them makes the API embed labels instead of returning object paths.
450
+ EXPERIMENT_SEARCH_FIELDS = (
451
+ "accession",
452
+ "assay_title",
453
+ "target.label",
454
+ "biosample_summary",
455
+ "biosample_ontology.classification",
456
+ "biosample_ontology.organ_slims",
457
+ "replicates.library.biosample.organism.scientific_name",
458
+ "status",
459
+ "date_released",
460
+ "description",
461
+ "lab.title",
462
+ "files.@id",
463
+ "replication_type",
464
+ "life_stage_age",
465
+ "assembly",
466
+ "audit",
467
+ "dbxrefs",
468
+ )
469
+
419
470
  EXPERIMENT_FILTER_MAP = {
420
471
  "assay_title": "assay_title",
421
472
  "organism": "replicates.library.biosample.donor.organism.scientific_name",