c737871c4ccb4f8f122354ac1bed3ef97bb036c6
This PR introduces TRIAL data — yield-performance results from real
field trials — as a SEPARATE data type alongside variety identity.
The two are complementary:
search_docs → "What's the disease resistance of DKC62-08RIB?"
(variety identity — what it IS)
search_trials → "Which corn hybrid won the IA 2024 trials?"
(performance data — how it PERFORMED)
scrape/sources/gh_plot_reports.py — Golden Harvest plot reports
- 4,618 expected (2024+2025; 2023 deferred to a backfill pass).
- URL: /<crop>/plot-report/<state>/<year>/<plot_id>
- Cross-vendor: each plot lists products from multiple brands
(NK / DEKALB / Golden Harvest / Enogen / Pioneer / Channel) side
by side at one cooperator's field — the kind of independent
comparison data Bayer doesn't publish itself.
- Generic per-column metrics dict (Yield/MST/Test Weight/$/Ac for
corn+soy, Ton/Acre + Milk + Beef columns for silage).
- Politeness: 1 req/sec, retries on 429/5xx, no redirect-follow.
scrape/sources/agripro_trials.py — AgriPro regional trial PDFs
- 14 unique PDFs (38 sitemap links deduped) at /trials-data
- pdfplumber text extraction, region/year detection from filename
- Verbatim PDF text preserved in chunk body so variety + yield
number adjacency drives retrieval (AP Iliad's Aberdeen ID yield
matches a query about "AP Iliad Idaho yield")
rag/chunk.py — chunks_from_trial() dispatching by source
- Plot reports: identity preamble + Top-5 by primary metric + full
ranking table. Metric labels chosen from the data (corn/soy use
"Yield", silage uses "Ton/Acre").
- AgriPro PDFs: identity preamble + verbatim trial body inline so
per-location yields surface for region+variety queries.
- Variety chunks get data_type="variety" metadata; trial chunks get
data_type="trial". Single Chroma collection; the tool router
filters by data_type rather than maintaining two collections.
rag/index.py — dispatch by sidecar's data_type field
rag/bm25.py — new filter columns (data_type, year, state)
docs_mcp/server.py — sixth MCP tool: search_trials(crop?, state?,
year?, product?, k=10)
- Filters trial chunks via where={"data_type": "trial", ...}
- Optional product substring post-filter for "DKC62-08RIB Iowa 2024"
style searches
- search_docs now defaults to data_type="variety" so trial chunks
don't bleed into variety identity queries
- Tool docstring routes the agent: "use lookup_variety to verify
identity details on any trial winner you surface"
NK trial endpoint (/NKSeeds/wsProxy.asmx/GetPlotResult) is documented
as deferred — the ASMX-SOAP shape returned empty XML on initial
probe. Bayer per-variety yield data is not publicly indexed at all
— documented in the trial-scope note (DEKALB/Asgrow trial data flows
through Channel reps, not the web). AgRevival research books exist
as 10 large annual PDFs but are deferred (low ROI per parse).
Initial corpus shipped in this PR: 14 AgriPro trial PDFs. The 4,618
Golden Harvest plot reports are scraping in background and will be
added in a follow-up corpus-snapshot PR (~70 min ETA).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
seed-mcp
MCP server over the public catalogs of major US row-crop seed
vendors — corn, soybeans, wheat. Sibling project to
crop-chem-docs
(pesticide labels), feeding the same Drawbar farm-advisor AI.
The server exposes per-variety records with agronomic ratings, disease tolerance, trait stack, maturity, and regional notes — so the advisor can answer questions like "which corn hybrid for sandy soil, drought-prone, RM ≤105 in northeast Iowa?" without rummaging through individual brand sites.
Vendor coverage
| Vendor | Verdict | Varieties | Notes |
|---|---|---|---|
| Bayer seeds (DEKALB + Asgrow + WestBred) | 🟢 | ~475 | Same cropscience.bayer.us Next.js infra as crop-chem-docs |
| Golden Harvest (Syngenta) | 🟢 | ~175 | Sitemap + server-rendered HTML + Syngenta CDN PDFs |
| NK (Syngenta) | 🟢 | 29 | Shares PDF fetcher with Golden Harvest |
| AgriPro (Syngenta wheat) | 🟢 | 24 | Drupal Views, server-rendered |
| Beck's PFR | 🟡 | 2,089 | Public Sanity GROQ API (no auth) |
| Beck's products | 🟡 | 860 | Identity-only until SeedIQ XHR sniffed |
| Pioneer (Corteva) | 🔴 | — | ToS bans automation — curated fallback lesson instead |
Quick start
git clone https://git.jpaul.io/justin/seed-mcp.git
cd seed-mcp
python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
# Run one scraper
python -m scrape.runner --source bayer_seeds --force
# Rebuild indexes
python -m rag.index --rebuild
# Local MCP server (stdio for Claude Desktop dev)
python -m docs_mcp.server --transport stdio
Tools exposed
| Tool | Purpose |
|---|---|
search_docs |
Hybrid + rerank variety search with crop / RM / trait / region filters |
get_page |
Full variety record by (source, source_key) |
list_versions |
Discover crops, brands, traits, RM/MG ranges, wheat classes |
corpus_status |
Counts + freshness; useful for health probes |
crop_seed_api_lessons |
Curated agronomy lessons — Pioneer fallback, disease-scale normalization, regional placement heuristics |
Build phases
This is a clone of docs-mcp-template.
The 13 phases in PLAN.md apply:
| Phase | Status |
|---|---|
| 0 — scaffold | done |
| 1 — first scraper (bayer_seeds) | next |
| 2 — chunk + index | pending |
| 3 — baseline MCP tools | template defaults |
| 4-5 — Dockerfile + CI | done (placeholders filled) |
| 6 — reranker | shares llama-rerank sidecar with crop-chem-docs |
| 7 — eval harness | pending (curate ~25 queries) |
| 8 — hybrid search | done (template) |
| 9 — diff_versions, list_cluster | optional |
11 — crop_seed_api_lessons curated layer |
pending |
See CLAUDE.md for the canonical sidecar schema and the
disease-scale-normalization gotcha (Golden Harvest is reversed).
Infrastructure
- Registry:
git.jpaul.io/justin/seed-mcp:latest(Watchtower) /:corpus-YYYY.MM.DD(production pin) - Embedder: shared Ollama pool with crop-chem-docs (Gitea-host GPUs + Windows Ollama; CI never hits trashpanda's production Ollama)
- Reranker: shared
llama-reranksidecar on trashpanda's Tesla P4 (one container, both MCPs use it) - PRODUCT_NAME:
crop_seed(notseed_mcp— used in Chroma collection, BM25 db filename, andcrop_seed_api_lessonstool)
Description
MCP server over US row-crop seed/hybrid variety data (corn, soybeans, wheat). Sibling to crop-chem-docs. Feeds Drawbar farmer advisor.
Languages
Python
99.7%
Dockerfile
0.3%