Good Earth

io.github.lonnievv0.3.0更新於 Oct 6, 2026

Climate timing for gardens and small farms: frost, heat, soil and planting dates for your plot.

已驗證Streamable HTTP可網頁執行Location & LifestyleData & Analytics

概覽

AI 產生的概覽

為花園和小型農場提供依區域劃分的氣候分析,讓助理查詢某塊土地的霜凍、熱量、土壤與種植時機。

功能
Good Earth 針對一塊土地而非單一座標點回答氣候問題。工具接受 GeoJSON 多邊形或緯度/經度/半徑的定位點,對範圍內地形取樣,回傳彙總值以及範圍內的差異。已上線的工具包括與過去十個季節比較的積溫季節曲線;其他工具涵蓋霜凍窗口、光照與水分平衡、土壤溫度、作物積溫狀態、霜前完成、害蟲閾值與依區域的校正。餘額、購買額度、憑證與定價由標準 DPYC 工具處理。
適用情境
當助理需要為特定花園、地塊或小型農場協助決定種植日期、霜凍風險或熱量累積時值得加入,尤其是地塊內海拔有變化的情況。若只是查詢單點天氣,免費計算機已能回答,用處不大。
執行需求
遠端 streamable HTTP 端點;不需帳號,也不需 API 金鑰。任何接受遠端伺服器 URL 的 MCP 用戶端都可連線。付費工具需要種植者的 Nostr npub、一次透過私訊完成的 npub 憑證交換,並在每次付費呼叫時傳入 dpop_token;額度以比特幣閃電網路發票購買。免費工具包括服務狀態與 oracle 工具。
安裝前請注意
付費呼叫會消耗以比特幣閃電網路購買的預付額度,涉及真實資金,執行工具前應先查看價格。憑證流程會索取 patron npub,並明確警告絕不要提供 nsec。使用者狀態以加密事件形式儲存在 Nostr 上,伺服器會呼叫第三方天氣與海拔資料來源。上游資料解析度約為 9 至 11 公里,地形約為 90 公尺,因此區域內差異是由海拔推導而非實測得出。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Good Earth,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "goodearth-mcp": {
      "type": "http",
      "url": "https://goodearth-mcp.fastmcp.app/mcp"
    }
  }
}

README

Good Earth

Region-scoped climate analytics for small specialty-crop and flower farms, monetized with Tollbooth DPYC™ Bitcoin Lightning micropayments.

Sibling of the Good Brew store.

  • For growers: the web app at https://goodearth.tollbooth-dpyc.com
  • For AI agents: the MCP server at https://goodearth-mcp.fastmcp.app/mcp (streamable HTTP) — the same tools the web app calls.

Connect an AI agent

Any MCP client that takes a remote server URL can connect; there is no account and no API key.

ClientHow
Claude.ai / Claude DesktopCustomize → Connectors → Add custom connector → https://goodearth-mcp.fastmcp.app/mcp (leave the OAuth fields blank)
Claude Codeclaude mcp add --transport http goodearth https://goodearth-mcp.fastmcp.app/mcp, or in a project's .mcp.json: {"mcpServers": {"goodearth": {"type": "http", "url": "https://goodearth-mcp.fastmcp.app/mcp"}}}
Cursor.cursor/mcp.json: {"mcpServers": {"goodearth": {"url": "https://goodearth-mcp.fastmcp.app/mcp"}}}
VS Code.vscode/mcp.json: {"servers": {"goodearth": {"type": "http", "url": "https://goodearth-mcp.fastmcp.app/mcp"}}}

server.json at the repo root is the entry for the official MCP Registry, as io.github.lonniev/goodearth-mcp — the namespace the rest of the DPYC fleet is listed under. .github/workflows/publish-mcp-registry.yml publishes it on every v* tag, logging in with GitHub OIDC and taking the version from the tag, so there is no key to keep. A test holds the committed version to pyproject.toml.

First connection walkthrough

  1. Ask the grower for their Nostr npub — never their nsec.
  2. goodearth_request_npub_proof(patron_npub=…) sends them a DM. They reply from their Nostr client; then call goodearth_receive_npub_proof(patron_npub=…, dpop_token=…) once, and pass npub + dpop_token on every paid call.
  3. goodearth_check_balance; top up with goodearth_purchase_credits (a Lightning invoice the grower pays) and goodearth_check_payment.
  4. goodearth_block_list — their saved ground, or a worked example to start from.

Free with no proof: goodearth_service_status and the goodearth_oracle_* tools. goodearth_check_price previews a fare. The server's own instructions repeat all of this for an agent that connects cold.

The idea

A farm is not a point. A bench and a hollow on the same acreage do not share a frost date, and every free weather calculator answers for a pin.

Good Earth answers for ground. Every tool accepts a GeoJSON polygon or a {lat, lon, radius_m} pin, samples the terrain inside it, and returns an aggregate plus the spread across it. That spread is the product: it tells a grower whether one planting date serves the whole block.

      YOU (operator, human in the loop)        │                         │        │ set & tune prices       │ drive credential intake        ▼                         ▼  ┌───────────────┐        ┌──────────────────────────────────────────────┐  │ Pricing Studio│ prices │        Good Earth — OPERATOR MCP              │  │    (iOS)      ├───────▶│        FastMCP · deployed on Horizon          │  └───────────────┘  Neon  │  ┌────────────────────────────────────────┐  │                           │  │ region · sources · gdd · season        │  │   Patron (Citizen)        │  │ @runtime.paid_tool(FROZEN_UUID) tools   │  │   + MCP client  ─────────▶│  ├────────────────────────────────────────┤  │   (Claude, the SPA) npub  │  │ tollbooth-dpyc SDK (the wheel)          │  │                    +sats  │  │  ledger · vault (AES-256-GCM) · pricing │  │                           │  │  ConstraintGate · Secure Courier·audit  │  │                           │  └────────────────────────────────────────┘  │                           └───┬─────────┬──────────┬───────────┬─────────┘                               ▼         ▼          ▼           ▼                         Neon Postgres  BTCPay▶  Sponsor     Nostr relays                         (your schema)  Lightning Authority   proofs·courier                         ledger+pricing invoices  certify +    DMs·audit                                                  provision        │                     Open-Meteo archive ◀── domain   │             ▼                     forecast · elevation   calls    └──▶ DPYC Oracle +                                                          dpyc-community

How the spread is actually produced

This is the design decision the whole product rests on, so it is stated plainly rather than buried.

The free gridded temperature feeds resolve about 9 km. Two sample points on one farm land in the same cell and return byte-identical numbers — reporting that as "the range across your region" would be a lie dressed as data. Terrain, however, resolves at 90 m, and terrain is what varies within a farm.

So Good Earth reads the regional signal from the coarse feed and derives within-region variation from elevation:

EffectApplies toWhy
Lapse rate (3.57 °F / 1000 ft)max and minHigher ground is colder
Cold-air drainage (capped at 6 °F)min onlyDense cold air pools in hollows on the still, clear nights when frost happens

Every response carries the native resolution of each feed it used, so a grower is never sold precision the data does not contain.

Tools

ToolPhaseAnswers
goodearth_gdd_season_curveT1 — shippedHeat accumulation across a region, vs the last 10 seasons
goodearth_region_climate_bundleT2Heat + water + light in one priced call
goodearth_frost_windowT2First-frost dates and near-term risk, with drainage spread
goodearth_dli_curve, goodearth_water_balanceT3Light and water lenses
goodearth_soil_temp_projection, goodearth_crop_gdd_status, goodearth_finish_before_frostT4Per-planting timing
goodearth_pest_thresholdT5Model GDD vs accumulated; crossing dates
goodearth_calibrationT6Per-region bias correction from patron field reports

Standard DPYC tools (check_balance, purchase_credits, Secure Courier, Oracle, pricing, constraints) come from the wheel via register_standard_tools — none of it is reimplemented here.

Data sources

All free, all public, no API key.

SourceRoleNative resolution
Open-Meteo archive (ERA5)Observed daily max/min~9 km
Open-Meteo forecast7-day extension~11 km
Open-Meteo elevation (SRTM)Terrain downscaling~90 m

A whole-region season read costs three upstream requests regardless of sample count: sample points are folded onto the archive's own grid so a distinct cell is fetched once, and the ten-season normals band is one span request sliced locally rather than ten separate calls.

Onboarding roadmap

  1. Nostr keypair — generate one (nak key generate); the nsec is the single env var the server needs (TOLLBOOTH_NOSTR_OPERATOR_NSEC).
  2. Sponsor Authority — register; it provisions your Neon database.
  3. Secure Courier — deliver btcpay_host, btcpay_api_key, btcpay_store_id via goodearth_request_credential_channel. Never as env vars, never in code.
  4. Set prices in Pricing Studio — new tools start unpriced and nobody can call an unpriced tool.
  5. Deploy on Horizon — fastmcp.json is already wired.

Get Pricing Studio (iOS). It reads and writes the pricing model live in Neon, so prices never live in code — surge, happy-hour, loyalty discounts and free trials are the thing a flat paywall can never give you.

The SPA

frontend/ carries the Good Earth app (the taxsort-mcp pattern — one repo, React app inside). Sign-in, the proof envelope, and the Nostr profile panel are the fleet's existing modules, borrowed rather than rewritten. Patron state lives on Nostr as NIP-44-encrypted NIP-78 events under the goodearth/* namespace — no accounts, and the farm's data never lives on the operator's server.

Develop

bash
uv venv --python python3.12          # coincurve has no 3.14 wheeluv pip install -e ".[dev]"ruff check .pytest -vpython -m goodearth_mcp.server       # runs the validate_operator_tools guard
cd frontend && npm install && npm run build

License

Apache-2.0

來源:README.md,提交 d1a6674

工具

0
工具後設資料尚未被收錄。

版本歷史

2
  1. v0.3.0最新Sep 19, 2026
  2. v0.2.0Sep 16, 2026