eCommerce
tollbooth-dpyc.com
An MCP server for managing patron credits and Bitcoin Lightning payments, including balance checks, credit purchases, payment status, ledger crediting, and account statements.
ENDPOINT 1
https://goodearth-mcp.fastmcp.app/mcp
MCP server metadata
- Name
- goodearth-mcp
- Version
- 4.0.3
Good Earth — region-scoped climate analytics for small specialty-crop and flower farms, monetized via Tollbooth DPYC Bitcoin Lightning micropayments. ## The block is the point A farm is not a pin. Ground is saved once as a BLOCK — a polygon or a pin, with a name — and every tool then takes that block by its id, its name or an alias. Geometry travels once, not on every call. Each tool samples the terrain inside the block and reports an aggregate PLUS the spread across it, because a bench and a hollow on the same acreage do not share a frost date. Blocks may OVERLAP or NEST — a meadow drawn inside the farm around it, one bed inside a field, a trial strip across two. That is intended: a block is a question about some ground, not a parcel on a survey, so an overlap is two honest questions and never a drawing error. Do not report one as a mistake or offer to redraw it. Name a block loosely. Its id, its name, an alias, or any part of its name that only one block has all work — "Meadow" finds "Lower Meadow", and a saved "North Farm (east parcel)" answers to "North Farm". When several blocks match, the error names every one with its id, so choose from that list rather than adding an alias to get past it. Start with goodearth_block_list. If the grower has saved nothing it answers with a worked example, so there is always ground to stand on; save theirs with goodearth_block_save and it takes over. What they grow, watch for and have seen is recorded per block with goodearth_block_item_save, which is why the season tools need no collections passed to them. ## First connection, for a grower's agent 1. Ask the grower for their Nostr npub (npub1…). Never ask for an nsec. 2. goodearth_request_npub_proof(patron_npub=…) sends them a Nostr DM. Tell them to reply to it from their Nostr client, then call goodearth_receive_npub_proof(patron_npub=…, dpop_token=…) once. Pass npub and dpop_token on every paid call after that. 3. goodearth_check_balance. If it is empty, goodearth_purchase_credits returns a Lightning invoice for the grower to pay, and goodearth_check_payment confirms it. 4. goodearth_block_list — their saved ground, or a worked example. Needing none of that: goodearth_service_status and the goodearth_oracle_* tools. goodearth_check_price previews a fare. The same tools drive the web app at https://goodearth.tollbooth-dpyc.com. ## Operator onboarding For the operator of this service, not a grower. Call goodearth_get_operator_onboarding_status to check readiness. 1. Register with an Authority (provides a Neon database automatically) 2. Deliver operator secrets via Secure Courier: - btcpay_host, btcpay_api_key, btcpay_store_id Call goodearth_request_credential_channel to start. ## Pricing Tool prices are set dynamically by the operator's pricing model. Use `goodearth_check_price` to preview costs and `goodearth_check_balance` to see your balance. ## Troubleshooting Tool Failures When a tool call fails, **read the error message** — it tells you what went wrong and what to do next. Common causes: - **proof is required** → Call `request_npub_proof` then `receive_npub_proof` to prove npub ownership. The cache expires after ~1 hour; renew with a fresh request/receive cycle. - **Insufficient credit balance** → Call `purchase_credits` to top up. - **Operator credentials not delivered yet** → This is a lifecycle state, not an error. The operator needs to deliver API credentials via Secure Courier. Do NOT tell the patron to 'fix the deployment' or 'inject environment variables' — credential delivery is a Secure Courier flow, not a platform configuration issue. - **Service unavailable / persistence layer unreachable / only bootstrap tools** → The MCP is warming up after idle (serverless cold start). This is normal — retry in 10-15 seconds. Do NOT diagnose as an infrastructure outage or suggest the operator check their deployment. The second request almost always succeeds. - **Upstream API authentication failure** → Only if the error explicitly mentions token expiry or an upstream auth error. **IMPORTANT — Don't Pester Your Customer:** Do NOT ask the patron to re-authenticate, re-authorize, or re-do OAuth unless the error message specifically says the upstream token is expired or invalid. Token expiry is only one of many possible causes. Speculatively re-running OAuth or credential flows wastes the patron's time and is the opposite of what DPYC stands for. ## Secure Courier — Human in the Loop All Secure Courier flows (`request_credential_channel` / `receive_credentials`, `request_npub_proof` / `receive_npub_proof`) require a human to read a Nostr DM and reply manually. After calling a `request_*` tool, **STOP and wait** for the user to confirm they have replied. Do NOT poll, retry, or speculatively call `receive_*` — each receive call **destructively drains** all DMs from the relay. If you call it before the human replies, their message will be lost. One request, one wait, one receive.
Known tools 81
goodearth_restore_creditsCredit a patron's ledger from a BTCPay-settled invoice.
Potential side effectsgoodearth_account_statementGenerate a patron's account statement at this operator.
Inferred read-onlygoodearth_account_statement_infographicGenerate a visual SVG infographic of your account statement.
Inferred read-onlygoodearth_report_issueFile a field report about this service as a GitHub issue on the operator's repo.
Inferred read-onlygoodearth_get_operator_onboarding_statusReport this operator's configuration readiness.
Inferred read-onlygoodearth_get_patron_onboarding_statusReport a patron's credential readiness for this operator.
Inferred read-onlygoodearth_request_credential_channelOpen a Secure Courier channel for credential delivery.
Inferred read-onlygoodearth_forget_credentialsDelete vaulted credentials for a specific service and npub.
Potential side effectsgoodearth_update_patron_credentialAdd or update a single patron credential field.
Potential side effectsgoodearth_update_operator_credentialAdd or update a single operator secret field.
Potential side effectsgoodearth_get_patron_credential_fieldsList stored patron credential field names (not values).
Inferred read-onlygoodearth_request_npub_proofRequest npub ownership proof from a patron via Nostr DM.
Inferred read-onlygoodearth_check_proof_statusCheck whether a previously-cached dpop_token is still valid.
Inferred read-onlygoodearth_check_authority_balanceCheck this operator's tax balance at the Authority.
Inferred read-onlygoodearth_reset_pricing_modelErase all pricing models and restore a viable default.
Potential side effectsgoodearth_request_adoptionAsk a chosen Authority to adopt this operator (deferred courtship).
Inferred read-onlygoodearth_adoption_statusCheck this operator's adoption-request status at a chosen Authority.
Inferred read-onlygoodearth_restore_neon_schemaRe-run ``ensure_schema()`` on every NeonVault this operator uses.
Inferred read-onlygoodearth_list_canonical_identitiesReturn canonical (tool_id, mcp_name, …) for every tool the wheel exposes.
Inferred read-onlygoodearth_get_nostr_profileRead an npub's public Nostr profile (NIP-01 kind-0 metadata).
Inferred read-onlygoodearth_publish_nostr_profilePublish a CLIENT-SIGNED kind-0 profile to relays for an npub.
Potential side effectsgoodearth_list_constraint_typesList all available constraint types and their parameter schemas.
Inferred read-onlygoodearth_list_my_couponsList the coupons this patron has redeemed on this operator.
Inferred read-onlygoodearth_notarize_ledgerBuild a Merkle tree of all patron balances and submit the root to Bitcoin via OpenTimestamps.
Inferred read-onlygoodearth_get_notarization_proofGenerate a Merkle inclusion proof that a patron's balance was included in a Bitcoin-notarized snapshot.
Inferred read-onlygoodearth_gdd_season_curveGrowing degree day accumulation across a region, season to date.
Inferred read-onlygoodearth_frost_windowWhen frost normally arrives on this ground, and whether it is coming this week.
Inferred read-onlygoodearth_crop_gdd_statusWhere every planting on a block stands, and whether it finishes before frost.
Inferred read-onlygoodearth_soil_temp_projectionWhen the soil on this ground crosses a planting threshold.
Inferred read-onlygoodearth_pest_thresholdWhere a pest model's degree-day stages stand on this ground.
Inferred read-onlygoodearth_calibrationTurn a block's own field reports into a correction on the model.
Inferred read-onlygoodearth_almanacThe sky's own record for this ground — normal, actual, and what is coming.
Inferred read-onlygoodearth_review_rosterAudit a roster against what this ground's record actually knows.
Inferred read-onlygoodearth_task_listOne page of a region's tasks, ordered and filtered by the database.
Inferred read-onlygoodearth_nearby_speciesSearch what is actually recorded near this ground, a page at a time.
Inferred read-onlygoodearth_crop_suitabilityWhich crops finish on this ground, and with how much room to spare.
Inferred read-onlygoodearth_tree_suitabilityWhether a tree survives and gets its chill on this ground.
Inferred read-onlygoodearth_calendar_datasetCompute this block's dated season as a dataset, and store it for publishing.
Inferred read-onlygoodearth_calendar_listThe calendar feeds you have published, and how often each is polled.
Inferred read-onlygoodearth_planting_windowWhen to start seed, when to put it out, and the last day it still finishes.
Inferred read-onlygoodearth_forget_my_groundDelete every block you have here, and everything recorded on them.
Potential side effectsgoodearth_block_item_listWhat you grow, watch for, or saw on a plot — a page at a time.
Inferred read-onlygoodearth_disease_riskHours of leaf wetness on this ground, and what the disease models make of them.
Inferred read-onlygoodearth_drying_windowWhen the dew burns off this ground, the dry days ahead, and the next rain.
Inferred read-onlyCONNECT WITH APPROVAL
Client installation
Review this server and its permissions before adding it. Secret placeholders must be set locally.
Codex
~/.codex/config.toml
[mcp_servers.goodearth-mcp]
url = "https://goodearth-mcp.fastmcp.app/mcp"
enabled = true
Claude Code
.mcp.json
{
"mcpServers": {
"goodearth-mcp": {
"type": "http",
"url": "https://goodearth-mcp.fastmcp.app/mcp"
}
}
}
Claude Desktop
Settings → Connectors → Add custom connector
Name: goodearth-mcp
Remote MCP URL: https://goodearth-mcp.fastmcp.app/mcp
Add this remote URL as a custom connector in Claude Desktop. Availability depends on the user plan and workspace policy.
Cursor
.cursor/mcp.json
{
"mcpServers": {
"goodearth-mcp": {
"url": "https://goodearth-mcp.fastmcp.app/mcp"
}
}
}
Visual Studio Code
.vscode/mcp.json
Add to Visual Studio Code{
"servers": {
"goodearth-mcp": {
"type": "http",
"url": "https://goodearth-mcp.fastmcp.app/mcp"
}
}
}
Generic MCP
Client-specific MCP configuration
{
"name": "goodearth-mcp",
"transport": "streamable-http",
"url": "https://goodearth-mcp.fastmcp.app/mcp"
}
MCP Inspector
Run the official MCP Inspector locally and enter the indexed Streamable HTTP endpoint.
TRUST AND VERIFICATION EVIDENCE
Loading Trust v2 evidence…
Checking the associated registrable domain. The BuiltWith key remains server-side.
Evidence is source-attributed and does not guarantee that a third-party server is safe. Risk labels are conservative metadata heuristics.