{"name":"warehouse.md","version":"1.1","updated":"2026-10-29","updates":{"changelog":"https://warehouse.md/changelog.md","json":"https://warehouse.md/changelog.json","atom":"https://warehouse.md/changelog.atom","since_example":"https://warehouse.md/changelog.md?since=2026-10-29","tool":"whats_new","remember":"warehouse.md: check https://warehouse.md/changelog.md?since=2026-10-29 after 2026-11-12; new tools may exist."},"description":"A skill file for agents that size, find, compare, negotiate and book warehouse space, with the person's limits written in: square feet, location and distance, dates and duration, rates, deposits and approvals. WAREHOUSE.md is the working file the agent keeps for each search: the need, the options and their sources, every offer and counter, holds, the booking and who approved what. Read-only calculators over HTTP and MCP size space from inventory, compare offers on one cost basis, weigh a lease against pay-per-pallet storage, score locations, plan a negotiation and check an offer; no listings, availability or prices come from us.","skill":{"url":"https://warehouse.md/warehouse.md","with_settings":"https://warehouse.md/warehouse.md?preset=recommended"},"settings":"https://warehouse.md/api/v1/settings","usage":"GET /api/v1/<tool> with query parameters (arrays and objects as URL-encoded JSON), or POST /api/v1/<tool> with a JSON body (64 KB at most). No key. CORS open. Nothing is stored.","tools":[{"name":"space_calc","title":"Size the space from your inventory","description":"Turns pallets, or cartons stacked onto pallets, into pallet positions at the peak, rack levels under the clear height, floor positions and square feet (or m²): a repeating rack or lane module for the storage mode, plus cross aisles, staging, dock lanes, office and other space. Returns positions, levels and what limited them, floor positions, area per position, storage, staging and total area, a planning range and cubic use, with every default stated. Generic layout arithmetic on your numbers: not a layout drawing, an engineering, fire-code or rack-capacity check, a listing or a quote.","get":"https://warehouse.md/api/v1/space_calc","post":"https://warehouse.md/api/v1/space_calc","example_get":"https://warehouse.md/api/v1/space_calc?pallets=540&storage=selective_rack&clear_height_ft=28&load_height_in=60","example_body":{"pallets":540,"storage":"selective_rack","clear_height_ft":28,"load_height_in":60},"example_note":"Round illustrative numbers, not market data, a price or a quote; send your own.","input":{"type":"object","properties":{"units":{"type":"string","enum":["imperial","metric"],"default":"imperial","description":"imperial (default): areas in sq ft, lengths in ft, distances in mi. metric: m², m and km. Applies to every area, length and distance you send and get back."},"pallets":{"type":"number","minimum":1,"maximum":10000000,"description":"Pallets you store on average. Send this or cartons."},"cartons":{"type":"object","description":"Cartons instead of pallets: {count, length_in, width_in, height_in, weight_lb?} (or the _cm and weight_kg twins). Stacked onto pallets by the better of two footprint orientations, in the layers that fit under load_height_in on a 6 in pallet deck, with no overhang.","properties":{"count":{"type":"number","minimum":1,"maximum":1000000000,"description":"How many cartons."},"length_in":{"type":"number","minimum":1,"maximum":120,"description":"Carton length, in (or length_cm)."},"width_in":{"type":"number","minimum":1,"maximum":120,"description":"Carton width, in (or width_cm)."},"height_in":{"type":"number","minimum":1,"maximum":120,"description":"Carton height, in (or height_cm)."},"weight_lb":{"type":"number","minimum":0,"maximum":10000,"description":"Carton weight, lb (or weight_kg). Optional; caps cartons per pallet at max_load_lb."},"length_cm":{"type":"number","minimum":2.5,"maximum":305},"width_cm":{"type":"number","minimum":2.5,"maximum":305},"height_cm":{"type":"number","minimum":2.5,"maximum":305},"weight_kg":{"type":"number","minimum":0,"maximum":4536}},"required":["count"]},"pallet_length_in":{"type":"number","minimum":24,"maximum":96,"default":48,"description":"Pallet side that goes into the rack, in (default 48). Or pallet_length_cm."},"pallet_width_in":{"type":"number","minimum":24,"maximum":96,"default":40,"description":"Pallet side along the aisle, in (default 40). Or pallet_width_cm."},"pallet_length_cm":{"type":"number","minimum":60,"maximum":245,"description":"Pallet length into the rack, cm (metric twin of pallet_length_in)."},"pallet_width_cm":{"type":"number","minimum":60,"maximum":245,"description":"Pallet width along the aisle, cm (metric twin of pallet_width_in)."},"load_height_in":{"type":"number","minimum":12,"maximum":120,"default":60,"description":"Height of a loaded pallet, pallet included, in (default 60). Or load_height_cm."},"load_height_cm":{"type":"number","minimum":30,"maximum":305,"description":"Loaded pallet height, cm (metric twin of load_height_in)."},"max_load_lb":{"type":"number","minimum":100,"maximum":10000,"default":2200,"description":"Most a pallet may weigh, lb (default 2,200, about 1,000 kg). Used only with carton weights. Or max_load_kg."},"max_load_kg":{"type":"number","minimum":45,"maximum":4536,"description":"Most a pallet may weigh, kg (metric twin of max_load_lb)."},"storage":{"type":"string","enum":["floor","selective_rack","double_deep","drive_in","push_back","pallet_flow"],"default":"selective_rack","description":"floor, selective_rack (default), double_deep, drive_in, push_back or pallet_flow."},"clear_height_ft":{"type":"number","minimum":8,"maximum":150,"default":24,"description":"Clear height to the lowest beam, joist or sprinkler, ft (default 24). Or clear_height_m."},"clear_height_m":{"type":"number","minimum":2.4,"maximum":45,"description":"Clear height, m (metric twin of clear_height_ft)."},"stack":{"type":"integer","minimum":1,"maximum":6,"default":2,"description":"Floor storage only: pallets stacked on each other (default 2), lowered when the clear height can't take them."},"aisle_ft":{"type":"number","minimum":3,"maximum":30,"description":"Aisle width, ft. Default 12 (counterbalance trucks), 11 for double_deep. Or aisle_m."},"aisle_m":{"type":"number","minimum":1,"maximum":9,"description":"Aisle width, m (metric twin of aisle_ft)."},"lane_depth":{"type":"integer","minimum":1,"maximum":20,"description":"Lane modes only: pallets deep per lane. Defaults: floor 4, drive_in 6, push_back 4, pallet_flow 8."},"peak_factor":{"type":"number","minimum":1,"maximum":5,"default":1.15,"description":"Peak over average stock (default 1.15)."},"fill_target_pct":{"type":"number","minimum":50,"maximum":100,"default":85,"description":"Share of positions full at the peak, % (default 85)."},"honeycomb_pct":{"type":"number","minimum":0,"maximum":60,"description":"Positions lost to part-empty lanes, %. Defaults: selective 0, double_deep 10, push_back 15, pallet_flow 15, drive_in 25, floor 25."},"cross_aisle_pct":{"type":"number","minimum":0,"maximum":50,"default":10,"description":"Cross aisles on top of the storage block, % (default 10)."},"staging_pct":{"type":"number","minimum":0,"maximum":100,"default":10,"description":"Receiving and shipping staging, % of the storage block with cross aisles (default 10)."},"dock_doors":{"type":"integer","minimum":0,"maximum":500,"description":"Dock doors you'll use. Each adds a staging lane (default 12 x 50 ft = 600 sq ft). Optional."},"dock_lane_sqft":{"type":"number","minimum":0,"maximum":5000,"default":600,"description":"Staging lane per dock door, sq ft (default 600 = 12 x 50 ft). Or dock_lane_sqm."},"dock_lane_sqm":{"type":"number","minimum":0,"maximum":465,"description":"Staging lane per dock door, m² (metric twin of dock_lane_sqft)."},"office_sqft":{"type":"number","minimum":0,"maximum":10000000,"default":0,"description":"Office area to add, sq ft (default 0). Or office_sqm."},"office_sqm":{"type":"number","minimum":0,"maximum":1000000,"description":"Office area, m² (metric twin of office_sqft)."},"other_sqft":{"type":"number","minimum":0,"maximum":10000000,"default":0,"description":"Any other area to add (packing, charging, yard office), sq ft (default 0). Or other_sqm."},"other_sqm":{"type":"number","minimum":0,"maximum":1000000,"description":"Other area, m² (metric twin of other_sqft)."}}}},{"name":"compare_spaces","title":"Compare spaces on one cost basis","description":"Prices up to 20 offers on one basis: rent after free months and yearly increases, operating costs, handling in and out, monthly and one-time fees, with the deposit kept apart as refundable cash. Ranks them by all-in monthly average (default), total, or effective rate per area or per pallet, and flags each against the person's limits and need (over the monthly, total or rate limit, term too long, too small, and more). Optional: a common horizon in months, and a discount rate for a present value. Every number comes from the offers you send: it lists no spaces and fetches no rates.","get":"https://warehouse.md/api/v1/compare_spaces","post":"https://warehouse.md/api/v1/compare_spaces","example_body":{"offers":[{"label":"Space A","area":11000,"rate":0.98,"basis":"per_sqft_month","term_months":6,"free_months":1},{"label":"Space B","rate":17.5,"basis":"per_pallet_month","term_months":4,"handling_in":6,"handling_out":6}],"pallets_avg":560,"pallets_in_month":180,"pallets_out_month":180},"example_note":"Round illustrative numbers, not market data, a price or a quote; send your own.","input":{"type":"object","properties":{"offers":{"type":"array","minItems":1,"maxItems":20,"items":{"type":"object","required":["rate","basis","term_months"],"properties":{"id":{"type":"string","maxLength":80},"label":{"type":"string","maxLength":80,"description":"A generic label such as Space A."},"area":{"type":"number","minimum":0,"description":"Area offered, sq ft (m² with units metric)."},"pallet_positions":{"type":"number","minimum":0},"rate":{"type":"number","minimum":0,"description":"The rate as quoted, on basis."},"basis":{"type":"string","enum":["per_sqft_month","per_sqft_year","per_sqm_month","per_sqm_year","per_pallet_month","per_pallet_week","per_pallet_day","flat_month"]},"opex":{"type":"number","minimum":0,"description":"Operating costs charged on top, on the same basis as the rate."},"handling_in":{"type":"number","minimum":0,"description":"Per pallet received."},"handling_out":{"type":"number","minimum":0,"description":"Per pallet shipped."},"fees_monthly":{"type":"number","minimum":0},"fees_one_time":{"type":"number","minimum":0},"deposit":{"type":"number","minimum":0,"description":"Refundable deposit, money. Shown apart, not a cost."},"free_months":{"type":"integer","minimum":0},"escalation_pct":{"type":"number","minimum":0,"maximum":100,"description":"Yearly rent increase, %."},"term_months":{"type":"integer","minimum":1,"maximum":600},"notice_days":{"type":"integer","minimum":0},"start":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"distance":{"type":"number","minimum":0,"description":"Distance from your site, mi (km with units metric)."},"clear_height":{"type":"number","minimum":0,"description":"Clear height, ft (m with units metric)."},"dock_doors":{"type":"integer","minimum":0},"temperature":{"type":"string","enum":["ambient","climate_controlled","refrigerated","frozen"]},"features":{"type":"array","items":{"type":"string","enum":["sprinklered","dock_levelers","drive_in_door","fenced_yard","trailer_parking","office","heavy_power","rail_spur","food_grade","temperature_logging","monitored_security","after_hours_access","racking_included","forklift_included","bonded"]},"maxItems":15},"source":{"type":"string","maxLength":500,"description":"Where the offer came from: a URL or 'message from provider'. Never invented."}}},"description":"1 to 20 offers: {label, rate, basis, term_months, area?, pallet_positions?, opex?, handling_in?, handling_out?, fees_monthly?, fees_one_time?, deposit?, free_months?, escalation_pct?, notice_days?, start?, distance?, ...}. Areas in sq ft (m² with units metric)."},"units":{"type":"string","enum":["imperial","metric"],"default":"imperial","description":"imperial (default): areas in sq ft, lengths in ft, distances in mi. metric: m², m and km. Applies to every area, length and distance you send and get back."},"currency":{"type":"string","maxLength":3,"pattern":"^[A-Za-z]{3}$","description":"Your currency as a three-letter ISO 4217 code, used only to label money in the result. Nothing is converted. Optional."},"pallets_avg":{"type":"number","minimum":0,"maximum":10000000,"description":"Pallets stored on average: prices per-pallet offers without pallet_positions, and gives every offer a cost per pallet."},"pallets_in_month":{"type":"number","minimum":0,"maximum":10000000,"description":"Pallets received a month, priced at each offer's handling_in."},"pallets_out_month":{"type":"number","minimum":0,"maximum":10000000,"description":"Pallets shipped a month, priced at each offer's handling_out."},"months":{"type":"integer","minimum":1,"maximum":600,"description":"Price every offer over the same number of months. Default: each offer's own term."},"rank_by":{"type":"string","enum":["monthly_avg","total","effective_area","effective_pallet"],"default":"monthly_avg","description":"monthly_avg (default), total, effective_area or effective_pallet."},"limits":{"type":"object","description":"The person's limits, to flag each offer: max_rate_area_month, max_monthly, max_total, max_term_months, max_deposit_months, max_escalation_pct, max_notice_days, approval_over.","properties":{"max_rate_area_month":{"type":"number","minimum":0,"description":"All-in cap per sq ft (m²) per month, after free months and escalation."},"max_monthly":{"type":"number","minimum":0},"max_total":{"type":"number","minimum":0},"max_term_months":{"type":"integer","minimum":1},"max_deposit_months":{"type":"number","minimum":0},"max_escalation_pct":{"type":"number","minimum":0},"max_notice_days":{"type":"integer","minimum":0},"approval_over":{"type":"number","minimum":0,"description":"A commitment total over this needs the person's recorded yes."},"hold_without_asking_hours":{"type":"number","minimum":0}}},"need":{"type":"object","description":"The need, to flag each offer: area_min, area_max, pallet_positions, and any other need field.","properties":{"area_min":{"type":"number","minimum":0},"area_max":{"type":"number","minimum":0},"pallet_positions":{"type":"number","minimum":0},"clear_height_min":{"type":"number","minimum":0},"temperature":{"type":"string","enum":["ambient","climate_controlled","refrigerated","frozen"]},"dock_doors_min":{"type":"integer","minimum":0},"storage":{"type":"string","enum":["floor","selective_rack","double_deep","drive_in","push_back","pallet_flow"]},"services":{"type":"array","items":{"type":"string","enum":["storage","receiving","pick_pack","cross_dock","kitting","returns","yard"]}},"must_haves":{"type":"array","items":{"type":"string","enum":["sprinklered","dock_levelers","drive_in_door","fenced_yard","trailer_parking","office","heavy_power","rail_spur","food_grade","temperature_logging","monitored_security","after_hours_access","racking_included","forklift_included","bonded"]}},"max_distance":{"type":"number","minimum":0},"start":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"duration_months":{"type":"integer","minimum":1},"flex_days":{"type":"integer","minimum":0}}},"discount_rate_pct":{"type":"number","minimum":0,"maximum":100,"description":"Your yearly discount rate, %, for a present-value column. Optional."}},"required":["offers"]}},{"name":"lease_or_flex","title":"Lease fixed space or pay per pallet","description":"Compares fixed leased space with pay-per-pallet storage across the person's own month-by-month pallet counts (1 to 60 months). Prices all flex, all lease sized to the peak, and the best hybrid: a base lease of K positions with the overflow sent to flex, searching every K from 0 to the peak. Returns the three totals, the best base size and its area, the savings, the break-even share of months (a leased position pays when it is full in more than lease cost per position / flex rate of the months) and the month-by-month plan. Every rate is yours: it fetches no prices and is not a quote.","get":"https://warehouse.md/api/v1/lease_or_flex","post":"https://warehouse.md/api/v1/lease_or_flex","example_body":{"monthly_pallets":[300,300,320,340,360,420,520,640,700,560,380,300],"lease":{"rate":0.95,"basis":"per_sqft_month","fees_monthly":400,"own_handling_per_pallet":3},"flex":{"rate_per_pallet_month":18,"handling_in":7,"handling_out":7,"min_monthly":500},"pallets_in":[80,80,100,110,120,160,220,260,240,120,80,70],"pallets_out":[80,80,80,90,100,100,120,140,180,260,260,150]},"example_note":"Round illustrative numbers, not market data, a price or a quote; send your own.","input":{"type":"object","properties":{"monthly_pallets":{"type":"array","minItems":1,"maxItems":60,"items":{"type":"number","minimum":0,"maximum":100000},"description":"Pallets in storage each month, 1 to 60 numbers, month 1 first."},"lease":{"type":"object","description":"The fixed space: {rate, basis (per_sqft_month, per_sqft_year, per_sqm_month, per_sqm_year or flat_month), sqft_per_position? (default 12.27 from space_calc's selective-rack defaults; sqm_per_position in metric), positions? (needed for flat_month: what the space holds), opex? (same basis as rate), fees_monthly?, own_handling_per_pallet? (your own cost per pallet in or out)}. The lease runs for every month of the curve.","properties":{"rate":{"type":"number","minimum":0},"basis":{"type":"string","enum":["per_sqft_month","per_sqft_year","per_sqm_month","per_sqm_year","flat_month"]},"sqft_per_position":{"type":"number","minimum":1,"maximum":200},"sqm_per_position":{"type":"number","minimum":0.1,"maximum":20},"positions":{"type":"integer","minimum":1},"opex":{"type":"number","minimum":0},"fees_monthly":{"type":"number","minimum":0},"own_handling_per_pallet":{"type":"number","minimum":0}},"required":["rate","basis"]},"flex":{"type":"object","description":"Pay-per-pallet storage: {rate_per_pallet_month, handling_in?, handling_out? (per pallet), min_monthly? (charged in any month that uses flex)}.","properties":{"rate_per_pallet_month":{"type":"number","minimum":0},"handling_in":{"type":"number","minimum":0},"handling_out":{"type":"number","minimum":0},"min_monthly":{"type":"number","minimum":0}},"required":["rate_per_pallet_month"]},"pallets_in":{"type":"array","maxItems":60,"items":{"type":"number","minimum":0},"description":"Pallets received each month, the same length as monthly_pallets. Optional; without it handling is not priced."},"pallets_out":{"type":"array","maxItems":60,"items":{"type":"number","minimum":0},"description":"Pallets shipped each month, the same length as monthly_pallets. Optional."},"units":{"type":"string","enum":["imperial","metric"],"default":"imperial","description":"imperial (default): areas in sq ft, lengths in ft, distances in mi. metric: m², m and km. Applies to every area, length and distance you send and get back."},"currency":{"type":"string","maxLength":3,"pattern":"^[A-Za-z]{3}$","description":"Your currency as a three-letter ISO 4217 code, used only to label money in the result. Nothing is converted. Optional."}},"required":["monthly_pallets","lease","flex"]}},{"name":"location_fit","title":"Fit candidate spaces to where goods go","description":"Takes the places goods go to or come from as weighted points (latitude/longitude, or x/y on your own flat grid in mi or km) and up to 20 candidate spaces. Returns the weighted center of gravity, the weighted median center (Weiszfeld), and for each candidate the weighted mean and longest road distance (straight line x a circuity factor, default 1.2), the share of weight inside a ring (default 50 mi or 80 km), a weight-distance transport proxy and a rank. Coordinates only: it looks up no addresses and holds no maps, places or traffic data.","get":"https://warehouse.md/api/v1/location_fit","post":"https://warehouse.md/api/v1/location_fit","example_body":{"points":[{"label":"Customers north","x":22,"y":34,"weight":30,"kind":"customer"},{"label":"Customers east","x":61,"y":22,"weight":50,"kind":"customer"},{"label":"Stores south","x":74,"y":63,"weight":20,"kind":"store"},{"label":"Supplier","x":38,"y":71,"weight":40,"kind":"supplier"}],"candidates":[{"label":"Space A","x":30,"y":30},{"label":"Space B","x":50,"y":45},{"label":"Space C","x":82,"y":80}]},"example_note":"Round illustrative numbers, not market data, a price or a quote; send your own.","input":{"type":"object","properties":{"points":{"type":"array","minItems":1,"maxItems":200,"items":{"type":"object"},"description":"1 to 200 demand points: {label?, lat, lon} or {label?, x, y}, with weight (default 1, e.g. shipments or pallets a month) and kind? (customer, supplier, store or site)."},"candidates":{"type":"array","minItems":1,"maxItems":20,"items":{"type":"object"},"description":"1 to 20 candidate spaces: {label, lat, lon} or {label, x, y}, the same kind of coordinates as the points."},"units":{"type":"string","enum":["imperial","metric"],"default":"imperial","description":"imperial (default): areas in sq ft, lengths in ft, distances in mi. metric: m², m and km. Applies to every area, length and distance you send and get back."},"circuity":{"type":"number","minimum":1,"maximum":3,"default":1.2,"description":"Road distance over straight-line distance (default 1.2). 1 gives straight-line distances."},"ring":{"type":"number","minimum":0,"maximum":25000,"description":"Ring radius for the share of weight nearby, mi (km with units metric). Default 50 mi or 80 km."},"cost_per_weight_distance":{"type":"number","minimum":0,"maximum":1000000,"description":"Your own cost per unit of weight per mi (or km), to turn the weight-distance proxy into money. Optional."}},"required":["points","candidates"]}},{"name":"negotiation_plan","title":"Plan the counters inside your limits","description":"Plans a negotiation on one ask: the zone of agreement between the ask and the person's target and walk-away, an opening counter and a shrinking ladder of counters that never passes the walk-away (cooperative, firm or quick), the effective rate of each round after free months and yearly increases, what each allowed trade (term, free months, an increase cap, a smaller deposit, a flexible start) is worth in effective-rate terms, the stop rule, what needs the person's yes, and fixed honesty rules. The provider's future asks are a planning assumption, never a fact. Uses only the numbers you send; it sends nothing.","get":"https://warehouse.md/api/v1/negotiation_plan","post":"https://warehouse.md/api/v1/negotiation_plan","example_body":{"ask":{"rate":1,"basis":"per_sqft_month","term_months":6,"deposit_months":1},"target_rate":0.88,"walk_away_rate":0.95,"style":"cooperative","max_rounds":3,"area":9000},"example_note":"Round illustrative numbers, not market data, a price or a quote; send your own.","input":{"type":"object","properties":{"ask":{"type":"object","description":"The provider's ask: {rate, basis, term_months, free_months?, escalation_pct?, deposit_months?}.","properties":{"rate":{"type":"number","minimum":0},"basis":{"type":"string","enum":["per_sqft_month","per_sqft_year","per_sqm_month","per_sqm_year","per_pallet_month","per_pallet_week","per_pallet_day","flat_month"]},"term_months":{"type":"integer","minimum":1,"maximum":600},"free_months":{"type":"integer","minimum":0},"escalation_pct":{"type":"number","minimum":0,"maximum":100},"deposit_months":{"type":"number","minimum":0,"maximum":120}},"required":["rate","basis","term_months"]},"target_rate":{"type":"number","minimum":0,"maximum":10000000,"description":"The rate the person aims for, on the ask's basis, as an effective rate (after free months and yearly increases)."},"walk_away_rate":{"type":"number","minimum":0,"maximum":10000000,"description":"The highest effective rate the person accepts, on the ask's basis. Counters never pass it."},"style":{"type":"string","enum":["cooperative","firm","quick"],"default":"cooperative","description":"cooperative (default), firm or quick."},"opening_discount_pct":{"type":"number","minimum":0,"maximum":90,"description":"Open this far under the ask, %. Default by style: cooperative 10, firm 15, quick 5, or at the target if that is lower."},"max_rounds":{"type":"integer","minimum":1,"maximum":12,"default":3,"description":"Rounds before stopping to ask the person (default 3)."},"trades":{"type":"array","maxItems":5,"items":{"type":"string","enum":["term","free_months","escalation","deposit","start_date"]},"description":"Trades the person allows: term, free_months, escalation, deposit, start_date. Default: free_months, escalation, deposit, start_date (term only when you include it)."},"alternative_effective_rate":{"type":"number","minimum":0,"maximum":10000000,"description":"The effective rate of a real alternative the person has, on the same basis. Lowers the walk-away to it. Never invented."},"area":{"type":"number","minimum":0,"maximum":100000000,"description":"Area, sq ft (m² with units metric), to turn rates into money for area bases."},"pallets":{"type":"number","minimum":0,"maximum":10000000,"description":"Pallets, to turn rates into money for per-pallet bases."},"units":{"type":"string","enum":["imperial","metric"],"default":"imperial","description":"imperial (default): areas in sq ft, lengths in ft, distances in mi. metric: m², m and km. Applies to every area, length and distance you send and get back."},"currency":{"type":"string","maxLength":3,"pattern":"^[A-Za-z]{3}$","description":"Your currency as a three-letter ISO 4217 code, used only to label money in the result. Nothing is converted. Optional."}},"required":["ask","target_rate","walk_away_rate"]}},{"name":"check_offer","title":"Check one offer against your need and limits","description":"Checks one offer, line by line, against the person's need (area, positions, clear height, temperature, dock doors, must-haves, distance, start date, duration) and limits (all-in rate, monthly, total, approval line, longest term, deposit, yearly increase, notice). Each line passes, fails, needs the person's yes or is unknown because the offer doesn't say; the unknowns come back as questions for the provider. Verdict: fits, fits_with_yes, does_not_fit or incomplete, with the all-in cost. Uses only the numbers you send: it doesn't approve, book or vouch for any space, and a fit is not a yes.","get":"https://warehouse.md/api/v1/check_offer","post":"https://warehouse.md/api/v1/check_offer","example_body":{"offer":{"label":"Space A","area":11000,"rate":0.98,"basis":"per_sqft_month","term_months":6,"free_months":1,"deposit":10780,"notice_days":30,"start":"2027-03-01","distance":18,"clear_height":28,"dock_doors":4,"temperature":"ambient","features":["sprinklered","dock_levelers"],"source":"message from provider, 2027-02-10"},"need":{"area_min":9000,"area_max":12000,"clear_height_min":24,"temperature":"ambient","dock_doors_min":2,"must_haves":["sprinklered"],"max_distance":30,"start":"2027-03-01","duration_months":6,"flex_days":14},"limits":{"max_rate_area_month":1,"max_monthly":12000,"max_total":70000,"max_term_months":12,"max_deposit_months":1,"max_escalation_pct":4,"max_notice_days":60,"approval_over":50000}},"example_note":"Round illustrative numbers, not market data, a price or a quote; send your own.","input":{"type":"object","properties":{"offer":{"type":"object","description":"The offer: {label, rate, basis, term_months, area?, pallet_positions?, opex?, handling_in?, handling_out?, fees_monthly?, fees_one_time?, deposit?, free_months?, escalation_pct?, notice_days?, start?, distance?, clear_height?, dock_doors?, temperature?, features?, source?}.","properties":{"id":{"type":"string","maxLength":80},"label":{"type":"string","maxLength":80,"description":"A generic label such as Space A."},"area":{"type":"number","minimum":0,"description":"Area offered, sq ft (m² with units metric)."},"pallet_positions":{"type":"number","minimum":0},"rate":{"type":"number","minimum":0,"description":"The rate as quoted, on basis."},"basis":{"type":"string","enum":["per_sqft_month","per_sqft_year","per_sqm_month","per_sqm_year","per_pallet_month","per_pallet_week","per_pallet_day","flat_month"]},"opex":{"type":"number","minimum":0,"description":"Operating costs charged on top, on the same basis as the rate."},"handling_in":{"type":"number","minimum":0,"description":"Per pallet received."},"handling_out":{"type":"number","minimum":0,"description":"Per pallet shipped."},"fees_monthly":{"type":"number","minimum":0},"fees_one_time":{"type":"number","minimum":0},"deposit":{"type":"number","minimum":0,"description":"Refundable deposit, money. Shown apart, not a cost."},"free_months":{"type":"integer","minimum":0},"escalation_pct":{"type":"number","minimum":0,"maximum":100,"description":"Yearly rent increase, %."},"term_months":{"type":"integer","minimum":1,"maximum":600},"notice_days":{"type":"integer","minimum":0},"start":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"distance":{"type":"number","minimum":0,"description":"Distance from your site, mi (km with units metric)."},"clear_height":{"type":"number","minimum":0,"description":"Clear height, ft (m with units metric)."},"dock_doors":{"type":"integer","minimum":0},"temperature":{"type":"string","enum":["ambient","climate_controlled","refrigerated","frozen"]},"features":{"type":"array","items":{"type":"string","enum":["sprinklered","dock_levelers","drive_in_door","fenced_yard","trailer_parking","office","heavy_power","rail_spur","food_grade","temperature_logging","monitored_security","after_hours_access","racking_included","forklift_included","bonded"]},"maxItems":15},"source":{"type":"string","maxLength":500,"description":"Where the offer came from: a URL or 'message from provider'. Never invented."}},"required":["rate","basis","term_months"]},"need":{"type":"object","description":"What the person needs (every field optional): area_min, area_max, pallet_positions, clear_height_min, temperature, dock_doors_min, must_haves, max_distance, start, duration_months, flex_days.","properties":{"area_min":{"type":"number","minimum":0},"area_max":{"type":"number","minimum":0},"pallet_positions":{"type":"number","minimum":0},"clear_height_min":{"type":"number","minimum":0},"temperature":{"type":"string","enum":["ambient","climate_controlled","refrigerated","frozen"]},"dock_doors_min":{"type":"integer","minimum":0},"storage":{"type":"string","enum":["floor","selective_rack","double_deep","drive_in","push_back","pallet_flow"]},"services":{"type":"array","items":{"type":"string","enum":["storage","receiving","pick_pack","cross_dock","kitting","returns","yard"]}},"must_haves":{"type":"array","items":{"type":"string","enum":["sprinklered","dock_levelers","drive_in_door","fenced_yard","trailer_parking","office","heavy_power","rail_spur","food_grade","temperature_logging","monitored_security","after_hours_access","racking_included","forklift_included","bonded"]}},"max_distance":{"type":"number","minimum":0},"start":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"duration_months":{"type":"integer","minimum":1},"flex_days":{"type":"integer","minimum":0}}},"limits":{"type":"object","description":"The person's limits (every field optional): max_rate_area_month (all in), max_monthly, max_total, max_term_months, max_deposit_months, max_escalation_pct, max_notice_days, approval_over.","properties":{"max_rate_area_month":{"type":"number","minimum":0,"description":"All-in cap per sq ft (m²) per month, after free months and escalation."},"max_monthly":{"type":"number","minimum":0},"max_total":{"type":"number","minimum":0},"max_term_months":{"type":"integer","minimum":1},"max_deposit_months":{"type":"number","minimum":0},"max_escalation_pct":{"type":"number","minimum":0},"max_notice_days":{"type":"integer","minimum":0},"approval_over":{"type":"number","minimum":0,"description":"A commitment total over this needs the person's recorded yes."},"hold_without_asking_hours":{"type":"number","minimum":0}}},"units":{"type":"string","enum":["imperial","metric"],"default":"imperial","description":"imperial (default): areas in sq ft, lengths in ft, distances in mi. metric: m², m and km. Applies to every area, length and distance you send and get back."},"currency":{"type":"string","maxLength":3,"pattern":"^[A-Za-z]{3}$","description":"Your currency as a three-letter ISO 4217 code, used only to label money in the result. Nothing is converted. Optional."},"pallets_avg":{"type":"number","minimum":0,"maximum":10000000,"description":"Pallets stored on average: prices a per-pallet rate when the offer has no pallet_positions."},"pallets_in_month":{"type":"number","minimum":0,"maximum":10000000,"description":"Pallets received a month, for handling_in."},"pallets_out_month":{"type":"number","minimum":0,"maximum":10000000,"description":"Pallets shipped a month, for handling_out."}},"required":["offer"]}},{"name":"check_warehouse_md","title":"Check a WAREHOUSE.md file","description":"Checks a WAREHOUSE.md file (version 1, https://warehouse.md/spec.md) sent in \"text\": the frontmatter, every section and table, ids and terms hashes, and the rules that keep the agent inside the person's limits. It fails a counter past a limit without the person's yes on its terms hash, a hold past the free window without a yes, a booking without the person's yes on its exact terms, and a booking whose terms changed after the yes. Returns errors (E), warnings (W), the parsed JSON form, the booking gate and a summary. A file holding card, bank, password, key or ID numbers is refused (R), not checked. Checks and drafts only: nothing is listed, held, sent, booked, signed or paid, and no space, rate or availability comes from us. A passing check means the file is consistent, not that any term is fair, legal or available.","get":"https://warehouse.md/api/v1/check_warehouse_md","post":"https://warehouse.md/api/v1/check_warehouse_md","example_get":"https://warehouse.md/api/v1/check_warehouse_md?text=---%0Awarehouse%3A+1%0Akind%3A+request%0Aid%3A+wr_ebc623d97d902117%0Atitle%3A+Spring+overflow%0Aupdated%3A+2026-10-29%0Astatus%3A+scoping%0Aunits%3A+imperial%0Acurrency%3A+USD%0Aapprover%3A+user%0A---%0A%0A%23+Spring+overflow%0A%0A%3E+WAREHOUSE.md+version+1+%28https%3A%2F%2Fwarehouse.md%2Fspec.md%29%3A+the+working+file+for+one+space+search%2C+kept+by+the+agent+in+the+person%27s+project.+Add+rows+as+you+go%3B+don%27t+rewrite+history.+The+person%27s+yes+goes+in+Decisions+with+the+terms+hash+it+covers%2C+and+a+booking+counts+only+with+a+yes+on+its+exact+terms.%0A%3E%0A%3E+Every+rate%2C+date+and+space+in+this+file+comes+from+the+person+or+a+provider%2C+with+its+source.+Nothing+here+is+a+listing%2C+a+quote+or+a+promise+of+space.+The+agent+never+signs+and+never+pays.%0A%0A%23%23+Need%0A%0A%7C+field+%7C+value+%7C%0A%7C+---+%7C+---+%7C%0A%7C+area_min+%7C+8000+%7C%0A%7C+area_max+%7C+14000+%7C%0A%7C+pallet_positions+%7C+600+%7C%0A%7C+storage+%7C+selective_rack+%7C%0A%7C+max_distance+%7C+30+%7C%0A%7C+distance_basis+%7C+drive+%7C%0A%7C+start+%7C+2026-11-15+%7C%0A%7C+duration_months+%7C+4+%7C%0A%0A%23%23+Must-haves%0A%0A-+sprinklered%0A-+dock_levelers%0A%0A%23%23+Limits%0A%0A%7C+field+%7C+value+%7C%0A%7C+---+%7C+---+%7C%0A%7C+max_rate_area_month+%7C+1.1+%7C%0A%7C+max_monthly+%7C+12500+%7C%0A%7C+max_total+%7C+50000+%7C%0A%7C+max_term_months+%7C+6+%7C%0A%0A%23%23+Approvals%0A%0A%7C+field+%7C+value+%7C%0A%7C+---+%7C+---+%7C%0A%7C+contact_providers+%7C+draft_only+%7C%0A%7C+share_details+%7C+none+%7C%0A%7C+hold_without_asking_hours+%7C+24+%7C%0A%7C+approval_over+%7C+30000+%7C%0A%7C+max_rounds+%7C+2+%7C%0A%7C+signing+%7C+never+%7C%0A%7C+payments+%7C+never+%7C%0A%0AFixed+rules%2C+never+settings%3A+the+agent+never+signs%2C+accepts+or+e-signs+a+lease%2C+license+or+booking+agreement%3B+never+pays%2C+wires+or+promises+a+deposit+or+fee%3B+never+gives+bank%2C+card%2C+tax+or+ID+details%3B+never+invents+a+space%2C+a+rate%2C+a+date+or+a+competing+offer%3B+and+sends+a+booking+request+only+after+the+person%27s+recorded+yes+on+the+exact+terms.%0A%0A%23%23+Options%0A%0A%7C+id+%7C+label+%7C+source+%7C+area+%7C+positions+%7C+distance+%7C+start+%7C+term+%7C+rate+%7C+basis+%7C+verdict+%7C+note+%7C%0A%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C%0A%0A%23%23+Offers%0A%0A%7C+id+%7C+at+%7C+option+%7C+from+%7C+area+%7C+positions+%7C+rate+%7C+basis+%7C+term+%7C+start+%7C+free+%7C+escalation+%7C+deposit+%7C+notice+%7C+extra+%7C+terms+%7C+note+%7C%0A%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C%0A%0A%23%23+Holds%0A%0A%7C+id+%7C+option+%7C+placed+%7C+until+%7C+free+%7C+approval+%7C+note+%7C%0A%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C%0A%0A%23%23+Decisions%0A%0A%7C+id+%7C+at+%7C+by+%7C+decision+%7C+terms+%7C+note+%7C%0A%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C%0A","example_body":{"text":"---\nwarehouse: 1\nkind: request\nid: wr_ebc623d97d902117\ntitle: Spring overflow\nupdated: 2026-10-29\nstatus: scoping\nunits: imperial\ncurrency: USD\napprover: user\n---\n\n# Spring overflow\n\n> WAREHOUSE.md version 1 (https://warehouse.md/spec.md): the working file for one space search, kept by the agent in the person's project. Add rows as you go; don't rewrite history. The person's yes goes in Decisions with the terms hash it covers, and a booking counts only with a yes on its exact terms.\n>\n> Every rate, date and space in this file comes from the person or a provider, with its source. Nothing here is a listing, a quote or a promise of space. The agent never signs and never pays.\n\n## Need\n\n| field | value |\n| --- | --- |\n| area_min | 8000 |\n| area_max | 14000 |\n| pallet_positions | 600 |\n| storage | selective_rack |\n| max_distance | 30 |\n| distance_basis | drive |\n| start | 2026-11-15 |\n| duration_months | 4 |\n\n## Must-haves\n\n- sprinklered\n- dock_levelers\n\n## Limits\n\n| field | value |\n| --- | --- |\n| max_rate_area_month | 1.1 |\n| max_monthly | 12500 |\n| max_total | 50000 |\n| max_term_months | 6 |\n\n## Approvals\n\n| field | value |\n| --- | --- |\n| contact_providers | draft_only |\n| share_details | none |\n| hold_without_asking_hours | 24 |\n| approval_over | 30000 |\n| max_rounds | 2 |\n| signing | never |\n| payments | never |\n\nFixed rules, never settings: the agent never signs, accepts or e-signs a lease, license or booking agreement; never pays, wires or promises a deposit or fee; never gives bank, card, tax or ID details; never invents a space, a rate, a date or a competing offer; and sends a booking request only after the person's recorded yes on the exact terms.\n\n## Options\n\n| id | label | source | area | positions | distance | start | term | rate | basis | verdict | note |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n\n## Offers\n\n| id | at | option | from | area | positions | rate | basis | term | start | free | escalation | deposit | notice | extra | terms | note |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n\n## Holds\n\n| id | option | placed | until | free | approval | note |\n| --- | --- | --- | --- | --- | --- | --- |\n\n## Decisions\n\n| id | at | by | decision | terms | note |\n| --- | --- | --- | --- | --- | --- |\n"},"example_note":"Round illustrative numbers, not market data, a price or a quote; send your own.","input":{"type":"object","properties":{"text":{"type":"string","maxLength":49152,"description":"The whole WAREHOUSE.md file, as text (up to 48 KB)."},"today":{"type":"string","maxLength":10,"pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Today, YYYY-MM-DD, for the 30-day staleness and run-out-hold warnings. Default: today's UTC date."}},"required":["text"]}},{"name":"build_warehouse_md","title":"Start a WAREHOUSE.md file","description":"Writes a new WAREHOUSE.md request file (version 1, https://warehouse.md/spec.md) from the person's need, must-haves, limits and approvals, or from their settings (the same keys as the skill's settings, e.g. area_min, max_distance, duration_months, max_total, contact_providers), and checks it. Fields given directly win over settings. Returns the file, its request id (wr_...) and its check result. Options may be added with their sources; offers, holds, decisions and the booking are added later as rows. Every number is the caller's. Checks and drafts only: nothing is listed, held, sent, booked, signed or paid, and no space, rate or availability comes from us. A passing check means the file is consistent, not that any term is fair, legal or available.","get":"https://warehouse.md/api/v1/build_warehouse_md","post":"https://warehouse.md/api/v1/build_warehouse_md","example_body":{"title":"Spring overflow","today":"2026-10-29","currency":"USD","need":{"area_min":8000,"area_max":14000,"pallet_positions":600,"storage":"selective_rack","max_distance":30,"distance_basis":"drive","start":"2026-11-15","duration_months":4},"must_haves":["sprinklered","dock_levelers"],"limits":{"max_rate_area_month":1.1,"max_monthly":12500,"max_total":50000,"max_term_months":6},"approvals":{"contact_providers":"draft_only","hold_without_asking_hours":24,"approval_over":30000,"max_rounds":2}},"example_note":"Round illustrative numbers, not market data, a price or a quote; send your own.","input":{"type":"object","properties":{"title":{"type":"string","maxLength":120,"description":"A short title for this space search, e.g. Spring overflow. No personal names needed."},"today":{"type":"string","maxLength":10,"pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Today, YYYY-MM-DD: the file's updated date and the day start_within_days counts from. Default: today's UTC date."},"status":{"type":"string","enum":["scoping","searching","comparing","negotiating","holding","booking","booked","closed"],"description":"Where the search stands. Default scoping."},"units":{"type":"string","enum":["imperial","metric"],"description":"imperial (sq ft, ft, mi) or metric (m², m, km). Default imperial, or the settings' units."},"currency":{"type":"string","maxLength":3,"pattern":"^[A-Za-z]{3}$","description":"ISO 4217 code, e.g. USD. Default: the settings' currency, else XXX (not set yet)."},"approver":{"type":"string","maxLength":32,"pattern":"^[a-z][a-z_-]{1,31}$","description":"Who says yes, as a role word: user, owner or person. Default user."},"need":{"type":"object","description":"Need fields: area_min, area_max, pallet_positions, pallets_avg, pallets_in_month, pallets_out_month, clear_height_min, temperature, dock_doors_min, storage, services (list), near ({label, x, y} or {label, lat, lon}), max_distance, distance_basis, access_hours, start (YYYY-MM-DD), duration_months, flex_days."},"must_haves":{"type":"array","maxItems":15,"items":{"type":"string","enum":["sprinklered","dock_levelers","drive_in_door","fenced_yard","trailer_parking","office","heavy_power","rail_spur","food_grade","temperature_logging","monitored_security","after_hours_access","racking_included","forklift_included","bonded"]},"description":"Feature keys the space must have: sprinklered, dock_levelers, drive_in_door, fenced_yard, trailer_parking, office, heavy_power, rail_spur, food_grade, temperature_logging, monitored_security, after_hours_access, racking_included, forklift_included, bonded."},"limits":{"type":"object","description":"Limits: max_rate_area_month, max_monthly, max_total, max_term_months, max_deposit_months, max_escalation_pct, max_notice_days. The person's own numbers."},"approvals":{"type":"object","description":"Approvals: contact_providers (draft_only, send_after_ok, send_within_limits), share_details (none, after_ok, business), hold_without_asking_hours, approval_over, max_rounds. Signing and payments are always never."},"settings":{"type":"object","description":"The person's settings by key, as the skill's settings tool takes them. Written into Need, Limits and Approvals, with the rest as notes."},"options":{"type":"array","maxItems":20,"items":{"type":"object"},"description":"Options found so far: {id, label, source, area, positions, distance, start, term, rate, basis (per_sqft_month, per_sqft_year, per_sqm_month, per_sqm_year, per_pallet_month, per_pallet_week, per_pallet_day, flat_month), verdict, note}. Every option needs its source."},"notes":{"type":"array","maxItems":20,"items":{"type":"string"},"description":"Short notes for the Notes section."}}}},{"name":"booking_packet","title":"Prepare a booking packet","description":"From a WAREHOUSE.md request file (in \"text\") and an offer id, or an option id (its latest offer): the exact terms, their hash (wt_...), the all-in cost on the shared formula, what needs the person's yes, the blockers, a checklist and a neutral booking request draft with placeholders. ready is true only when the file records the person's yes (approve_booking) on these exact terms and the file has no errors. Checks and drafts only: nothing is listed, held, sent, booked, signed or paid, and no space, rate or availability comes from us. A passing check means the file is consistent, not that any term is fair, legal or available. The person reads and signs any agreement and pays any deposit themselves.","get":"https://warehouse.md/api/v1/booking_packet","post":"https://warehouse.md/api/v1/booking_packet","example_get":"https://warehouse.md/api/v1/booking_packet?text=---%0Awarehouse%3A+1%0Akind%3A+request%0Aid%3A+wr_5e562fcb7e284ea6%0Atitle%3A+Seasonal+overflow%2C+600+pallets+%28example%29%0Aupdated%3A+2026-10-23%0Astatus%3A+booked%0Aunits%3A+imperial%0Acurrency%3A+USD%0Aapprover%3A+user%0A---%0A%0A%23+Seasonal+overflow%2C+600+pallets+%28example%29%0A%0A%3E+When+to+use%3A+a+few+months+of+extra+pallet+space+for+a+seasonal+peak%2C+from+the+first+ask+to+a+confirmed+booking.%0A%3E%0A%3E+Example%3A+every+label%2C+number%2C+date+and+source+in+this+file+is+made+up%2C+to+show+the+format.+Replace+them+with+your+own%2C+or+start+fresh+with+build_warehouse_md.%0A%3E%0A%3E+WAREHOUSE.md+version+1%3A+https%3A%2F%2Fwarehouse.md%2Fspec.md.+The+person%27s+yes+goes+in+Decisions+with+the+terms+hash+it+covers%3B+a+booking+counts+only+with+a+yes+on+its+exact+terms.+The+agent+never+signs+and+never+pays.%0A%0A%23%23+Need%0A%0A%7C+field+%7C+value+%7C%0A%7C+---+%7C+---+%7C%0A%7C+area_min+%7C+8000+%7C%0A%7C+area_max+%7C+14000+%7C%0A%7C+pallet_positions+%7C+600+%7C%0A%7C+pallets_avg+%7C+560+%7C%0A%7C+pallets_in_month+%7C+180+%7C%0A%7C+pallets_out_month+%7C+180+%7C%0A%7C+clear_height_min+%7C+24+%7C%0A%7C+temperature+%7C+ambient+%7C%0A%7C+dock_doors_min+%7C+2+%7C%0A%7C+storage+%7C+selective_rack+%7C%0A%7C+services+%7C+receiving%2C+storage+%7C%0A%7C+near+%7C+label+Our+plant%3B+x+40%3B+y+52+%7C%0A%7C+max_distance+%7C+30+%7C%0A%7C+distance_basis+%7C+drive+%7C%0A%7C+access_hours+%7C+business+%7C%0A%7C+start+%7C+2026-11-15+%7C%0A%7C+duration_months+%7C+4+%7C%0A%7C+flex_days+%7C+14+%7C%0A%0A%23%23+Must-haves%0A%0A-+sprinklered%0A-+dock_levelers%0A-+racking_included%0A%0A%23%23+Limits%0A%0A%7C+field+%7C+value+%7C%0A%7C+---+%7C+---+%7C%0A%7C+max_rate_area_month+%7C+1.1+%7C%0A%7C+max_monthly+%7C+12500+%7C%0A%7C+max_total+%7C+50000+%7C%0A%7C+max_term_months+%7C+6+%7C%0A%7C+max_deposit_months+%7C+1+%7C%0A%7C+max_escalation_pct+%7C+3+%7C%0A%7C+max_notice_days+%7C+30+%7C%0A%0A%23%23+Approvals%0A%0A%7C+field+%7C+value+%7C%0A%7C+---+%7C+---+%7C%0A%7C+contact_providers+%7C+draft_only+%7C%0A%7C+share_details+%7C+after_ok+%7C%0A%7C+hold_without_asking_hours+%7C+24+%7C%0A%7C+approval_over+%7C+30000+%7C%0A%7C+max_rounds+%7C+2+%7C%0A%7C+signing+%7C+never+%7C%0A%7C+payments+%7C+never+%7C%0A%0AFixed+rules%2C+never+settings%3A+the+agent+never+signs%2C+accepts+or+e-signs+a+lease%2C+license+or+booking+agreement%3B+never+pays%2C+wires+or+promises+a+deposit+or+fee%3B+never+gives+bank%2C+card%2C+tax+or+ID+details%3B+never+invents+a+space%2C+a+rate%2C+a+date+or+a+competing+offer%3B+and+sends+a+booking+request+only+after+the+person%27s+recorded+yes+on+the+exact+terms.%0A%0A%23%23+Options%0A%0A%7C+id+%7C+label+%7C+source+%7C+area+%7C+positions+%7C+distance+%7C+start+%7C+term+%7C+rate+%7C+basis+%7C+verdict+%7C+note+%7C%0A%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C%0A%7C+space-a+%7C+Space+A+%7C+https%3A%2F%2Fexample.com%2Fspaces%2Fa+%7C+11000+%7C+620+%7C+18+%7C+2026-11-15+%7C+4+%7C+1.05+%7C+per_sqft_month+%7C+fits_with_yes+%7C+Over+the+approval+line+in+total.+%7C%0A%7C+space-b+%7C+Space+B+%7C+message+from+provider%2C+2026-10-19+%7C+-+%7C+600+%7C+24+%7C+2026-11-10+%7C+4+%7C+17.5+%7C+per_pallet_month+%7C+fits_with_yes+%7C+Handling+6+in+and+6+out+a+pallet.+%7C%0A%7C+space-c+%7C+Space+C+%7C+https%3A%2F%2Fexample.com%2Fspaces%2Fc+%7C+9500+%7C+-+%7C+27+%7C+2026-12-01+%7C+6+%7C+0.85+%7C+per_sqft_month+%7C+does_not_fit+%7C+18+ft+clear%3A+too+low+for+the+racks.+%7C%0A%0A%23%23+Offers%0A%0A%7C+id+%7C+at+%7C+option+%7C+from+%7C+area+%7C+positions+%7C+rate+%7C+basis+%7C+term+%7C+start+%7C+free+%7C+escalation+%7C+deposit+%7C+notice+%7C+extra+%7C+terms+%7C+note+%7C%0A%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C%0A%7C+wo_6f78730c6644806e+%7C+2026-10-20T15%3A00Z+%7C+space-a+%7C+provider+%7C+11000+%7C+-+%7C+1.05+%7C+per_sqft_month+%7C+4+%7C+2026-11-15+%7C+0+%7C+0+%7C+11550+%7C+30+%7C+-+%7C+wt_80fd42f9bd889817+%7C+First+ask%2C+by+message.+%7C%0A%7C+wo_8d310dfc3271000f+%7C+2026-10-21T10%3A00Z+%7C+space-a+%7C+agent+%7C+11000+%7C+-+%7C+0.96+%7C+per_sqft_month+%7C+4+%7C+2026-11-15+%7C+0+%7C+0+%7C+10560+%7C+30+%7C+-+%7C+wt_1b5442d6b2645bd9+%7C+Counter%2C+drafted%3B+the+person+sent+it.+%7C%0A%7C+wo_2cdddd93aa932e94+%7C+2026-10-22T16%3A00Z+%7C+space-a+%7C+provider+%7C+11000+%7C+-+%7C+1+%7C+per_sqft_month+%7C+4+%7C+2026-11-15+%7C+0+%7C+0+%7C+11000+%7C+30+%7C+-+%7C+wt_a259f0eb4ef08cb7+%7C+Provider%27s+counter%3B+met+in+the+middle.+%7C%0A%0A%23%23+Holds%0A%0A%7C+id+%7C+option+%7C+placed+%7C+until+%7C+free+%7C+approval+%7C+note+%7C%0A%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C%0A%7C+wh_1351424c05f3f007+%7C+space-a+%7C+2026-10-22T17%3A00Z+%7C+2026-10-23T17%3A00Z+%7C+yes+%7C+within_limits+%7C+Free%2C+binds+nothing%2C+24+hours.+%7C%0A%0A%23%23+Booking%0A%0A%7C+field+%7C+value+%7C%0A%7C+---+%7C+---+%7C%0A%7C+option+%7C+space-a+%7C%0A%7C+offer+%7C+wo_2cdddd93aa932e94+%7C%0A%7C+terms+%7C+wt_a259f0eb4ef08cb7+%7C%0A%7C+status+%7C+confirmed+%7C%0A%7C+decision+%7C+wd_9f6e6b52538c5ea0+%7C%0A%7C+requested_at+%7C+2026-10-23T10%3A00Z+%7C%0A%7C+confirmed_at+%7C+2026-10-23T15%3A20Z+%7C%0A%7C+reference+%7C+EX-1042+%7C%0A%0A%23%23+Decisions%0A%0A%7C+id+%7C+at+%7C+by+%7C+decision+%7C+terms+%7C+note+%7C%0A%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C+---+%7C%0A%7C+wd_16a3ac0e44fccbde+%7C+2026-10-21T09%3A00Z+%7C+person+%7C+approve_offer+%7C+wt_1b5442d6b2645bd9+%7C+Over+the+approval+line+%2842%2C240+in+total%29%3B+the+person+said+yes+to+this+counter.+%7C%0A%7C+wd_9f6e6b52538c5ea0+%7C+2026-10-23T09%3A30Z+%7C+person+%7C+approve_booking+%7C+wt_a259f0eb4ef08cb7+%7C+Yes+to+these+exact+terms%2C+after+reading+them+in+plain+words.+%7C%0A%0A%23%23+Notes%0A%0A-+Negotiation+style%3A+quick%2C+one+counter+near+the+target%2C+then+ask.%0A-+Space+B+stays+the+fallback+if+Space+A+falls+through.%0A&option=space-a","example_body":{"text":"---\nwarehouse: 1\nkind: request\nid: wr_5e562fcb7e284ea6\ntitle: Seasonal overflow, 600 pallets (example)\nupdated: 2026-10-23\nstatus: booked\nunits: imperial\ncurrency: USD\napprover: user\n---\n\n# Seasonal overflow, 600 pallets (example)\n\n> When to use: a few months of extra pallet space for a seasonal peak, from the first ask to a confirmed booking.\n>\n> Example: every label, number, date and source in this file is made up, to show the format. Replace them with your own, or start fresh with build_warehouse_md.\n>\n> WAREHOUSE.md version 1: https://warehouse.md/spec.md. The person's yes goes in Decisions with the terms hash it covers; a booking counts only with a yes on its exact terms. The agent never signs and never pays.\n\n## Need\n\n| field | value |\n| --- | --- |\n| area_min | 8000 |\n| area_max | 14000 |\n| pallet_positions | 600 |\n| pallets_avg | 560 |\n| pallets_in_month | 180 |\n| pallets_out_month | 180 |\n| clear_height_min | 24 |\n| temperature | ambient |\n| dock_doors_min | 2 |\n| storage | selective_rack |\n| services | receiving, storage |\n| near | label Our plant; x 40; y 52 |\n| max_distance | 30 |\n| distance_basis | drive |\n| access_hours | business |\n| start | 2026-11-15 |\n| duration_months | 4 |\n| flex_days | 14 |\n\n## Must-haves\n\n- sprinklered\n- dock_levelers\n- racking_included\n\n## Limits\n\n| field | value |\n| --- | --- |\n| max_rate_area_month | 1.1 |\n| max_monthly | 12500 |\n| max_total | 50000 |\n| max_term_months | 6 |\n| max_deposit_months | 1 |\n| max_escalation_pct | 3 |\n| max_notice_days | 30 |\n\n## Approvals\n\n| field | value |\n| --- | --- |\n| contact_providers | draft_only |\n| share_details | after_ok |\n| hold_without_asking_hours | 24 |\n| approval_over | 30000 |\n| max_rounds | 2 |\n| signing | never |\n| payments | never |\n\nFixed rules, never settings: the agent never signs, accepts or e-signs a lease, license or booking agreement; never pays, wires or promises a deposit or fee; never gives bank, card, tax or ID details; never invents a space, a rate, a date or a competing offer; and sends a booking request only after the person's recorded yes on the exact terms.\n\n## Options\n\n| id | label | source | area | positions | distance | start | term | rate | basis | verdict | note |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| space-a | Space A | https://example.com/spaces/a | 11000 | 620 | 18 | 2026-11-15 | 4 | 1.05 | per_sqft_month | fits_with_yes | Over the approval line in total. |\n| space-b | Space B | message from provider, 2026-10-19 | - | 600 | 24 | 2026-11-10 | 4 | 17.5 | per_pallet_month | fits_with_yes | Handling 6 in and 6 out a pallet. |\n| space-c | Space C | https://example.com/spaces/c | 9500 | - | 27 | 2026-12-01 | 6 | 0.85 | per_sqft_month | does_not_fit | 18 ft clear: too low for the racks. |\n\n## Offers\n\n| id | at | option | from | area | positions | rate | basis | term | start | free | escalation | deposit | notice | extra | terms | note |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| wo_6f78730c6644806e | 2026-10-20T15:00Z | space-a | provider | 11000 | - | 1.05 | per_sqft_month | 4 | 2026-11-15 | 0 | 0 | 11550 | 30 | - | wt_80fd42f9bd889817 | First ask, by message. |\n| wo_8d310dfc3271000f | 2026-10-21T10:00Z | space-a | agent | 11000 | - | 0.96 | per_sqft_month | 4 | 2026-11-15 | 0 | 0 | 10560 | 30 | - | wt_1b5442d6b2645bd9 | Counter, drafted; the person sent it. |\n| wo_2cdddd93aa932e94 | 2026-10-22T16:00Z | space-a | provider | 11000 | - | 1 | per_sqft_month | 4 | 2026-11-15 | 0 | 0 | 11000 | 30 | - | wt_a259f0eb4ef08cb7 | Provider's counter; met in the middle. |\n\n## Holds\n\n| id | option | placed | until | free | approval | note |\n| --- | --- | --- | --- | --- | --- | --- |\n| wh_1351424c05f3f007 | space-a | 2026-10-22T17:00Z | 2026-10-23T17:00Z | yes | within_limits | Free, binds nothing, 24 hours. |\n\n## Booking\n\n| field | value |\n| --- | --- |\n| option | space-a |\n| offer | wo_2cdddd93aa932e94 |\n| terms | wt_a259f0eb4ef08cb7 |\n| status | confirmed |\n| decision | wd_9f6e6b52538c5ea0 |\n| requested_at | 2026-10-23T10:00Z |\n| confirmed_at | 2026-10-23T15:20Z |\n| reference | EX-1042 |\n\n## Decisions\n\n| id | at | by | decision | terms | note |\n| --- | --- | --- | --- | --- | --- |\n| wd_16a3ac0e44fccbde | 2026-10-21T09:00Z | person | approve_offer | wt_1b5442d6b2645bd9 | Over the approval line (42,240 in total); the person said yes to this counter. |\n| wd_9f6e6b52538c5ea0 | 2026-10-23T09:30Z | person | approve_booking | wt_a259f0eb4ef08cb7 | Yes to these exact terms, after reading them in plain words. |\n\n## Notes\n\n- Negotiation style: quick, one counter near the target, then ask.\n- Space B stays the fallback if Space A falls through.\n","option":"space-a"},"example_note":"Round illustrative numbers, not market data, a price or a quote; send your own.","input":{"type":"object","properties":{"text":{"type":"string","maxLength":49152,"description":"The whole WAREHOUSE.md request file, as text (up to 48 KB)."},"offer":{"type":"string","maxLength":40,"description":"The offer id (wo_...) to book."},"option":{"type":"string","maxLength":40,"description":"Or an option id: its latest recorded offer is used."},"today":{"type":"string","maxLength":10,"pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Today, YYYY-MM-DD, for the file's date checks. Default: today's UTC date."}},"required":["text"]}},{"name":"warehouse_template","title":"Get a starter WAREHOUSE.md file","description":"Serves ready-to-copy WAREHOUSE.md files (version 1, https://warehouse.md/spec.md): nine request files at different stages (seasonal overflow, cold storage for food, construction materials, event equipment, a retail remodel, a manufacturing buffer, a fulfillment trial, a first lease, a business move) and a provider's listing. Without kind it lists them; with kind it returns the text and its check result. Every label, number, date and source in them is made up.","get":"https://warehouse.md/api/v1/warehouse_template","post":"https://warehouse.md/api/v1/warehouse_template","example_get":"https://warehouse.md/api/v1/warehouse_template?kind=seasonal-overflow","example_body":{"kind":"seasonal-overflow"},"example_note":"Round illustrative numbers, not market data, a price or a quote; send your own.","input":{"type":"object","properties":{"kind":{"type":"string","enum":["seasonal-overflow","cold-storage-food","construction-materials","event-equipment","retail-remodel","manufacturing-buffer","fulfillment-trial","first-lease","business-move","listing-example"],"description":"Which starter: seasonal-overflow, cold-storage-food, construction-materials, event-equipment, retail-remodel, manufacturing-buffer, fulfillment-trial, first-lease, business-move, listing-example. Leave out for the list."}}}},{"name":"build_settings","title":"Write your settings into the skill","description":"Turns a preset and settings into the sections written at the top of WAREHOUSE.md. Every setting is a number or a fixed choice; the catalog is at https://warehouse.md/api/v1/settings. Returns the sections as Markdown, the settings as JSON, a link to the skill with them written in and a one-line install. Out-of-range numbers are clamped with a note. Nothing is stored. Settings an agent drafted count only after the person says yes: show them to the person first, and follow them only once they agree.","get":"https://warehouse.md/api/v1/build_settings","post":"https://warehouse.md/api/v1/build_settings","example_get":"https://warehouse.md/api/v1/build_settings?preset=recommended","example_body":{"preset":"recommended"},"example_note":"Round illustrative numbers, not market data, a price or a quote; send your own.","input":{"type":"object","properties":{"preset":{"type":"string","enum":["core","recommended","seasonal_overflow","long_lease","cold_chain","short_notice"],"description":"Starting point: core, recommended, seasonal_overflow, long_lease, cold_chain, short_notice. Applied first; each setting overrides it."},"units":{"type":"string","enum":["imperial","metric"],"description":"Units: imperial (Square feet, feet, miles), metric (Square meters, meters, kilometers). Default imperial."},"area_min":{"type":"number","minimum":0,"maximum":5000000,"description":"Smallest space (sq ft). Capped at area_max. Optional; unset clears it. Out-of-range values are clamped."},"area_max":{"type":"number","minimum":0,"maximum":5000000,"description":"Largest space (sq ft). Optional; unset clears it. Out-of-range values are clamped."},"pallet_positions":{"type":"integer","minimum":0,"maximum":500000,"description":"Pallet positions needed (positions). Optional; unset clears it. Out-of-range values are clamped."},"clear_height_min":{"type":"number","minimum":8,"maximum":60,"description":"Lowest clear height (ft). Optional; unset clears it. Out-of-range values are clamped."},"temperature":{"type":"string","enum":["ambient","climate_controlled","refrigerated","frozen","unset"],"description":"Temperature: ambient (Ambient), climate_controlled (Climate controlled), refrigerated (Refrigerated), frozen (Frozen). Optional; unset clears it."},"dock_doors_min":{"type":"integer","minimum":0,"maximum":200,"description":"Dock doors, at least (doors). Optional; unset clears it. Out-of-range values are clamped."},"storage":{"type":"string","enum":["floor","selective_rack","double_deep","drive_in","push_back","pallet_flow","unset"],"description":"How goods are stored: floor (Floor stacked), selective_rack (Selective racks), double_deep (Double-deep racks), drive_in (Drive-in racks), push_back (Push-back racks), pallet_flow (Pallet flow racks). Optional; unset clears it."},"services":{"type":"string","enum":["storage_only","receiving_storage","fulfillment","cross_dock","unset"],"description":"Work done in the space: storage_only (Storage only), receiving_storage (Receiving and storage), fulfillment (Pick, pack and ship), cross_dock (Cross-dock). Optional; unset clears it."},"hazmat":{"type":"string","enum":["none","ask_first","unset"],"description":"Hazardous goods: none (None), ask_first (Ask me before any). Optional; unset clears it."},"max_distance":{"type":"number","minimum":0,"maximum":2000,"description":"Farthest from your site (mi). Optional; unset clears it. Out-of-range values are clamped."},"distance_basis":{"type":"string","enum":["straight_line","drive","unset"],"description":"Measure distance as: straight_line (Straight line), drive (Driving distance). Optional; unset clears it."},"access_hours":{"type":"string","enum":["business","extended","always","unset"],"description":"Access you need: business (Business hours), extended (Early and late), always (Any hour). Optional; unset clears it."},"close_to":{"type":"string","enum":["anywhere","highway","port","rail","airport","unset"],"description":"Close to: anywhere (Anywhere), highway (A highway), port (A port), rail (A rail line), airport (An airport). Optional; unset clears it."},"start_within_days":{"type":"integer","minimum":0,"maximum":730,"description":"Start within (days). Optional; unset clears it. Out-of-range values are clamped."},"duration_months":{"type":"integer","minimum":1,"maximum":240,"description":"Duration (months). Optional; unset clears it. Out-of-range values are clamped."},"flex_days":{"type":"integer","minimum":0,"maximum":180,"description":"Dates can move by (days). Optional; unset clears it. Out-of-range values are clamped."},"max_term_months":{"type":"integer","minimum":1,"maximum":240,"description":"Longest commitment (months). Optional; unset clears it. Out-of-range values are clamped."},"month_to_month":{"type":"string","enum":["prefer","ok","avoid","unset"],"description":"Month to month: prefer (Prefer it), ok (Fine either way), avoid (Avoid it). Optional; unset clears it."},"renewal":{"type":"string","enum":["none","ask","must","unset"],"description":"Option to renew: none (Not needed), ask (Ask for one), must (Must have one). Optional; unset clears it."},"max_notice_days":{"type":"integer","minimum":0,"maximum":365,"description":"Longest notice to leave (days). Optional; unset clears it. Out-of-range values are clamped."},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","other","unset"],"description":"Currency: usd (USD), eur (EUR), gbp (GBP), cad (CAD), aud (AUD), other (Another currency). Optional; unset clears it."},"max_rate_area_month":{"type":"number","minimum":0,"maximum":100,"description":"Highest all-in rate (per sq ft a month). Optional; unset clears it. Out-of-range values are clamped."},"max_monthly":{"type":"number","minimum":0,"maximum":100000000,"description":"Highest monthly total (a month). Optional; unset clears it. Out-of-range values are clamped."},"max_total":{"type":"number","minimum":0,"maximum":1000000000,"description":"Most to commit in total (in total). Optional; unset clears it. Out-of-range values are clamped."},"max_deposit_months":{"type":"number","minimum":0,"maximum":24,"description":"Largest deposit (months of rent). Optional; unset clears it. Out-of-range values are clamped."},"max_escalation_pct":{"type":"number","minimum":0,"maximum":25,"description":"Highest yearly increase (%). Optional; unset clears it. Out-of-range values are clamped."},"report_basis":{"type":"string","enum":["per_sqft_month","per_sqft_year","per_pallet_month","unset"],"description":"Show rates: per_sqft_month (Per sq ft a month), per_sqft_year (Per sq ft a year), per_pallet_month (Per pallet a month). Optional; unset clears it."},"style":{"type":"string","enum":["cooperative","firm","quick","unset"],"description":"Style: cooperative (Cooperative), firm (Firm), quick (Quick). Optional; unset clears it."},"opening_discount_pct":{"type":"integer","minimum":0,"maximum":50,"description":"Open below the ask by (%). Optional; unset clears it. Out-of-range values are clamped."},"max_rounds":{"type":"integer","minimum":1,"maximum":12,"description":"Rounds before asking again (rounds). Optional; unset clears it. Out-of-range values are clamped."},"trade_term_for_rate":{"type":"string","enum":["yes","ask","no","unset"],"description":"Offer a longer term for a lower rate: yes (Yes, within the longest commitment), ask (Ask me first), no (No). Optional; unset clears it."},"ask_free_months":{"type":"string","enum":["yes","no","unset"],"description":"Ask for free months: yes (Yes), no (No). Optional; unset clears it."},"mention_alternatives":{"type":"string","enum":["no","unnamed","yes","unset"],"description":"Mention other options: no (Never), unnamed (Real ones only, without names), yes (Real ones, by name). Optional; unset clears it."},"approver":{"type":"string","enum":["user","owner"],"description":"Who says yes: user (The user), owner (The account owner). Default user."},"contact_providers":{"type":"string","enum":["draft_only","send_after_ok","send_within_limits"],"description":"Messages to providers: draft_only (Drafts only; I send them), send_after_ok (Send each one after my yes), send_within_limits (Send what stays inside these rules). Default draft_only."},"hold_without_asking_hours":{"type":"integer","minimum":0,"maximum":168,"description":"Hold space without asking for up to (hours). Default 0. Out-of-range values are clamped."},"approval_over":{"type":"number","minimum":0,"maximum":1000000000,"description":"Ask before any commitment over (in total). Capped at max_total. Optional; unset clears it. Out-of-range values are clamped."},"share_details":{"type":"string","enum":["none","after_ok","business","unset"],"description":"What your agent may share: none (Nothing about me), after_ok (Only after my yes), business (Business name and volumes only). Optional; unset clears it."},"signing":{"type":"string","enum":["never"],"description":"Leases and booking agreements: never (Never signed by the agent). Default never."},"payments":{"type":"string","enum":["never"],"description":"Deposits and payments: never (Never made by the agent). Default never."},"format":{"type":"string","enum":["section","skill"],"description":"section (default): the settings sections only; skill: the whole skill file too."}}}},{"name":"whats_new","title":"What's new here, and what's next","description":"What changed on warehouse.md and when, what is being built, when to check back, and the other .md sites. Pass since (a date) to get only newer entries, for example the updated date of the skill you have. Reads a list kept with the code; fetches nothing and stores nothing.","get":"https://warehouse.md/api/v1/whats_new","post":"https://warehouse.md/api/v1/whats_new","example_get":"https://warehouse.md/api/v1/whats_new?since=2026-10-01","example_body":{"since":"2026-10-01"},"example_note":"Round illustrative numbers, not market data, a price or a quote; send your own.","input":{"type":"object","properties":{"since":{"type":"string","maxLength":10,"pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Only entries after this date (YYYY-MM-DD)."},"planned":{"type":"boolean","default":true,"description":"Include what is being built and the ideas being weighed. Default true."}}}}],"mcp":{"url":"https://warehouse.md/mcp","transport":"streamable-http, stateless, JSON responses, no auth","add":"claude mcp add --transport http warehouse https://warehouse.md/mcp","tools":["space_calc","compare_spaces","lease_or_flex","location_fit","negotiation_plan","check_offer","check_warehouse_md","build_warehouse_md","booking_packet","warehouse_template","build_settings","whats_new"],"prompts":["warehouse"],"resources":["https://warehouse.md/warehouse.md","https://warehouse.md/api/v1/settings","https://warehouse.md/changelog.md"]},"openapi":"https://warehouse.md/openapi.json","llms_txt":"https://warehouse.md/llms.txt","manifest":"https://warehouse.md/.well-known/warehouse.json","rule":"Settings an agent drafted count only after the person says yes: show them to the person first, and follow them only once they agree.","never":["fetches or shows third-party data, prices or rates","stores what you send","approves, enforces or certifies anything","never lists or holds real space, signs leases or booking agreements, pays deposits or gives a quote"],"disclaimer":"Use at your own risk. warehouse.md is provided as is, without warranty. Information here may be inaccurate, incomplete or not current, and is not verified; figures are estimates from the numbers you send and the formulas stated. Nothing here is real estate, brokerage, leasing, legal, tax, insurance, engineering, fire-code or safety advice, a listing, a quote, or an offer to rent or lease space. warehouse.md never lists or holds real space, signs leases or booking agreements, pays deposits or gives a quote. Check everything yourself before you act on it.","terms":"https://warehouse.md/terms","contact":"support [at] mailbox.bot"}