Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Search 8+ scientific databases through a uniform Connector interface. Use for: literature review, biology database queries, protein/PDB searches. CLI: python -m infrastructure.search.connectors {list-dbs,search}. Config: set queries in projects/{name}/manuscript/config.yaml `connector_search:` block. Orchestrator: scripts/pipeline/stage_08_connector_search.py --project {name}
.claude/skills/docxology-scientific-connectors/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 1% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -39% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 55% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -19% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -35% | 0% |
Uniform discovery layer over eight science databases (OpenAlex, arXiv, Semantic Scholar, CrossRef, Europe PMC, bioRxiv, UniProt, PDB) via the Connector protocol. All connectors are stdlib-only (urllib), retry-safe, and backed by an optional in-memory HTTP cache.
pythonfrom infrastructure.search.connectors import ( ConnectorDomain, get_registry, list_connectors, search_connector, ) catalog = list_connectors() biology_connectors = get_registry().by_domain(ConnectorDomain.biology) hits = search_connector("openalex", "protein folding", max_results=10)
pythonregistry = get_registry() protein = registry.get("uniprot").fetch("P12345") structure = registry.get("pdb").fetch("4HHB")
bashuv run python -m infrastructure.search.connectors list-dbs
| ID | Database | Domain | | --- | --- | --- | | openalex | OpenAlex | literature | | arxiv | arXiv | physics | | semantic_scholar | Semantic Scholar | literature | | crossref | CrossRef | literature | | europepmc | Europe PMC | biology | | biorxiv | bioRxiv | biology | | uniprot | UniProt | proteomics | | pdb | Protein Data Bank | structure |
bash# List all registered databases with their domains and descriptions uv run python -m infrastructure.search.connectors list-dbs # Search one connector uv run python -m infrastructure.search.connectors search openalex "protein folding" --max-results 10 # Search all connectors (individual failures are reported as warnings) uv run python -m infrastructure.search.connectors search --all "membrane" --max-results 5
bash# Run connector search for a named project uv run python scripts/pipeline/stage_08_connector_search.py --project my_project # One-off override that bypasses project connector_search configuration uv run python scripts/pipeline/stage_08_connector_search.py \ --project my_project --connector arxiv --query "active inference" --max-results 5
Set connector queries in projects/{name}/manuscript/config.yaml:
yamlconnector_search: enabled: true max_results: 20 connectors: arxiv: - protein language model openalex: - AlphaFold structure prediction
The default report path is projects/{name}/output/data/connector_search/results.json. Each configured connector/query pair has a success or error status and a normalized result list produced by ConnectorHit.to_dict(). No configuration, disabled configuration, or an empty connector map exits 2; malformed configuration or any connector error exits 1 after the report is written.
pythonfrom infrastructure.search.connectors import ( Connector, # Protocol — search(query, opts) + fetch(id, opts) ConnectorDomain, # Enum: biology, literature, proteomics, ... ConnectorHit, # Normalised result record CatalogEntry, # Registry metadata for a connector SearchOptions, # max_results, year_min, year_max, extra FetchOptions, # include_abstract, extra ConnectorError, # Base exception ConnectorRegistry, # register / get / catalog / domain filtering )
urllib withexponential-backoff retry.
is recorded and does not abort others.
ConnectorHttpClient provides a configurablein-memory TTL cache; pass ttl=0 when every request must reach the source.
rather than silently replacing failures with empty result lists.
bashuv run pytest \ tests/infra_tests/search/test_connectors.py \ tests/infra_tests/search/test_connector_scripts.py -v
../SKILL.md — parent search module skill../AGENTS.md — search module architecture overview| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 16,997 | 3,337 | -80% | 1 | 1 | 0% | 1,709 | 1,719 | +1% | 0 | 0 | — |
case-02 | fail→pass | 15,799 | 6,324 | -60% | 1 | 1 | 0% | 3,855 | 2,346 | -39% | 0 | 0 | — |
case-03 | fail→pass | 19,815 | 3,251 | -84% | 1 | 1 | 0% | 1,123 | 1,744 | +55% | 0 | 0 | — |
case-04 | fail→pass | 10,230 | 2,649 | -74% | 1 | 1 | 0% | 1,867 | 1,521 | -19% | 0 | 0 | — |
case-05 | fail→pass | 11,895 | 3,027 | -75% | 1 | 1 | 0% | 2,432 | 1,581 | -35% | 0 | 0 | — |
case-06 | fail→pass | 13,484 | 2,993 | -78% | 1 | 1 | 0% | 2,161 | 1,611 | -25% | 0 | 0 | — |
case-07 | fail→pass | 10,250 | 4,307 | -58% | 1 | 1 | 0% | 1,880 | 1,799 | -4% | 0 | 0 | — |
case-08 | fail→fail | 9,540 | 3,247 | -66% | 1 | 1 | 0% | 1,392 | 1,464 | +5% | 0 | 0 | — |
case-09 | fail→pass | 12,624 | 3,224 | -74% | 1 | 1 | 0% | 1,881 | 1,625 | -14% | 0 | 0 | — |
case-10 | fail→pass | 10,168 | 1,985 | -80% | 1 | 1 | 0% | 1,797 | 1,364 | -24% | 0 | 0 | — |
case-11 | fail→pass | 12,901 | 2,965 | -77% | 1 | 1 | 0% | 2,026 | 1,426 | -30% | 0 | 0 | — |
case-12 | fail→pass | 12,641 | 3,881 | -69% | 1 | 1 | 0% | 2,231 | 1,637 | -27% | 0 | 0 | — |
case-13 | fail→pass | 5,320 | 1,859 | -65% | 1 | 1 | 0% | 1,020 | 1,406 | +38% | 0 | 0 | — |
case-14 | pass→pass | 12,258 | 3,428 | -72% | 1 | 1 | 0% | 2,135 | 1,690 | -21% | 0 | 0 | — |
case-15 | fail→pass | 15,917 | 6,106 | -62% | 1 | 1 | 0% | 928 | 1,639 | +77% | 0 | 0 | — |
case-16 | fail→pass | 13,427 | 4,779 | -64% | 1 | 1 | 0% | 2,392 | 1,872 | -22% | 0 | 0 | — |
case-17 | fail→pass | 10,940 | 5,288 | -52% | 1 | 1 | 0% | 1,672 | 2,067 | +24% | 0 | 0 | — |
case-18 | fail→pass | 12,352 | 2,030 | -84% | 1 | 1 | 0% | 1,865 | 1,326 | -29% | 0 | 0 | — |
case-19 | fail→fail | 16,051 | 3,738 | -77% | 1 | 1 | 0% | 3,039 | 1,673 | -45% | 0 | 0 | — |
case-20 | pass→pass | 4,241 | 3,490 | -18% | 1 | 1 | 0% | 881 | 1,765 | +100% | 0 | 0 | — |
case-21 | pass→pass | 7,979 | 6,042 | -24% | 1 | 1 | 0% | 1,434 | 2,273 | +59% | 0 | 0 | — |
case-22 | pass→pass | 3,797 | 3,483 | -8% | 1 | 1 | 0% | 749 | 1,734 | +132% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 20 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +73 percentage points is the difference between those two pass rates over the 20 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.