{"name":"satellite.md","version":"1.0","description":"SATELLITE.md is a plain file a satellite service publishes so agents can read what it offers: imagery, connectivity or telematics, with coverage, latency, formats and how to order. The skill keeps agents inside the person's rules, and the tools do orbit, link, data and cost math on the numbers you send. No live data, no tracking, no transmitting.","skill":{"url":"https://satellite.md/satellite.md","with_settings":"https://satellite.md/satellite.md?preset=recommended"},"settings":"https://satellite.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":"check_satellite_md","title":"Check a SATELLITE.md file","description":"Checks the text of a SATELLITE.md file against the format spec (errors E01-E14, warnings W01-W14, refusal rules R1-R5) and returns each service normalized: numbers as numbers, yes/no as booleans, lists as arrays. Text only: it never fetches a URL, follows a link or queries DNS. A format check, not a check of the claims in the file. Files that offer tracking people, jamming or spoofing, getting around rules, secrets, or control details are refused by line and rule, with no services returned.","get":"https://satellite.md/api/v1/check_satellite_md","post":"https://satellite.md/api/v1/check_satellite_md","example_get":"https://satellite.md/api/v1/check_satellite_md?text=---%0Asatellite%3A+1%0Aupdated%3A+2026-10-01%0A---%0A%0A%23+Example+Orbital%0A%0A-+url%3A+https%3A%2F%2Fexample.com%0A-+contact%3A+https%3A%2F%2Fexample.com%2Fcontact%0A%0A%23%23+Site+broadband%0A%0A-+id%3A+site-broadband%0A-+kind%3A+connectivity%0A-+status%3A+available%0A-+coverage%3A+lat%3A-60..60%0A-+orbit%3A+leo%0A-+down_mbps%3A+150%0A-+rtt_ms%3A+45%0A-+order%3A+https%3A%2F%2Fexample.com%2Forder%0A&served_from_host=example.com","example_body":{"text":"---\nsatellite: 1\nupdated: 2026-10-01\n---\n\n# Example Orbital\n\n- url: https://example.com\n- contact: https://example.com/contact\n\n## Site broadband\n\n- id: site-broadband\n- kind: connectivity\n- status: available\n- coverage: lat:-60..60\n- orbit: leo\n- down_mbps: 150\n- rtt_ms: 45\n- order: https://example.com/order\n","served_from_host":"example.com"},"input":{"type":"object","properties":{"text":{"type":"string","maxLength":65536,"description":"The whole file text, at most 65,536 bytes of UTF-8. Send the text; this tool does not fetch."},"served_from_host":{"type":"string","maxLength":253,"description":"Optional. The host you fetched the file from, such as example.com. Checked against the file's url host and domains (E04)."},"stale_after_days":{"type":"integer","minimum":30,"maximum":730,"default":180,"description":"Optional. Days after updated before the file counts as stale (W01). Default 180."},"as_of":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Optional. The date to judge staleness on, YYYY-MM-DD. Default today (UTC), so a result can be repeated."}},"required":["text"]}},{"name":"match_services","title":"Match services to your needs","description":"Checks services, as check_satellite_md returns them, against your stated needs: each need is pass, fail or unknown on the file's own values, and a missing key is unknown, never pass. Place passes on global coverage, the country, a latitude band holding lat_deg, or oceans for maritime and aviation. No scores, no prices, no ranking: rows are ordered by fewest fails, then fewest unknowns, then input order. Nothing fetched or stored.","get":"https://satellite.md/api/v1/match_services","post":"https://satellite.md/api/v1/match_services","example_body":{"needs":{"kind":"connectivity","country":"CA","lat_deg":53.5,"mobility":"fixed","max_rtt_ms":100,"min_down_mbps":50,"max_contract_months":12},"services":[{"id":"optical","title":"Optical imagery","kind":"imagery","status":"available","line":18,"provider_host":"example.com","file_updated":"2026-10-01","coverage":["global"],"sensor":"multispectral","gsd_m":3,"bands":["blue","green","red","nir"],"bit_depth":12,"archive":true,"tasking":true,"revisit_days":1,"min_order_km2":25,"min_width_km":5,"formats":["cog","geotiff"],"license":"organization","license_url":"https://example.com/imagery-license","stac":"https://api.example.com/stac","api":"https://api.example.com/v1","openapi":"https://api.example.com/openapi.json","auth":"api_key","sandbox":"https://sandbox.example.com","terms":"https://example.com/imagery-terms","price":"quote"},{"id":"site-broadband","title":"Site broadband","kind":"connectivity","status":"available","line":46,"provider_host":"example.com","file_updated":"2026-10-01","coverage":["lat:-60..60"],"sold_in":["US","CA","MX"],"orbit":"leo","down_mbps":150,"up_mbps":20,"speed_basis":"typical","rtt_ms":45,"rtt_basis":"median","mobility":["fixed"],"terminal_class":"flat_panel","cap_policy":"throttle","data_cap_gb":1000,"throttle_mbps":5,"contract_months_min":12,"safety_of_life":"none","order":"https://example.com/order/broadband","price":"90 USD per month"},{"id":"asset-messaging","title":"Asset messaging","kind":"telematics","status":"beta","line":69,"provider_host":"example.com","file_updated":"2026-10-01","coverage":["global"],"sold_in":["see_terms"],"orbit":"leo","max_message_bytes":160,"billing_block_bytes":30,"two_way":true,"latency_minutes":15,"location_precision_options_m":[100,600,1000],"location_retention_days":30,"encryption":"transport","privacy":"https://example.com/privacy","safety_of_life":"none","docs":"https://docs.example.com/messaging","mcp":"https://mcp.example.com","auth":"oauth2","price":"0.01 USD per block"}]},"input":{"type":"object","properties":{"needs":{"type":"object","description":"kind (required, one of the eight kinds); one place: country (ISO 3166-1 alpha-2), lat_deg (-90 to 90, rounded to 0.1), mobility (fixed, land, maritime, aviation); any kind: status_any (default available, beta), max_contract_months, self_serve, sandbox, auth_any; plus the kind's own needs, such as max_gsd_m, max_rtt_ms, min_down_mbps, min_message_bytes, max_accuracy_cm. No free text."},"services":{"type":"array","items":{"type":"object"},"minItems":1,"maxItems":50,"description":"1 to 50 services exactly as check_satellite_md returns them."}},"required":["needs","services"]}},{"name":"build_satellite_md","title":"Build a SATELLITE.md file","description":"Writes a SATELLITE.md file from typed fields (front matter, provider block, one section per service, optional changes), runs check_satellite_md on it and refuses rather than hand out a file that fails the checker. Returns the text, its canonical sha256, the check result, an llms.txt line and a link tag. Writing only; it never fetches the url or any link, and stores nothing.","get":"https://satellite.md/api/v1/build_satellite_md","post":"https://satellite.md/api/v1/build_satellite_md","example_body":{"provider":"Example Orbital","url":"https://example.com","contact":"https://example.com/contact","services":[{"title":"Asset messaging","id":"asset-messaging","kind":"telematics","status":"beta","coverage":["global"],"orbit":"leo","max_message_bytes":160,"two_way":true,"billing_block_bytes":30,"docs":"https://docs.example.com/messaging"}]},"input":{"type":"object","properties":{"provider":{"type":"string","maxLength":80,"description":"The provider's name, 1 to 80 characters."},"description":{"type":"string","maxLength":500,"description":"Optional. One paragraph for people, up to 500 characters."},"url":{"type":"string","maxLength":300,"description":"The provider's site, https."},"contact":{"type":"string","maxLength":300,"description":"An https link or a mailto: address."},"terms":{"type":"string","maxLength":300,"description":"Optional. https link to terms."},"privacy":{"type":"string","maxLength":300,"description":"Optional. https link to the privacy notice."},"acceptable_use":{"type":"string","maxLength":300,"description":"Optional. https link to an acceptable use policy."},"abuse_contact":{"type":"string","maxLength":300,"description":"Optional. https link or mailto: for abuse reports."},"role":{"type":"string","enum":["operator","reseller","integrator","analytics","device_maker"],"description":"Optional. operator, reseller, integrator, analytics or device_maker."},"agent_policy":{"type":"string","enum":["read_only","quote","order_with_approval"],"description":"Optional, default read_only. What the provider lets agents do. Any order still needs the person's yes."},"domains":{"type":"array","items":{"type":"string"},"maxItems":10,"description":"Optional. Up to 10 other hosts the provider owns."},"more":{"type":"array","items":{"type":"string"},"maxItems":20,"description":"Optional. Up to 20 https links to further satellite.md files on the provider's own hosts."},"lang":{"type":"string","maxLength":35,"description":"Optional. BCP 47 tag, default en."},"updated":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Optional. YYYY-MM-DD, default today (UTC)."},"review_by":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Optional. YYYY-MM-DD, default updated + 180 days."},"changes":{"type":"array","items":{"type":"string"},"maxItems":10,"description":"Optional. Up to 10 change lines, each 'YYYY-MM-DD: text' (text up to 200 characters), or { day, text }."},"services":{"type":"array","items":{"type":"object"},"minItems":1,"maxItems":50,"description":"1 to 50 services: { title (1-80), description (optional), id, kind (imagery, connectivity, telematics, positioning, ground_station, analytics, terminal, other), status, coverage[], and the spec keys for that kind, typed: numbers as numbers, yes/no as booleans, lists as arrays; x- keys as strings up to 200 characters }."}},"required":["provider","url","contact","services"]}},{"name":"imagery_order","title":"Size an imagery order","description":"Sizes an imagery order from an area (km2, or a bounding box snapped outward to 0.01 degrees and never echoed) and a resolution or feature size: buffered area, the coarsest resolution that still shows the feature, pixels, data volume, scenes, billed area after a minimum order and strip width, cost at your price, captures and days for your wanted chance of one clear capture (from your own cloud estimate), and web-map zooms and tiles. It sizes an order; it never says when a place will be imaged.","get":"https://satellite.md/api/v1/imagery_order","post":"https://satellite.md/api/v1/imagery_order","example_get":"https://satellite.md/api/v1/imagery_order?area_km2=10&feature_size_m=2&min_order_km2=25&min_width_km=5&price_per_km2=10&currency=USD&p_clear=0.3&revisit_days=2","example_body":{"area_km2":10,"feature_size_m":2,"min_order_km2":25,"min_width_km":5,"price_per_km2":10,"currency":"USD","p_clear":0.3,"revisit_days":2},"input":{"type":"object","properties":{"area_km2":{"type":"number","description":"Area in km2, 0.0001 to 1,000,000. Or send bbox. Use this for areas under about 5 km2.","minimum":0.0001,"maximum":1000000},"bbox":{"type":"array","description":"[west, south, east, north] in degrees (east below west crosses 180). One area only. Snapped outward to a 0.01 degree grid and never echoed.","items":{"type":"number"},"minItems":4,"maxItems":4},"gsd_m":{"type":"number","description":"Ground sample distance you plan to order, metres per pixel.","minimum":0.1,"maximum":1000},"feature_size_m":{"type":"number","description":"Smallest feature that must show, in metres.","minimum":0.1,"maximum":10000},"feature_pixels":{"type":"number","description":"Pixels across the smallest feature. Default 4 (your setting).","minimum":1,"maximum":20,"default":4},"band_count":{"type":"integer","minimum":1,"maximum":500,"default":4,"description":"Spectral bands. Default 4."},"bit_depth":{"type":"integer","minimum":1,"maximum":64,"default":16,"description":"Bits stored per sample. Default 16 (12-bit data is usually stored in 16 bits)."},"compression_ratio":{"type":"number","description":"Delivery compression ratio. Default 1 (none).","minimum":1,"maximum":100,"default":1},"area_buffer_pct":{"type":"number","description":"Buffer added around the area, in percent. Default 10.","minimum":0,"maximum":100,"default":10},"min_order_km2":{"type":"number","description":"Provider's minimum order area in km2. Default 0.","minimum":0,"maximum":1000000,"default":0},"min_width_km":{"type":"number","description":"Provider's minimum strip width in km. Default 0.","minimum":0,"maximum":1000,"default":0},"scene_km2":{"type":"number","description":"Scene size in km2, for a scene count. Optional.","minimum":0.01,"maximum":1000000},"price_per_km2":{"type":"number","description":"Your price per km2. Optional; never filled in.","minimum":0,"maximum":1000000},"currency":{"type":"string","pattern":"^[A-Za-z]{3}$","maxLength":3,"description":"Three-letter currency code for your price, such as USD."},"p_clear":{"type":"number","description":"Your own estimate of the chance one capture is clear, 0 to 1. Not a forecast.","minimum":0,"maximum":1},"revisit_days":{"type":"number","description":"Days between captures, from the provider's file or your own number.","minimum":0.1,"maximum":365},"cloud_correlation":{"type":"number","description":"How much one cloudy capture predicts the next, 0 to 0.95. Default 0.3.","minimum":0,"maximum":0.95,"default":0.3},"clear_target":{"type":"number","description":"Wanted chance of at least one clear capture. Default 0.9.","minimum":0.5,"maximum":0.999,"default":0.9},"lat_deg":{"type":"number","description":"Latitude for web-map zooms, rounded to 0.1 on input. Default the middle of the bbox, else 0.","minimum":-90,"maximum":90},"finest_gsd_m":{"type":"number","description":"Your setting: finest resolution to propose without asking. Default 1.","minimum":0.1,"maximum":1000,"default":1},"smallest_area_km2":{"type":"number","description":"Your setting: smallest area to order without asking the purpose. Default 1.","minimum":0.0001,"maximum":1000000,"default":1}}}},{"name":"network_fit","title":"Check what a link can carry","description":"Works out what a satellite link can carry from your numbers: throughput after overhead, the TCP window and loss limits (Mathis), which one binds, transfer time for a file, the window and number of streams needed, a simplified E-model call score with the one-way delay band, and whether a polling timeout survives the round trip. Give a measured rtt_ms, or an orbit altitude for the physics floor. Slow start is not modeled. Nothing is measured or fetched.","get":"https://satellite.md/api/v1/network_fit","post":"https://satellite.md/api/v1/network_fit","example_get":"https://satellite.md/api/v1/network_fit?down_mbps=100&rtt_ms=600&loss_pct=0.1&file_gb=2","example_body":{"down_mbps":100,"rtt_ms":600,"loss_pct":0.1,"file_gb":2},"input":{"type":"object","properties":{"down_mbps":{"type":"number","description":"Downlink rate in Mbps, 0.001 to 100,000.","minimum":0.001,"maximum":100000},"up_mbps":{"type":"number","description":"Uplink rate in Mbps. Needed when direction is up.","minimum":0.001,"maximum":100000},"direction":{"type":"string","enum":["down","up"],"default":"down","description":"Which way the data flows. Default down."},"rtt_ms":{"type":"number","description":"Measured round-trip time in ms. Or send orbit_altitude_km for the physics floor.","minimum":1,"maximum":5000},"orbit_altitude_km":{"type":"number","description":"Orbit altitude in km, for a round-trip floor when rtt_ms is not known.","minimum":160,"maximum":40000},"elevation_deg":{"type":"number","description":"Elevation angle for the floor, in degrees. Default 10.","minimum":0,"maximum":90,"default":10},"loss_pct":{"type":"number","description":"Packet loss in percent. Default 0.","minimum":0,"maximum":50,"default":0},"jitter_ms":{"type":"number","description":"Jitter in ms. Default 0.","minimum":0,"maximum":1000,"default":0},"tcp_window_kib":{"type":"number","description":"TCP receive window per stream in KiB. Default 64 (no window scaling, a cautious default).","minimum":1,"maximum":1048576,"default":64},"mss_bytes":{"type":"number","description":"TCP maximum segment size in bytes. Default 1,460.","minimum":500,"maximum":9000,"default":1460},"streams":{"type":"integer","minimum":1,"maximum":64,"default":1,"description":"Parallel TCP streams. Default 1."},"overhead_pct":{"type":"number","description":"Protocol and framing overhead in percent. Default 6.","minimum":0,"maximum":50,"default":6},"handshake_rtts":{"type":"integer","minimum":0,"maximum":10,"default":3,"description":"Round trips before data flows: 3 for TCP, TLS 1.3 and the request; 4 with TLS 1.2. Default 3."},"file_gb":{"type":"number","description":"File size in GB, for the transfer time.","minimum":0.000001,"maximum":1000000},"data_units":{"type":"string","enum":["decimal","binary"],"default":"decimal","description":"decimal (GB = 10^9 bytes) or binary (GiB = 2^30 bytes). Default decimal."},"data_cap_gb":{"type":"number","description":"Monthly data cap in GB, for the share one file uses.","minimum":0.001,"maximum":10000000},"codec_ie":{"type":"number","description":"Codec impairment Ie for the call score. Default 0.","minimum":0,"maximum":100,"default":0},"codec_bpl":{"type":"number","description":"Codec packet-loss robustness Bpl. Default 4.3.","minimum":1,"maximum":100,"default":4.3},"codec_delay_ms":{"type":"number","description":"Codec and jitter-buffer delay in ms. Default 20.","minimum":0,"maximum":200,"default":20},"poll_timeout_ms":{"type":"number","description":"A polling or request timeout in ms, to check against the round trip.","minimum":1,"maximum":3600000},"poll_margin_ms":{"type":"number","description":"Safety margin for the polling check in ms. Default 100.","minimum":0,"maximum":60000,"default":100},"target_fraction":{"type":"number","description":"Share of the link the streams should fill. Default 0.8.","minimum":0.1,"maximum":1,"default":0.8}},"required":["down_mbps"]}},{"name":"telematics_budget","title":"Budget a telematics fleet","description":"Budgets a satellite telematics fleet from ranges, not readings: bits per field, packed message size, the decimal places a location precision needs, billing blocks and rounding waste, monthly messages, blocks and cost at your prices, battery life from datasheet numbers, store-and-forward waits, and how many location points a fleet collects and keeps. tracks_people is required and adds a notice when yes. It never takes or returns coordinates, tracks, device IDs or names.","get":"https://satellite.md/api/v1/telematics_budget","post":"https://satellite.md/api/v1/telematics_budget","example_body":{"devices":200,"msgs_per_day":24,"fields":["lat","lon","timestamp_delta_s","battery_pct","temp_c"],"location_precision_m":"100","max_message_bytes":160,"billing_block_bytes":30,"price_per_block":0.01,"currency":"USD","battery_mah":2600,"sleep_ua":20,"tx_ma":300,"tx_s":4,"gnss_ma":25,"gnss_s":30,"passes_per_day":6,"tracks_people":"no"},"input":{"type":"object","properties":{"devices":{"type":"integer","minimum":1,"maximum":10000000,"description":"Number of devices."},"msgs_per_day":{"type":"number","description":"Messages each device sends per day.","minimum":0,"maximum":10000},"payload_bytes":{"type":"integer","minimum":1,"maximum":100000,"description":"Payload bytes per message. Or send fields."},"fields":{"type":"array","description":"Up to 32 fields: preset names (lat, lon, timestamp_delta_s, temp_c, battery_pct, speed_kmh, heading_deg) or { name (1 to 24 characters), min, max, resolution }. Ranges, never readings or coordinates.","items":{},"maxItems":32},"location_precision_m":{"type":"string","enum":["10","100","600","1000","10000"],"default":"100","description":"Location precision in metres for the lat and lon presets: 10, 100, 600, 1000 or 10000 (your setting). Default 100."},"lon_scale_lat_deg":{"type":"number","description":"Latitude at which the longitude step equals the precision. Default 0 keeps the step at or below it everywhere.","minimum":0,"maximum":85,"default":0},"header_bytes":{"type":"integer","minimum":0,"maximum":10000,"default":0,"description":"Bytes added to the packed fields. Default 0."},"overhead_bytes":{"type":"integer","minimum":0,"maximum":10000,"default":0,"description":"Network overhead bytes per message. Default 0."},"max_message_bytes":{"type":"integer","minimum":1,"maximum":100000,"description":"Largest message the service takes, from the provider's file."},"billing_block_bytes":{"type":"integer","minimum":1,"maximum":100000,"description":"Billing block size in bytes. Default: the message size, so no rounding."},"price_per_block":{"type":"number","description":"Your price per billed block.","minimum":0,"maximum":1000000},"price_per_kb":{"type":"number","description":"Your price per 1,000 billed bytes.","minimum":0,"maximum":1000000},"price_per_message":{"type":"number","description":"Your price per message.","minimum":0,"maximum":1000000},"monthly_fee_per_device":{"type":"number","description":"Your monthly fee per device.","minimum":0,"maximum":1000000},"currency":{"type":"string","pattern":"^[A-Za-z]{3}$","maxLength":3,"description":"Three-letter currency code for your prices, such as USD."},"bill_failed_attempts":{"type":"string","enum":["yes","no"],"default":"yes","description":"Whether failed attempts are billed. Default yes."},"success_prob":{"type":"number","description":"Chance one attempt gets through. Default 0.9.","minimum":0.05,"maximum":1,"default":0.9},"battery_mah":{"type":"number","description":"Battery capacity in mAh, from the datasheet.","minimum":1,"maximum":10000000},"usable_fraction":{"type":"number","description":"Share of the capacity you can use. Default 0.8.","minimum":0.05,"maximum":1,"default":0.8},"temp_derate":{"type":"number","description":"Cold-weather derating factor. Default 1.","minimum":0.3,"maximum":1,"default":1},"self_discharge_pct_per_year":{"type":"number","description":"Self-discharge in percent per year. Default 2.","minimum":0,"maximum":50,"default":2},"sleep_ua":{"type":"number","description":"Sleep current in microamps.","minimum":0,"maximum":1000000},"tx_ma":{"type":"number","description":"Transmit current in mA.","minimum":0,"maximum":100000},"tx_s":{"type":"number","description":"Seconds per transmit attempt.","minimum":0,"maximum":3600},"tx_energy_mj":{"type":"number","description":"Energy per transmit attempt in millijoules. Instead of tx_ma and tx_s.","minimum":0,"maximum":1000000},"battery_v":{"type":"number","description":"Battery voltage, for tx_energy_mj. Default 3.6.","minimum":0.5,"maximum":60,"default":3.6},"gnss_ma":{"type":"number","description":"Location fix current in mA.","minimum":0,"maximum":10000},"gnss_s":{"type":"number","description":"Seconds per location fix.","minimum":0,"maximum":3600},"fixes_per_day":{"type":"number","description":"Location fixes per day. Default msgs_per_day.","minimum":0,"maximum":10000},"passes_per_day":{"type":"number","description":"Satellite passes per day, your number, for store-and-forward waits.","minimum":0.01,"maximum":1000},"pass_spacing":{"type":"string","enum":["even","random"],"default":"even","description":"even or random pass spacing. Default even."},"latency_minutes":{"type":"number","description":"Added delivery latency in minutes, from the provider's file.","minimum":0,"maximum":100000},"tracks_people":{"type":"string","enum":["yes","no"],"description":"Required: do the devices go with people (staff, drivers, family)? yes adds a notice."},"retention_days":{"type":"number","description":"Days location points are kept.","minimum":0,"maximum":3650},"off_hours":{"type":"string","enum":["on","off"],"default":"on","description":"on: report around the clock. off: no location outside working hours. Default on."},"work_hours_per_day":{"type":"number","description":"Working hours per day, used when off_hours is off.","minimum":0,"maximum":24}},"required":["devices","msgs_per_day","tracks_people"]}},{"name":"compare_plans","title":"Compare plans over time","description":"Compares 2 to 10 service plans over 1 to 120 months at your own prices: total cost at several usage levels (default 0.5x, 1x and 2x), cost per unit, overage, exit cost before a minimum term, units left unserved under a hard cap, hours throttled, the month one plan overtakes another, downtime from stated availability and the combined availability with a link you already have. Never fills in a missing price. Reports the lowest cost at your numbers, not a pick.","get":"https://satellite.md/api/v1/compare_plans","post":"https://satellite.md/api/v1/compare_plans","example_body":{"unit":"gb","currency":"USD","months":24,"usage_per_month":600,"plans":[{"label":"Plan A","hardware":600,"monthly":120,"included_units":1000,"cap_policy":"throttle","throttle_mbps":5,"min_term_months":12,"early_exit_fee":300,"availability_pct":99.5},{"label":"Plan B","hardware":300,"monthly":90,"included_units":500,"cap_policy":"overage","overage_per_unit":0.5,"availability_pct":99}]},"input":{"type":"object","properties":{"unit":{"type":"string","enum":["gb","messages","km2","minutes","devices"],"description":"What usage is measured in: gb, messages, km2, minutes or devices."},"currency":{"type":"string","pattern":"^[A-Za-z]{3}$","maxLength":3,"description":"One three-letter currency code for every price, such as USD."},"months":{"type":"integer","minimum":1,"maximum":120,"description":"Months to compare over, 1 to 120."},"usage_per_month":{"type":"number","minimum":0,"maximum":1000000000000,"description":"Expected usage per month, in unit."},"multipliers":{"type":"array","description":"Usage levels to try, as multiples of usage_per_month. Default [0.5, 1, 2]. Up to 10, each above 0 and at most 100.","items":{"type":"number"},"minItems":1,"maxItems":10},"plans":{"type":"array","description":"2 to 10 plans: { label (1 to 40 characters), monthly (required), hardware, install, activation, included_units, cap_policy (none, hard, throttle or overage), overage_per_unit, throttle_mbps, min_term_months, early_exit_fee, availability_pct }. Every price is yours, or a file value labelled 'provider states, as of <updated>'.","items":{"type":"object"},"minItems":2,"maxItems":10},"existing_link_availability_pct":{"type":"number","minimum":0,"maximum":100,"description":"Availability of a link you already have, for the combined figure. Optional."}},"required":["unit","currency","months","usage_per_month","plans"]}},{"name":"orbit_geometry","title":"Orbit geometry and dish pointing","description":"Generic circular-orbit geometry from an altitude: period, speed, footprint, slant range, one-way delay, bent-pipe round trip, the longest pass above your minimum elevation, latitude reach and maximum Doppler. With geo_pointing, the azimuth, elevation, skew and range from one site to a geostationary slot, and whether listed obstacles block the beam. Spherical Earth, no time, date or phase. Takes no orbital elements or satellite names and never gives pass times.","get":"https://satellite.md/api/v1/orbit_geometry","post":"https://satellite.md/api/v1/orbit_geometry","example_get":"https://satellite.md/api/v1/orbit_geometry?altitude_km=550&min_elevation_deg=10&freq_ghz=2","example_body":{"altitude_km":550,"min_elevation_deg":10,"freq_ghz":2},"input":{"type":"object","properties":{"altitude_km":{"type":"number","minimum":160,"maximum":40000,"description":"Circular orbit altitude in km, 160 to 40,000. Required unless only geo_pointing is sent."},"min_elevation_deg":{"type":"number","minimum":0,"maximum":90,"default":10,"description":"Lowest elevation angle to plan with, in degrees. Default 10 (your setting)."},"inclination_deg":{"type":"number","minimum":0,"maximum":180,"description":"Orbit inclination in degrees, for latitude reach. Optional."},"freq_ghz":{"type":"number","minimum":0.1,"maximum":100,"description":"Carrier frequency in GHz, for Doppler. Optional."},"site_lat_deg":{"type":"number","minimum":-90,"maximum":90,"description":"Your site latitude, rounded to 0.1 degrees on input, for latitude reach. Optional."},"geo_pointing":{"type":"object","description":"One site only: { site_lat_deg, site_lon_deg (rounded to 0.01 on input), slot_lon_deg (the geostationary slot from the provider's file), magnetic_declination_deg (your number, east positive), dish_m, freq_ghz, obstacles: up to 10 of { azimuth_from_deg, azimuth_to_deg, distance_m, height_above_dish_m } }.","properties":{"site_lat_deg":{"type":"number","minimum":-90,"maximum":90},"site_lon_deg":{"type":"number","minimum":-180,"maximum":180},"slot_lon_deg":{"type":"number","minimum":-180,"maximum":180},"magnetic_declination_deg":{"type":"number","minimum":-90,"maximum":90},"dish_m":{"type":"number","minimum":0.05,"maximum":50},"freq_ghz":{"type":"number","minimum":0.1,"maximum":100},"obstacles":{"type":"array","maxItems":10,"items":{"type":"object"}}},"required":["site_lat_deg","site_lon_deg","slot_lon_deg"],"additionalProperties":false}}}},{"name":"link_budget","title":"Work out a link budget","description":"A one-way link budget in dB from your own figures: wavelength, dish gain and beamwidth, pointing loss, free-space path loss, EIRP, G/T, C/N0, Eb/N0, margin against the modem's required Eb/N0, C/N, the Shannon theoretical ceiling and the highest rate at the required Eb/N0. Returns a loss_table for a waterfall chart. Rain is a margin you set, not a model. No band plans, country rules, interference or jamming inputs. Planning estimates only.","get":"https://satellite.md/api/v1/link_budget","post":"https://satellite.md/api/v1/link_budget","example_get":"https://satellite.md/api/v1/link_budget?freq_ghz=12&distance_km=37833&eirp_dbw=50&rx_dish_m=0.75&rx_efficiency=0.65&system_noise_temp_k=150&pointing_error_deg=0.2&rain_margin_db=3&data_rate_bps=20000000&bandwidth_hz=25000000&required_ebn0_db=6","example_body":{"freq_ghz":12,"distance_km":37833,"eirp_dbw":50,"rx_dish_m":0.75,"rx_efficiency":0.65,"system_noise_temp_k":150,"pointing_error_deg":0.2,"rain_margin_db":3,"data_rate_bps":20000000,"bandwidth_hz":25000000,"required_ebn0_db":6},"input":{"type":"object","properties":{"direction":{"type":"string","enum":["down","up"],"default":"down","description":"down (satellite to ground) or up (ground to satellite). Default down."},"freq_ghz":{"type":"number","description":"Carrier frequency in GHz, 0.1 to 100.","minimum":0.1,"maximum":100},"distance_km":{"type":"number","description":"Slant distance in km. Or send altitude_km with elevation_deg.","minimum":1,"maximum":500000},"altitude_km":{"type":"number","description":"Orbit altitude in km, 160 to 40,000, used with elevation_deg when distance_km is not sent.","minimum":160,"maximum":40000},"elevation_deg":{"type":"number","description":"Elevation angle at the ground in degrees. Default 10.","minimum":0,"maximum":90,"default":10},"eirp_dbw":{"type":"number","description":"Transmit EIRP in dBW. Or send tx_power_w with tx_gain_dbi or tx_dish_m.","minimum":-50,"maximum":100},"tx_power_w":{"type":"number","description":"Transmit power in watts.","minimum":0.000001,"maximum":100000},"tx_gain_dbi":{"type":"number","description":"Transmit antenna gain in dBi.","minimum":-20,"maximum":80},"tx_dish_m":{"type":"number","description":"Transmit dish diameter in metres (the ground dish when direction is up).","minimum":0.05,"maximum":50},"tx_efficiency":{"type":"number","description":"Transmit dish efficiency. Default 0.6.","minimum":0.1,"maximum":1,"default":0.6},"g_t_dbk":{"type":"number","description":"Receive G/T in dB/K. Or send rx_gain_dbi (or rx_dish_m) with system_noise_temp_k.","minimum":-60,"maximum":60},"rx_gain_dbi":{"type":"number","description":"Receive antenna gain in dBi.","minimum":-20,"maximum":80},"rx_dish_m":{"type":"number","description":"Receive dish diameter in metres (the ground dish when direction is down).","minimum":0.05,"maximum":50},"rx_efficiency":{"type":"number","description":"Receive dish efficiency. Default 0.6.","minimum":0.1,"maximum":1,"default":0.6},"system_noise_temp_k":{"type":"number","description":"Receive system noise temperature in kelvin.","minimum":1,"maximum":100000},"pointing_error_deg":{"type":"number","description":"Ground dish pointing error in degrees. Default 0. Needs the ground dish size.","minimum":0,"maximum":5,"default":0},"rain_margin_db":{"type":"number","description":"Rain margin in dB, your setting. Default 3.","minimum":0,"maximum":30,"default":3},"atmos_loss_db":{"type":"number","description":"Atmospheric loss in dB. Default 0.5.","minimum":0,"maximum":30,"default":0.5},"polarization_loss_db":{"type":"number","description":"Polarization loss in dB. Default 0.3.","minimum":0,"maximum":10,"default":0.3},"other_losses_db":{"type":"number","description":"Any other losses in dB. Default 0.","minimum":0,"maximum":50,"default":0},"data_rate_bps":{"type":"number","description":"Information rate in bits per second, for Eb/N0.","minimum":1,"maximum":1000000000000},"bandwidth_hz":{"type":"number","description":"Occupied bandwidth in Hz, for C/N and the Shannon ceiling.","minimum":1,"maximum":100000000000},"required_ebn0_db":{"type":"number","description":"Eb/N0 the modem needs, from its datasheet. No default.","minimum":-5,"maximum":30}},"required":["freq_ghz"]}},{"name":"build_settings","title":"Write your settings into the skill","description":"Turns a preset and settings into the sections written at the top of SATELLITE.md. Every setting is a number or a fixed choice; the catalog is at https://satellite.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://satellite.md/api/v1/build_settings","post":"https://satellite.md/api/v1/build_settings","example_get":"https://satellite.md/api/v1/build_settings?preset=recommended","example_body":{"preset":"recommended"},"input":{"type":"object","properties":{"preset":{"type":"string","enum":["core","recommended","strict"],"description":"Starting point: core, recommended, strict. Applied first; each setting overrides it."},"monthly_budget":{"type":"number","minimum":0,"maximum":10000000,"description":"Most you may commit to per month, in the person's currency (0 means ask for a budget first) (number). Default 0. Out-of-range values are clamped."},"max_contract_months":{"type":"integer","minimum":0,"maximum":60,"description":"Longest minimum term to accept (months). Optional; unset clears it. Out-of-range values are clamped."},"imagery_finest_gsd_m":{"type":"string","enum":["1","3","10","30","0.3","0.5"],"description":"Finest imagery resolution to propose without asking: 1 (1 m per pixel), 3 (3 m per pixel), 10 (10 m per pixel), 30 (30 m per pixel), 0.3 (0.3 m per pixel), 0.5 (0.5 m per pixel). Default 1."},"imagery_smallest_area_km2":{"type":"number","minimum":0.01,"maximum":100,"description":"Smallest imagery area to order without asking the purpose (km2). Optional; unset clears it. Out-of-range values are clamped."},"feature_pixels":{"type":"integer","minimum":2,"maximum":10,"description":"Pixels across the smallest feature that matters (pixels). Optional; unset clears it. Out-of-range values are clamped."},"archive_first":{"type":"string","enum":["on","off","unset"],"description":"Look in the archive before suggesting new tasking: on (On), off (Off). Optional; unset clears it."},"clear_target_pct":{"type":"integer","minimum":50,"maximum":99,"description":"Wanted chance of at least one clear capture (%). Optional; unset clears it. Out-of-range values are clamped."},"max_rtt_ms":{"type":"integer","minimum":20,"maximum":2000,"description":"Highest round-trip time to accept (ms). Optional; unset clears it. Out-of-range values are clamped."},"min_elevation_deg":{"type":"integer","minimum":0,"maximum":40,"description":"Lowest elevation angle to plan with (degrees). Optional; unset clears it. Out-of-range values are clamped."},"rain_margin_db":{"type":"number","minimum":0,"maximum":15,"description":"Rain margin in link budgets (dB). Optional; unset clears it. Out-of-range values are clamped."},"location_precision_m":{"type":"string","enum":["10","100","600","1000","10000"],"description":"Coarsest location that still does the job: 10 (10 m (assets only, or with consent)), 100 (100 m), 600 (600 m), 1000 (1 km), 10000 (10 km). Default 100."},"location_retention_days":{"type":"string","enum":["7","30","90","365"],"description":"Keep location data for at most: 7 (7 days), 30 (30 days), 90 (90 days), 365 (365 days). Default 90."},"off_hours_location":{"type":"string","enum":["on","off"],"description":"Location from devices that travel with people, outside work hours: on (On), off (Off). Default off."},"data_region":{"type":"string","enum":["any","same_country","unset"],"description":"Where location data may be stored: any (Anywhere the provider states), same_country (Only in the same country). Optional; unset clears it."},"stale_file_days":{"type":"string","enum":["90","180","365","unset"],"description":"Treat a provider's SATELLITE.md as out of date after: 90 (90 days), 180 (180 days), 365 (365 days). Optional; unset clears it."},"export_check":{"type":"string","enum":["once_per_task","every_order","unset"],"description":"Ask the person to confirm export and sanctions checks: once_per_task (Once per task), every_order (Before every order). Optional; unset clears it."},"units":{"type":"string","enum":["metric","imperial","unset"],"description":"Units: metric (Metric), imperial (Imperial). Optional; unset clears it."},"detail":{"type":"string","enum":["short","full","unset"],"description":"Report detail: short (Short: five lines at most), full (Full: show the math once). Optional; unset clears it."},"format":{"type":"string","enum":["section","skill"],"description":"section (default): the settings sections only; skill: the whole skill file too."}}}}],"mcp":{"url":"https://satellite.md/mcp","transport":"streamable-http, stateless, JSON responses, no auth","add":"claude mcp add --transport http satellite https://satellite.md/mcp","tools":["check_satellite_md","match_services","build_satellite_md","imagery_order","network_fit","telematics_budget","compare_plans","orbit_geometry","link_budget","build_settings"],"prompts":["satellite"],"resources":["https://satellite.md/satellite.md","https://satellite.md/api/v1/settings"]},"openapi":"https://satellite.md/openapi.json","llms_txt":"https://satellite.md/llms.txt","manifest":"https://satellite.md/.well-known/satellite.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 fetches imagery or positions, tracks people or vehicles, contacts or operates satellites, transmits, or buys anything"],"disclaimer":"Use at your own risk. satellite.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 engineering, spectrum licensing, export control, legal or financial advice. satellite.md never fetches imagery or positions, tracks people or vehicles, contacts or operates satellites, transmits, or buys anything. Check everything yourself before you act on it.","terms":"https://satellite.md/terms","contact":"support [ AT ] mailbox.bot"}