Plan, measure, and record field work for your AI agent.
- Work out irrigation, seeding, fertilizer and growing degree days with stated formulas
- Set the spray limits, buffers and approvals your agent must follow
- Measure fields and do tank math from the label rates you enter
- name:
- agriculture
- description:
- Field math and work rules for farm agents. Units first, chemical rates only from the product label, spray only inside a weather window, ask before chemical applications and large irrigation or nitrogen changes, and record every application. Use when a task plans, measures or records field work: spraying, irrigation, seeding, fertilizer, growing degree days or field area.
- license:
- MIT
- metadata:
- version:
- "1.0"
- homepage:
- https://agriculture.md
- api:
- https://agriculture.md/api/v1 (optional, no key, stores nothing)
- terms:
- https://agriculture.md/terms
Provided as is, at your own risk: figures are estimates from the numbers you use and may be wrong or out of date, and nothing here is agronomic, legal, regulatory or safety advice. Follow the product label and local law, and check with a qualified agronomist. Terms: https://agriculture.md/terms.
Plan, measure and record field work with the person's own numbers. Never pick a product or a rate. Ask before anything goes on a field. Show your math once, in a short block, with units on every number. Skip routine narration.
When this file has a "Your rules" section, those rules win over the defaults below, unless the label or the law is stricter. Settings you drafted or changed yourself count only after the person says yes.
POST https://agriculture.md/api/v1/spray_mix with { "area": 32, "carrier_rate": 100, "tank_size": 2000, "products": [{ "rate": 1.5, "unit": "l_per_ha", "label_max": 2 }] }. Send label_max from the label so the tool can flag a rate above it.GET https://agriculture.md/api/v1/irrigation?et0=6&kc=1.1&days=3&effective_rain=5&efficiency_pct=85&area=20&flow=120. It returns depth, volume and run time.GET https://agriculture.md/api/v1/fertilizer_rate?nutrient=p2o5&target=50&grade=18-46-0&area=20.seeding_rate.gdd.field_area. Use the area the person confirms for any rate or total.Works offline in any agent. Same file at /agriculture.md.
Customize
Your field rules, in one file.
8 settings in 4 groups. Start from a preset, change anything, and your settings are written into AGRICULTURE.md. Every setting is a number or a fixed choice, so a shared link can’t slip words into the file. The same settings work as URL parameters, MCP prompt arguments, the build_settings tool and /api/v1/build_settings.
Approvals, records and units. No numeric limits: the label and local law set them.
Spraying
Weather limits and water buffers for any spray job.
Set by the person you work for, and only that person can change them. Rules an agent drafted count only after that person says yes. Where a rule here and the rest of this file differ, the stricter one wins. The product label and the law where the field is always win over both. If a rule blocks the task, stop and ask; don't work around it.
The measurement system the person you work for uses. Follow this unless a rule above says otherwise.
mkdir -p ~/.claude/skills/agriculture && curl -fsSL "https://agriculture.md/agriculture.md?chem_approval=every_application&records=with_conditions&units=metric" -o ~/.claude/skills/agriculture/SKILL.mdhttps://agriculture.md/agriculture.md?chem_approval=every_application&records=with_conditions&units=metricCopy as JSON
The same settings as one JSON object. It feeds the build_settings tool or POST /api/v1/build_settings.
3 of 8 settings set. Anything not set follows the skill’s own rules.
Tools
Field math your agent can call.
Every tool works with the numbers you send, checks units, and states its formula. Results come back in metric and imperial, with what the tool can't check. No tool suggests a chemical or fertilizer rate.
{
"units": "metric",
"area": 32,
"carrier_rate": 100,
"tank_size": 2000,
"products": [
{
"label": "Product A",
"rate": 1.5,
"unit": "l_per_ha",
"label_max": 2
},
{
"label": "Product B",
"rate": 40,
"unit": "g_per_ha"
}
]
}curl -s https://agriculture.md/api/v1/spray_mix -H 'content-type: application/json' -d '{"units":"metric","area":32,"carrier_rate":100,"tank_size":2000,"products":[{"label":"Product A","rate":1.5,"unit":"l_per_ha","label_max":2},{"label":"Product B","rate":40,"unit":"g_per_ha"}]}'An agent can talk about farming. Field math has to be exact.
Ask a language model for a tank mix or an irrigation run time and you get a plausible number. One slipped unit (gallons for litres, acres for hectares, P for P2O5) moves the answer by 2 to 10 times, and on a field that means wasted product, runoff or crop damage. This file gives an agent fixed formulas with units on every number, your limits written into its instructions, and two hard rules: rates come only from the label, and nothing goes on a field without a yes.
- Units first: every tool takes metric or imperial and returns both, with exact conversion factors.
- The label sets the rate: spray_mix never suggests a rate and flags any rate above the label maximum you enter.
- Your limits, in writing: wind, rain-free hours, buffers, irrigation depth and nitrogen thresholds go into the skill.
- Same answer everywhere: the page, the API and the MCP tools run the same code, and nothing is stored.
Use it in your stack
Paste it, install it, or call it.
The skill alone gives an agent the method. The MCP server and API add the tools and your settings. No key, no account.
Paste the prompt into a system prompt or project instructions. Or keep the file in the repo and point AGENTS.md at it.
curl -fsSL https://agriculture.md/agriculture.md -o AGRICULTURE.mdecho "Whenever a task plans, measures or records field work: spraying, irrigation, seeding, fertilizer, growing degree days or field area, follow AGRICULTURE.md." >> AGENTS.mdFor agents that read a skills folder: install the skill so it loads when the topic comes up, and add the MCP server for the tools.
# The skillmkdir -p ~/.claude/skills/agriculturecurl -fsSL https://agriculture.md/agriculture.md -o ~/.claude/skills/agriculture/SKILL.md# Tools: spray_mix, irrigation, gdd, fertilizer_rate, seeding_rate, field_area, build_settingsclaude mcp add --transport http agriculture https://agriculture.md/mcpFor editors that read an mcp.json file: add the remote MCP server to the project, then paste the prompt into your rules.
// .cursor/mcp.json{ "mcpServers": { "agriculture": { "url": "https://agriculture.md/mcp" } } }// .vscode/mcp.json{ "servers": { "agriculture": { "type": "http", "url": "https://agriculture.md/mcp" } } }Any client that speaks remote MCP over HTTP can add it as a custom connector. Read-only, so there is nothing to authorize.
url: https://agriculture.md/mcptransport: streamable-http # stateless, JSON responsestools: spray_mix, irrigation, gdd, fertilizer_rate, seeding_rate, field_area, build_settingsprompts: agriculture # the skill, with your settingsGET with query parameters or POST a JSON body. CORS open. An OpenAPI document is at /openapi.json.
# Every tool: GET or POST https://agriculture.md/api/v1/<tool>curl -s https://agriculture.md/api/v1 | jq '.tools[].name'curl -s "https://agriculture.md/api/v1/irrigation?units=metric&et0=6&kc=1.1&days=3&effective_rain=5&efficiency_pct=85&area=20&flow=120&max_depth=15" | jq .summarycurl -s "https://agriculture.md/api/v1/settings" | jq '.presets[].id'claude mcp add --transport http agriculture https://agriculture.md/mcpExample code
Call it from your own code.
Working calls against the API. The full reference is at /api/v1 and /openapi.json.
Call a tool by GET, then by POST. No key; nothing is stored.
# Call a tool by GET, then by POST. No key; nothing is stored.curl -s "https://agriculture.md/api/v1/irrigation?et0=6&kc=1.1&days=3&effective_rain=5&efficiency_pct=85&area=20&flow=120&max_depth=15" | jq .summarycurl -s https://agriculture.md/api/v1/spray_mix \ -H 'content-type: application/json' \ -d '{"area":32,"carrier_rate":100,"tank_size":2000,"products":[{"label":"Product A","rate":1.5,"unit":"l_per_ha","label_max":2}]}' \ | jq '{summary, tank_loads, products}'# The skill with your own choices written incurl -s "https://agriculture.md/agriculture.md?preset=recommended&units=imperial&chem_approval=every_load" -D - -o SKILL.md | grep -i x-settingsPlan a spray job: field area from boundary points, then tank math over MCP.
// Plan a spray job: field area from boundary points, then tank math over MCP.const call = async (name: string, args: object) => { const res = await fetch("https://agriculture.md/mcp", { method: "POST", headers: { "content-type": "application/json", accept: "application/json" }, body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "tools/call", params: { name, arguments: args } }), }); const { result } = await res.json(); return result.structuredContent;};const field = await call("field_area", { points: [ { lat: 40.0, lon: -95.0 }, { lat: 40.0, lon: -94.9953 }, { lat: 40.0036, lon: -94.9953 }, { lat: 40.0036, lon: -95.0 }, ],});console.log(field.summary);// Rates come from the product label, never from the tool.const mix = await call("spray_mix", { area: field.area.ha, carrier_rate: 100, tank_size: 2000, products: [{ label: "Product A", rate: 1.5, unit: "l_per_ha", label_max: 2 }],});console.log(mix.summary); // then ask the person for a yes before mixingFAQ
Does it recommend products or rates?
If a result shows no flag, is the job safe or legal?
Where do the weather and crop numbers come from?
Why do the presets leave the numeric limits empty?
How accurate is field_area?
Is this advice?
Does it name brands or show prices?
Can an agent set up its own settings?
build_settings tool. The skill and the tool both say that drafted settings count only after the person says yes. Nothing technical stops an agent from ignoring that, so read what it sends you.