/api/data/sources now returns per-source geo; surface it as a Location column
in the sources table.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
New futures_quote(commodity, delivery?) tool wraps the new /api/data/futures
endpoint: reports latest price, today's session open, prior settle, and both
moves (since open and on the day). With a delivery month it resolves the listed
contract; without it, the continuous nearby. Adds client.futures(), fmt_futures(),
tests, and a CHANGELOG entry.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
New MCP tools:
- basis_movement: aggregated basis trend, one headline line per crop. The cheap
"how is basis moving overall" view; optional commodity/source/delivery/days.
- basis_detail: per-(elevator, crop, delivery) basis first→last drill-down.
Both do the aggregation MCP-side and return compact markdown to keep token
burn low, so a client can call the cheap aggregate first and drill in only when
needed.
Flexibility/parity changes:
- price_history: commodity is now optional (spans all crops); groups by
(source, commodity, delivery); surfaces basis first→last in the summary and
adds a futures column to the raw table.
- latest_prices: expose the `kind` filter (grain/fertilizer) that the API and
client already supported.
- client.history(): commodity optional.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The MCP's port 8000 isn't exposed outside the private mcp-servers_mcp
Docker network, so only the MetaMCP gateway can ever reach it. MetaMCP
itself enforces auth at the gateway → MCP-client edge (bearer token in
its UI), which is the right layer for it. In-container Basic/Bearer was
defense-in-depth that turned out to be friction-in-depth.
Removed:
- ag_bids_mcp/auth.py (HTTP Basic middleware)
- tests/test_auth.py (3 tests covering the middleware)
- AG_BIDS_MCP_USER / AG_BIDS_MCP_PASS env vars from .env.example, README,
docker-compose.snippet.yml, and deploy/README.md
Server.py simplified — direct `mcp.run(transport=...)` like zerto-docs-mcp,
no Starlette wrapping. 21 tests passing.
Live on 192.168.0.2: container recreated, real MCP initialize handshake
returns 200 + capability metadata over the mcp-servers_mcp network with
no auth header.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Exposes live + historical ag-bids commodity data (from the ag-monitor
service at agbids.paul.farm) as MCP tools, sitting behind MetaMCP at
https://mcp.jpaul.io/metamcp/ag-bids/mcp.
Pattern mirrors zerto-docs-rag with one addition: HTTP Basic auth in
front of the streamable-HTTP transport so namespace guessers can't reach
the tools. Stdio transport is unaffected (used by local Claude Desktop
dev).
Tools (markdown returns, ~15 LOC each):
best_local_bid(commodity) — where to sell corn/soy/wheat today,
for the current calendar month only
current_lime_price() — latest lime quotes ($/ton)
current_input_price(product?) — MAP / Potash / Lime
latest_prices(...) — filtered snapshot
price_history(...) — per-(source,delivery) trend
list_sources / list_commodities / list_deliveries
source_health() — healthy / stale / down buckets
todays_summary() — same shape as morning brief snapshot
Data path: ag-bids-mcp -> X-API-Key -> /api/data/* on ag-monitor
(reuses BRIEF_API_KEY).
Tests: 24 covering the httpx client, markdown formatters, HTTP Basic
middleware (401/200), and JSONL usage logging.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>