Conversation
Registers `gwascatalog` on the existing `ebi` endpoint (graph <http://rdf.ebi.ac.uk/dataset/gwas_catalog>) and ships a v3 MIE with 10 live-verified examples: 4 basic, 3 intermediate, 2 aggregation, 1 cross_db, including two first-class set-level enumeration routes (§4.4). Chosen from the 2026-07-27..30 production tool-call log: after filtering the ~94% of traffic that is a load-test harness plus one automated pipeline, the largest remaining usage cluster is disease-variant work chaining clinvar -> togovar -> medgen -> mondo -> hco -> hgnc. GWAS Catalog is the missing trait-association layer for exactly that thread, and it needs no new infrastructure. Three findings drove the file, none recoverable without probing the endpoint: - Opposite literal forms in one graph. `gwas:has_snp_reference_id "rs1296720"` matches 0 rows and needs ^^xsd:string; `m2r:snps "rs1296720"^^xsd:string` matches 0 rows and needs the plain form. DATATYPE() reports xsd:string for both, so only an ASK distinguishes them. This is the lead global_gotcha. - Two parallel association models over the same science: 955,930 med2rdf `gwas:Association` BLANK NODES carrying the full flat row, versus 782,879 IRI-addressable OBAN `gwas:TraitAssociation`. Different populations; mixing them double-counts. - `?s a gwas:Study` returns 224,583 across two disjoint IRI families — 89,981 real GCST study records and 134,602 EBI Trackable/* publication stubs. The honest study count is 89,981, and that is the figure the intro page states. Also documents the empty-string sentinel (absent values stored as "", so OPTIONAL always binds) and rdf:type inflation (trait IRIs typed x3 in-graph, x4.18 unpinned across efo/biosamples/clo). Adding a database touches five places, not one: endpoints.csv, the MIE, the regenerated 02b_database_catalog.md, the hand-written endpoint table in 02_budgets_and_discovery.md (no generator touches it; two test_server tests guard it), and the intro page's db-grid. check_mie_examples.py gwascatalog: 10 ok, 0 zero-row, 0 error. Composition: examples 63.0% of 21,049 bytes (corpus mean 64%). Full suite: 253 passed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
MINOR under the agent-pragmatic semver policy: adds a database (`gwascatalog`), no tool removed or renamed, no return shape changed. - pyproject 2.2.1 -> 2.3.0, uv.lock synced in the same commit. - CHANGELOG [2.3.0] section dated 2026-07-31, with the compare link at the foot and a whatsnew marker (a new database is a user-facing highlight). - generate_whatsnew.py re-run; the intro page's What's New now leads with the GWAS Catalog. The generator keeps 5 items, so the 2026-07 Database paper citation rolls off the list — it remains in CHANGELOG.md. Full suite: 253 passed (catalog + whatsnew drift guards included). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…steps
- Databases table: add GWAS Catalog to Genes / Genomics, alongside the other
variant resources (TogoVar, MoG+).
- Contributing: the section said adding a database was two steps (MIE +
endpoints.csv). It is five. Only the registry row affects what the server
VALIDATES; the other three are documentation surfaces that drift silently,
each with a guarding test now named inline:
3. regenerate 02b_database_catalog.md -> test_catalog_in_sync.py
4. the HAND-WRITTEN endpoint table in 02_budgets_and_discovery.md
-> TestUsageGuideEndpointTable in test_server.py
5. the intro page's database grid -> not generated, not tested
Three of these were missed on the first pass of this very release, following
the old two-step instruction; the tests caught 3 and 4, and 5 was caught by
review. A removal really is just the registry row, so that asymmetry is
stated explicitly.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Adds
gwascatalog— the NHGRI-EBI GWAS Catalog — as TogoMCP's 37th database, and cuts 2.3.0.MINOR under the agent-pragmatic policy: a database is added, nothing is removed or renamed, no return shape changes.
Why this database
Chosen from the 2026-07-27..30 production tool-call log, not by guesswork. Filtering the ~94% of traffic that turned out to be a load-test harness (2,474 identical query triples) plus one automated ChEMBL pipeline leaves ~478 organic calls, and the largest cluster there is disease-variant work chaining
clinvar→togovar→medgen→mondo→hco→hgnc. Trait association is the layer that thread was missing.It sits on the
ebiendpoint we already query, so this is a registry row plus an MIE — no new infrastructure.What the MIE documents
10 live-verified examples (4 basic, 3 intermediate, 2 aggregation, 1 cross_db), including two first-class set-level enumeration routes per spec §4.4. Three traps drove the file, none recoverable without probing:
gwas:has_snp_reference_id "rs1296720"matches 0 rows and needs^^xsd:string;m2r:snps "rs1296720"^^xsd:stringmatches 0 rows and needs the plain form.DATATYPE()reportsxsd:stringfor both, so only anASKseparates them. Getting it backwards fails silently — it caught me mid-authoring.Associations carrying the flat row, versus 782,879 IRI-addressable OBANTraitAssociations. Different populations; mixing them double-counts.?s a gwas:Studyreturns 224,583 across two disjoint IRI families — only 89,981 are real GCST study records, the rest are EBITrackable/*publication stubs. 89,981 is the figure the intro page states.Trait labels exist only in the co-hosted
ontology/efograph, which is what makes thecross_dbexample a route rather than a nicety.Adding a database touches five files, not one
endpoints.csv, the MIE, the regenerated02b_database_catalog.md, the hand-written endpoint table in02_budgets_and_discovery.md(no generator touches it — twoTestUsageGuideEndpointTabletests are what catch a miss), and the intro page's database grid. Documented in the changelog so the next person doesn't rediscover it.Verification
check_mie_examples.py gwascatalog→ 10 ok, 0 zero-row, 0 errorverified:block re-run live and dated 2026-07-31; all 21 predicates cited in gotchas confirmed non-zerographs.co_hostedrecords measured multipliers (rdf:type ×3 in-graph, ×4.18 unpinned)searchClasses("QT interval", efo)→EFO_0004682at rank 1, confirming thekeyword_search_apiroutingbenchmark/questions/*.yamlNote
generate_whatsnew.pykeeps 5 items, so this entry rolls the 2026-07 Database paper citation off the intro page's What's New. It remains inCHANGELOG.md— say the word if it should stay pinned instead.After merge
Tag the merge commit per CLAUDE.md step 4:
git tag v2.3.0 <merge-sha> && git push origin v2.3.0🤖 Generated with Claude Code