Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Discovery utilities. Hosts three subpackages — `literature` for Paperclip-style multi-source academic search across arXiv, Crossref, local JSON corpora, and (opt-in) the Paperclip API, with deterministic JSON caching, a `LiteratureClient` aggregator, normalised `Paper` records, and a CLI; `exa` for Exa-backed general web search, content extraction, grounded answers, and find-similar via `ExaClient` (search/contents/answer/find_similar) and a CLI; and `deep_research` for provider-neutral long-run
.claude/skills/docxology-infrastructure-search/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 2% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 3480% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 36% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 19% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 15% | 0% |
Discovery utilities for academic literature, modelled after the agent-native abstractions of Paperclip: every backend produces normalised Paper records that downstream consumers (citation export, manuscript synthesis, agent loops) can treat uniformly.
literature — Multi-source literature searchpythonfrom infrastructure.search.literature import ( Paper, SearchQuery, SearchResult, merge_papers, SearchBackend, LocalBackend, CrossrefBackend, ArxivBackend, PaperclipBackend, LiteratureClient, SearchCache, HttpClient, UrllibHttpClient, HttpResponse, BackendError, )
pythonclient = LiteratureClient([ArxivBackend(), CrossrefBackend(mailto="you@example.org")]) result = client.search(SearchQuery(text="protein language model fitness", max_results=20)) print(f"{len(result)} unique papers from {len(result.per_source_counts)} backends") for paper in result.papers[:5]: print(f" [{paper.score:.2f}] {paper.title} ({paper.year}) {paper.doi or paper.url}")
pythonbackend = LocalBackend("data/curated_corpus.json") result = LiteratureClient([backend]).search(SearchQuery(text="convex"))
Corpus format — either a list of Paper dicts or {"papers": [...]}:
json[ { "id": "doi:10.1126/science.1213847", "title": "Reproducible research in computational science", "authors": ["Roger D Peng"], "year": 2011, "doi": "10.1126/science.1213847", "venue": "Science", "venue_type": "journal" } ]
pythonimport os backend = PaperclipBackend(api_key=os.environ["PAPERCLIP_API_KEY"]) result = LiteratureClient([backend]).search( SearchQuery(text="GRPO hyperparameters", sources=["arxiv"], max_results=50) )
pythoncache = SearchCache("output/search_cache", ttl_seconds=3600 * 24) client = LiteratureClient([ArxivBackend(), CrossrefBackend()], cache=cache) # First call hits the network and writes search_<hash>.json. client.search(SearchQuery(text="adam optimizer")) # Re-running the identical query is a deterministic file read. client.search(SearchQuery(text="adam optimizer"))
pythonfrom infrastructure.search.literature import merge_papers unique = merge_papers(result_a.papers + result_b.papers)
Deduplication priority: DOI → arXiv id → normalised (title, year). Higher score wins; missing fields on the winner are filled from the loser ("union of evidence").
bash# JSON to stdout uv run python -m infrastructure.search.literature.cli search \ "scaling laws" --source arxiv,crossref --max-results 10 # Direct BibTeX to a file uv run python -m infrastructure.search.literature.cli to-bibtex \ "GRPO hyperparameters" \ --source arxiv \ --output output/grpo_refs.bib # Cached, offline-only over a local corpus uv run python -m infrastructure.search.literature.cli search \ "convex" --source local --corpus data/corpus.json \ --cache-dir output/cache
exa — Web search, contents, answers, find-similarGeneral web search, content extraction, and grounded answers via the Exa API. The client never reads the environment at import time — construct it explicitly. See exa/README.md for the full reference.
bashexport EXA_API_KEY="YOUR_API_KEY" # keys: https://dashboard.exa.ai/api-keys
pythonfrom infrastructure.search.exa import ExaClient client = ExaClient.from_env() # or ExaClient(ExaConfig(api_key=...)) for tests resp = client.search("Next.js route handler authentication example", num_results=10) for r in resp.results: print(r.title, r.url) client.contents(["https://example.com/post"], text=True) # parsed content for known URLs client.answer("What is retrieval-augmented generation?") # grounded answer + citations client.find_similar("https://example.com/post") # similar pages for a seed URL
bashuv run python -m infrastructure.search.exa search "scaling laws" --num-results 10 uv run python -m infrastructure.search.exa contents "https://example.com/post" --text uv run python -m infrastructure.search.exa answer "What is RAG?" uv run python -m infrastructure.search.exa find-similar "https://example.com/post"
monid — Gateway to hundreds of data endpoints (PAID)Monid routes agent tasks to third-party endpoints through one wallet. Python client: MonidClient; repository workflow: monid/SKILL.md. The separate upstream Monid skill is not placed under .agents/skills/, whose complete tree is pinned to the declared context-engineering source.
pythonfrom infrastructure.search.monid import MonidClient, format_pricing_table client = MonidClient.from_env() for hit in client.discover("web search", limit=5).results: print(hit.provider, hit.price) print(format_pricing_table()) # offline USD/1k for Exa, Brave, Tavily, Serper, …
Direct search API list prices are maintained in monid/PRICING.md (review date in pricing.py). Monid gateway pricing is per-endpoint — always inspect before run.
deep_research — Manuscript-scale research reports (PAID)Provider-neutral dispatch to OpenAI o3-deep-research and Gemini deep research. Packages a project's manuscript/ sources (plus rendered outputs when present) into the prompt; returns full reports with citations and saves them under output/reports/deep_research/. Live-verified end-to-end 2026-06-10 on the Active Inference exemplar (report with 4 new DOI-backed citations + section-by-section fixes).
Costs real money — measured: ≈ $2/report (OpenAI, max_tool_calls=12), ≈ $25/report (Gemini, ~9.3M-token agentic loop). Budget a 9-exemplar loop at ≈ $20 OpenAI-only. Full cost model, budget knobs, and the multi-project loop recipe: deep_research/README.md; operating rules: deep_research/AGENTS.md.
bashuv sync --group deep-research # installs openai + google-genai uv run python -m infrastructure.search.deep_research providers # free availability check uv run python -m infrastructure.search.deep_research run-project \ projects/templates/template_active_inference \ "Review this manuscript; suggest fixes and new citations." --providers openai
Gotchas: background=True jobs bill to completion even if never polled; Gemini jobs run 30–60+ min (poll budgets > 30 min); submits retry transient connection errors with an OpenAI Idempotency-Key.
pythonfrom infrastructure.search.literature import ( LiteratureClient, SearchQuery, ArxivBackend, CrossrefBackend ) from infrastructure.reference.citation import paper_to_bibentry, write_bibfile from infrastructure.reference.citation.models import BibDatabase client = LiteratureClient([ArxivBackend(), CrossrefBackend()]) result = client.search(SearchQuery(text="reproducible research", max_results=15)) db = BibDatabase() for paper in result.papers: db.add(paper_to_bibentry(paper)) write_bibfile("projects/my_project/manuscript/references.bib", db)
an entry in result.errors[name] and leaves the rest of the search intact.
SearchCache keys on the canonical queryidentity; cached files are pretty-printed JSON, version-control friendly.
backend ignores them — protects downstream code.
infrastructure.reference.citation — export sideof the literature workflow (BibTeX writer, parser, converter).
infrastructure.publishing — APA / MLA / DOIutilities for the resulting publications.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-06 | pass→pass | 23,536 | 9,477 | -60% | 1 | 1 | 0% | 3,062 | 2,938 | -4% | 0 | 0 | — |
case-01 | fail→pass | 33,326 | 18,190 | -45% | 1 | 1 | 0% | 4,682 | 4,780 | +2% | 0 | 0 | — |
case-02 | fail→pass | 14,680 | 36,151 | +146% | 1 | 1 | 0% | 215 | 7,697 | +3480% | 0 | 0 | — |
case-03 | fail→fail | 16,617 | 16,087 | -3% | 1 | 1 | 0% | 293 | 2,527 | +762% | 0 | 0 | — |
case-04 | fail→pass | 20,798 | 11,185 | -46% | 1 | 1 | 0% | 2,518 | 3,433 | +36% | 0 | 0 | — |
case-05 | fail→pass | 22,761 | 11,063 | -51% | 1 | 1 | 0% | 2,854 | 3,385 | +19% | 0 | 0 | — |
case-07 | fail→pass | 18,648 | 9,754 | -48% | 1 | 1 | 0% | 2,613 | 3,016 | +15% | 0 | 0 | — |
case-08 | fail→pass | 15,022 | 11,319 | -25% | 1 | 1 | 0% | 2,021 | 3,542 | +75% | 0 | 0 | — |
case-09 | fail→pass | 12,006 | 2,549 | -79% | 1 | 1 | 0% | 1,162 | 2,510 | +116% | 0 | 0 | — |
case-10 | fail→pass | 25,819 | 2,619 | -90% | 1 | 1 | 0% | 3,071 | 2,674 | -13% | 0 | 0 | — |
case-11 | fail→pass | 16,349 | 6,612 | -60% | 1 | 1 | 0% | 1,990 | 3,169 | +59% | 0 | 0 | — |
case-12 | pass→pass | 12,938 | 10,709 | -17% | 1 | 1 | 0% | 1,565 | 3,295 | +111% | 0 | 0 | — |
case-13 | fail→pass | 6,530 | 4,013 | -39% | 1 | 1 | 0% | 1,237 | 2,981 | +141% | 0 | 0 | — |
case-14 | fail→pass | 18,698 | 4,265 | -77% | 1 | 1 | 0% | 3,938 | 2,980 | -24% | 0 | 0 | — |
case-15 | fail→pass | 18,963 | 4,581 | -76% | 1 | 1 | 0% | 3,070 | 2,846 | -7% | 0 | 0 | — |
case-16 | fail→pass | 11,044 | 7,378 | -33% | 1 | 1 | 0% | 1,526 | 2,498 | +64% | 0 | 0 | — |
case-17 | fail→pass | 16,084 | 6,863 | -57% | 1 | 1 | 0% | 1,870 | 2,522 | +35% | 0 | 0 | — |
case-18 | fail→pass | 15,366 | 8,923 | -42% | 1 | 1 | 0% | 2,021 | 2,804 | +39% | 0 | 0 | — |
case-19 | pass→pass | 27,537 | 7,747 | -72% | 1 | 1 | 0% | 2,434 | 3,276 | +35% | 0 | 0 | — |
case-20 | fail→pass | 24,811 | 13,282 | -46% | 1 | 1 | 0% | 3,582 | 3,399 | -5% | 0 | 0 | — |
case-21 | pass→pass | 31,033 | 25,689 | -17% | 1 | 1 | 0% | 2,657 | 4,667 | +76% | 0 | 0 | — |
case-22 | pass→pass | 9,329 | 5,298 | -43% | 1 | 1 | 0% | 880 | 2,985 | +239% | 0 | 0 | — |
case-23 | pass→pass | 17,509 | 10,432 | -40% | 1 | 1 | 0% | 1,881 | 4,305 | +129% | 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. 23 cases were attempted, and 21 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 +70 percentage points is the difference between those two pass rates over the 21 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.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/4/2026 | +64% |
Other measured skills in the registry, with their headline benchmark lift.