Skip to main content
Documentation for eme-mcp v0.4.0. Source at v0.4.0.

eme-mcp

PyPI MCP Registry

MCP server for EME — Earth-Moon-Earth, moonbounce. When the moon is up from your grid, when it is up from both ends of a schedule at once, what the path costs on 2m, 70cm and 23cm, and which days ahead are least degraded.

Part of the qso-graph project. No network, no authentication.

Why it needs nothing from the network​

The moon's position is computed here, from the abridged ELP-2000/82 series as Meeus tabulates it (Astronomical Algorithms, chapter 47). That is around 250 lines of standard library and a coefficient table. It is also what WSJT-X does, and the norm for EME software.

That matters for more than tidiness. Moonrise and moonset are different for every grid square, so a service-backed answer means a request per location per query — and a planning tool that stalls, rate-limits, or goes dark when a remote service does.

JPL Horizons is still here — as the test oracle. Recorded Horizons responses are fixtures, so every CI run checks these numbers against NASA's rather than against themselves. Measured against Horizons for a Boise grid:

agreement
Azimuthwithin 0.01°
Elevationwithin 0.003°
Rangewithin 9 km of ~392,000 (0.002%)

Thirty arcseconds, against a 432 MHz array that is degrees wide.

Install​

uvx eme-mcp # run it; nothing to install

Tools​

ToolDescription
eme_moon_windowMoon azimuth, elevation and range from a grid square over time — and, given a second locator, the mutual window when both stations can see it
eme_path_lossOne-way, round-trip and echo path loss on 2m / 70cm / 23cm, or any frequency
eme_degradationHow much worse than perigee this moment is, with the moon's declination
eme_calendarThe least degraded days ahead
get_version_infoService version and the ephemeris series used

What this does not yet do​

Sky noise is not included. The full degradation figure an EME operator plans with combines the distance term with the galactic background behind the moon, from the Haslam 408 MHz all-sky map. That map is not yet carried and pinned, so eme_degradation and eme_calendar report the distance term and say so in every answer rather than returning a number that looks complete and is not. Tracked in qso-graph-devel#52.

Elevations are geometric: no atmospheric refraction, which lifts an object near the horizon by about half a degree.

The two path-loss figures​

They answer different questions and are often confused, so both are returned:

  • echo_db is the one to budget a station with — the radar equation, accounting for the moon reflecting about 6.5% of what reaches it. Near 252 dB on 2m, 262 on 70cm and 271 on 23cm at mean distance, which are the numbers EME operators know.
  • round_trip_db is twice the free-space loss. It ignores the moon entirely.

Licence​

GPL-3.0-or-later. See LICENSE.

The algorithms are from Jean Meeus, Astronomical Algorithms (2nd edition, Willmann-Bell, 1998), chapters 7, 11, 12, 22, 40 and 47 — cited in the source where each is used. The implementation is ours; the mathematics is his and is not claimed.


Tool Reference

Generated from the released server's own tool definitions.

eme_calendar

The least degraded days ahead — when the moon is nearest.

ParameterTypeRequiredDefaultDescription
daysintegerNo30How far ahead to look. Default 30, at most 365.

eme_degradation

How much worse than the best case the moon is, now or at a given time.

ParameterTypeRequiredDefaultDescription
locatorstringNo""Your grid square, for a topocentric range. Optional.
whenstringNo""UTC time (ISO 8601). Default now.

eme_moon_window

Where the moon is from a grid square, and when both ends of a schedule can see it.

ParameterTypeRequiredDefaultDescription
locatorstringYesMaidenhead locator, e.g. DN13 or DN13la.
hoursnumberNo24How far ahead to look. Default 24, at most 336 (14 days).
step_minutesnumberNo30Sampling interval. Default 30, at least 1.
other_locatorstringNo""A second station's locator. Given one, the answer also carries the mutual window — the rows where the moon is above the horizon at both ends, which is the only time a contact is possible.

eme_path_loss

What the path to the moon and back costs, now or at a given time.

ParameterTypeRequiredDefaultDescription
bandstringNo"70cm"2m, 70cm or 23cm. Ignored if frequency_mhz is given.
frequency_mhznumberNonullAn exact frequency, for a band this does not name.
locatorstringNo""Your grid square. Given one, the range is topocentric — from where you are, not from the Earth's centre, which differs by up to about 1.7% as the moon rises and sets.
whenstringNo""UTC time (ISO 8601). Default now.

get_version_info

Get eme-mcp's version and the ephemeris series it computes from.

No parameters.