justin 8aa4cc0ef3 Make ag-bids-mcp a standalone compose project on .0.2
Reflect the deploy decision: ag-bids-mcp lives in its own
~/ag-bids-mcp/ folder on 192.168.0.2 (NOT inside zerto-docs-rag's
compose). It joins the existing mcp-servers_mcp Docker network as
external so MetaMCP can still reach it at http://ag-bids-mcp:8000/mcp.

Updated:
- deploy/docker-compose.snippet.yml — now a self-contained compose
  project file with `networks.mcp.external: true; name: mcp-servers_mcp`
- deploy/README.md — full runbook for the standalone-folder deploy,
  smoke-test commands that match the actual network name, and a
  base64-encoded Authorization-header recipe for testing without
  fighting curl's -u quoting

Verified live: container on .0.2 returns 401 anonymous and 200 with
real MCP initialize handshake from inside mcp-servers_mcp.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 15:59:33 -04:00
2026-05-20 11:37:46 -04:00
2026-05-20 11:37:46 -04:00
2026-05-20 11:37:46 -04:00
2026-05-20 11:37:46 -04:00

ag-bids-mcp

Model Context Protocol server exposing live + historical commodity price data collected by ag-monitor. Sits behind the user's MetaMCP gateway at https://mcp.jpaul.io/metamcp/ag-bids/mcp.

What it does

Lets an LLM client (Claude Desktop, OpenWebUI, anything that speaks MCP) ask plain-English questions like:

  • "What's the best place to sell corn today?"
  • "What's the current price of lime?"
  • "Show me the corn basis trend at Andersons Greenville over the last 30 days."
  • "Which sources are stale or failing?"

How it talks to data

All data is read from ag-monitor over HTTPS:

ag-bids-mcp ── X-API-Key ─► https://agbids.paul.farm/api/data/*

Endpoints used: /api/data/latest, /history, /best, /inputs, /sources, /deliveries. See the ag-monitor source for the contract.

Authentication

This MCP enforces HTTP Basic auth in front of the FastMCP HTTP transport. Set both:

AG_BIDS_MCP_USER=<your username>
AG_BIDS_MCP_PASS=<your password>

MetaMCP is configured to inject Authorization: Basic <b64> on every upstream call. Direct access without the header returns 401.

If either env var is unset the server refuses to start (fail closed).

Local dev (stdio)

python3 -m venv venv && source venv/bin/activate
pip install -r requirements.txt
cp .env.example .env  # fill in AG_BIDS_API_KEY + AG_BIDS_MCP_USER/PASS
MCP_TRANSPORT=stdio python -m ag_bids_mcp.server

Wire into Claude Desktop's claude_desktop_config.json:

{
  "mcpServers": {
    "ag-bids": {
      "command": "/path/to/venv/bin/python",
      "args": ["-m", "ag_bids_mcp.server"],
      "env": {
        "MCP_TRANSPORT": "stdio",
        "AG_BIDS_API_URL": "https://agbids.paul.farm",
        "AG_BIDS_API_KEY": "...",
        "AG_BIDS_MCP_USER": "x",
        "AG_BIDS_MCP_PASS": "y"
      }
    }
  }
}

(The Basic auth check is skipped automatically when MCP_TRANSPORT=stdio since stdio has no HTTP layer.)

Deploy (MetaMCP host)

See deploy/README.md. Container image is pulled from git.jpaul.io/justin/ag-bids-mcp:latest; Watchtower on the MetaMCP host auto-updates it every 5 minutes.

Tools exposed

Tool Returns
best_local_bid(commodity) Where to sell corn, soy, or wheat for this month's delivery — markdown one-liner + table
current_lime_price() Latest lime quotes across all manual-entry sources
current_input_price(product?) MAP / Potash / Lime — all three or one
latest_prices(commodity?, source?, delivery?) Snapshot table, optionally filtered
price_history(commodity, source?, delivery?, days?) Compact time series
list_sources() Active scrapers + last-success timestamps
list_commodities() corn, soy, wheat, map, potash, lime
list_deliveries(commodity) Posted delivery labels, chronological
source_health() Stale / failing / healthy summary
todays_summary() Same shape as the morning brief snapshot
S
Description
MCP server exposing ag-monitor commodity data, behind MetaMCP with HTTP Basic auth
Readme 259 KiB
Languages
Python 98.6%
Dockerfile 1.4%