prop/priv/agent-skills/fetch-contacts.md
Graham McIntire fc9d0dc977
feat(agent-discovery): Link/markdown/content-signal/api-catalog/skills
Implements the subset of the isitagentready.com checklist that maps to
real capabilities of this site:

- RFC 8288 Link headers on every browser response advertising
  service-doc (/algo), about, privacy-policy, and sitemap.
- Markdown-for-Agents content negotiation: requests with
  Accept: text/markdown for / or /algo return real markdown
  (curated summary + verbatim algo.md) with x-markdown-tokens hint.
  Other paths still 406 — no synthesizing markdown from LiveView HTML.
- Content-Signal directive in robots.txt declaring
  search=yes, ai-train=no, ai-input=no.
- RFC 9727 API catalog at /.well-known/api-catalog with the sole
  public endpoint (/api/contacts/map) linking status -> /health and
  service-desc -> /openapi.json (a new minimal OpenAPI 3.0 spec).
- Agent Skills Discovery index at /.well-known/agent-skills/index.json
  listing two skill documents (fetch-contacts, read-algorithm) with
  sha256 digests computed at compile time; documents served at
  /.well-known/agent-skills/{name}/SKILL.md.

Skipped (don't match actual site capabilities): Web Bot Auth JWKS,
OAuth/OIDC discovery, MCP server card.
2026-04-17 12:09:05 -05:00

1.2 KiB

Fetch contacts dataset

The NTMS microwave propagation service publishes its full amateur-radio contact (QSO) calibration dataset as a single public JSON endpoint. No authentication is required.

Endpoint

GET https://prop.w5isp.com/api/contacts/map

The response is pre-gzipped when the client sends Accept-Encoding: gzip (roughly 1 MB compressed, 5 MB decompressed). Cached at the origin for 60 s.

Response shape

A single JSON array where each element is a fixed-length tuple:

[lat1, lon1, lat2, lon2, band_mhz, callsign1, callsign2, mode, distance_km, qso_timestamp_iso8601, id_uuid]
  • lat1/lon1 and lat2/lon2 are the two station locations (WGS84 degrees).
  • band_mhz is an integer in MHz (e.g. 1296, 10000, 24000).
  • callsign1/callsign2 are uppercase amateur callsigns or null if unknown.
  • mode is a string (CW, SSB, FT8, …) or null.
  • distance_km is a number or null.
  • qso_timestamp_iso8601 is YYYY-MM-DDTHH:MM:SSZ.
  • id_uuid is the stable UUID for the contact; fetch details at /contacts/{id_uuid}.

Machine-readable specs

  • OpenAPI 3.0 spec: GET /openapi.json
  • API catalog (RFC 9727): GET /.well-known/api-catalog