What CRS does GFS use? I'm trying to reproject GRIB data from NOAA forecasts onto other data using Python and the pygrib and proj packages (among many others). What is the proper Proj string for GFS GRIBs?

The projection should come from the GRIB file and I assumed GFS uses Mercator, but pygrib grib.projparams() returns
{'a': 6371229, 'b': 6371229, 'proj': 'cyl'}. 'cyl' is not a legal proj CRS and other cylindrical projections (Central Cylindrical, Plate Carree) don't have a or b parameters. I assume that a &amp; b are defining the earth as a sphere with radius 6371229m.

grib.projparams() with an HRRR GRIB returns
{'a': 6371229, 'b': 6371229, 'proj': 'lcc', 'lon_0': 262.5, 'lat_0': 38.5, 'lat_1': 38.5, 'lat_2': 38.5}

which is perfectly legal in the eyes of Proj and reprojects data accurately.
My ansatz for what cyl means is likely Equidistant Cylindrical Projection, because in the older Basemap module, 'cyl' was the shortname for that projection.
But the reality is that since the GFS is a global spectral model with a latitude-longitude grid, it likely does not require a CRS. That is, it presupposes a sphere, where a CRS projects the spherical coordinates (latitude, longitude) onto a shape (such as a cone).