{"name":"io.github.cyanheads/noaa-marine-mcp-server","slug":"cyanheads-noaa-marine-mcp-server","title":null,"description":"Find NOAA tide stations and NDBC buoys, fetch tide predictions, currents, and live conditions.","url":"https://mcp.market/server/cyanheads-noaa-marine-mcp-server","rating":null,"grade":"A","score":93,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":36,"stars":1,"forks":0,"downloads_week":454,"last_push_at":"2026-09-17T20:01:51.000Z","license":"Apache-2.0"},"claimed":false,"transport":"mixed","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/cyanheads/noaa-marine-mcp-server","website":null,"version":"0.5.0","remotes":[{"type":"streamable-http","url":"https://noaa-marine.caseyjhand.com/mcp"}],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"@cyanheads/noaa-marine-mcp-server","version":"0.5.0","runtimeHint":"bun","transport":{"type":"stdio"},"packageArguments":[{"value":"run","type":"positional"},{"value":"start:stdio","type":"positional"}],"environmentVariables":[{"description":"Courtesy identifier sent as application= on CO-OPS requests. Defaults to noaa-marine-mcp-server.","format":"string","default":"noaa-marine-mcp-server","name":"NOAA_APPLICATION_ID"},{"description":"Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').","format":"string","default":"info","name":"MCP_LOG_LEVEL"}]},{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"@cyanheads/noaa-marine-mcp-server","version":"0.5.0","runtimeHint":"bun","transport":{"type":"streamable-http","url":"http://localhost:3010/mcp"},"packageArguments":[{"value":"run","type":"positional"},{"value":"start:http","type":"positional"}],"environmentVariables":[{"description":"Courtesy identifier sent as application= on CO-OPS requests. Defaults to noaa-marine-mcp-server.","format":"string","default":"noaa-marine-mcp-server","name":"NOAA_APPLICATION_ID"},{"description":"The hostname for the HTTP server.","format":"string","default":"127.0.0.1","name":"MCP_HTTP_HOST"},{"description":"The port to run the HTTP server on.","format":"string","default":"3010","name":"MCP_HTTP_PORT"},{"description":"The endpoint path for the MCP server.","format":"string","default":"/mcp","name":"MCP_HTTP_ENDPOINT_PATH"},{"description":"Authentication mode to use: 'none', 'jwt', or 'oauth'.","format":"string","default":"none","name":"MCP_AUTH_MODE"},{"description":"Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').","format":"string","default":"info","name":"MCP_LOG_LEVEL"}]}],"tools":[{"name":"noaa_marine_find_stations","description":"Find CO-OPS tide, water-level and current stations and NDBC buoys near a location, by name, or by station ID, returning a unified list with source, data capabilities, coordinates, and — for NDBC — the physical platform class. This is the required first step for resolving a place name, a coordinate pair, or a bare station number to the station IDs the data tools take: CO-OPS tide and water-level IDs are numeric (e.g. 9447130 for Seattle), CO-OPS current IDs are alphanumeric (e.g. ACT4176), and NDBC buoy IDs are 5-character alphanumeric codes (e.g. 46041). Two axes are reported separately — capabilities and type name the data products a station serves (tide, current, water_level, met, current_profile, water_quality), while platform is the NDBC physical classification (buoy, fixed, oilrig, dart, tao, usv, other) that CO-OPS stations do not carry. Supply latitude and longitude together for a proximity search, or query for a name-or-ID substring matched against both sources, or state for CO-OPS coverage in one state; the filters combine, and results lead with an exact ID match unless a proximity search is ordering them by distance. A search that matches nothing is a success with total_found: 0 carrying an echo of the filters that were applied, and a search whose catalogs did not all answer says which source is missing. CO-OPS prediction stations carry a third axis as well, prediction_class, which says what a station can actually answer: a tide station is either reference, serving both hilo and the 6-minute curve, or subordinate, serving hilo only, while a current station carries its class per depth bin in bins[] — a harmonic or subordinate bin serves the normal flood/ebb/slack series, and a weak_and_variable bin may instead answer noaa_marine_get_currents with a coverage statement and no events, or report that CO-OPS publishes no predictions for it at all, so prefer a harmonic bin when one is in range.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"latitude":{"description":"Center latitude in decimal degrees for proximity search. Required together with longitude — supplying only one is rejected rather than silently ignored. Optionally pair with radius_km.","type":"number","minimum":-90,"maximum":90},"longitude":{"description":"Center longitude in decimal degrees for proximity search. Required together with latitude — supplying only one is rejected rather than silently ignored. Optionally pair with radius_km.","type":"number","minimum":-180,"maximum":180},"radius_km":{"default":100,"description":"Search radius in kilometers when latitude/longitude are provided. Defaults to 100 km.","type":"number","minimum":1,"maximum":1000},"query":{"description":"Station name or station ID substring to match, case-insensitive, on both sources. E.g. \"seattle\", \"puget sound\", \"9447130\", \"46041\". A station whose ID matches exactly is returned ahead of name matches, unless latitude/longitude were supplied — a proximity search orders by distance instead. Blank or whitespace-only values are treated as omitted.","type":"string"},"state":{"description":"Filter by 2-letter US state or territory code. Applies to CO-OPS stations only — providing it restricts results to CO-OPS and excludes NDBC buoys (which carry no state). E.g. \"WA\", \"CA\", \"PR\".","type":"string","enum":["AL","AK","AZ","AR","CA","CO","CT","DE","FL","GA","HI","ID","IL","IN","IA","KS","KY","LA","ME","MD","MA","MI","MN","MS","MO","MT","NE","NV","NH","NJ","NM","NY","NC","ND","OH","OK","OR","PA","RI","SC","SD","TN","TX","UT","VT","VA","WA","WV","WI","WY","DC","PR","VI","GU","AS","MP"]},"source":{"default":"all","description":"Data source to search: coops (tide/water-level/current stations), ndbc (buoys), or all (default).","type":"string","enum":["coops","ndbc","all"]},"types":{"description":"Filter by data capability or NDBC platform class. Every returned station matches at least one requested value — a capability value against its capabilities list, or buoy against its platform class. Omit to return all stations.","type":"array","items":{"type":"string","enum":["tide","current","water_level","met","current_profile","water_quality","buoy"],"description":"Filter value. Six are data capabilities, matched against a station's capabilities list: tide (CO-OPS tide predictions → noaa_marine_get_tide_predictions), current (CO-OPS tidal-current predictions → noaa_marine_get_currents), water_level (CO-OPS observed water levels → noaa_marine_get_water_level), met (NDBC meteorological → noaa_marine_get_conditions), current_profile (NDBC observed ocean-current depth profile → noaa_marine_get_current_profile; note this is a different data product and source than CO-OPS `current`), water_quality (NDBC sub-surface water-column sensors → noaa_marine_get_ocean_observations). The seventh, buoy, is a physical-platform filter (NDBC platform class equals buoy), not a data capability — use it to select buoy-class platforms regardless of what data they serve."}},"limit":{"default":20,"description":"Maximum number of stations to return. Defaults to 20.","type":"integer","minimum":1,"maximum":200}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"noaa_marine_get_conditions","description":"Live marine conditions from an NDBC buoy: wave height, period and direction, wind speed, gust and direction, sea-surface temperature, air temperature, barometric pressure, and dew point. All values are SI units — wind in m/s, wave height in m, pressure in hPa, temperatures in °C — except TIDE, which is in feet, and VIS, in nautical miles, both rarely populated at offshore buoys; a numeric field is null when the buoy sensor did not report a value, which is normal offshore. Row cadence varies by station from 5 to 60 minutes, so observed_at can be that old, and NDBC writes each block of columns on its own cycle, so any block can resolve from an earlier row within 90 minutes of observed_at. Waves carry their own waves_observed_at, null when no wave sample falls inside that window, and any other block read from an earlier row is named with its measurement time in the response notice. Use noaa_marine_find_stations with source=\"ndbc\" and types=[\"met\"] to find station IDs near a location, since met-flagged stations are the ones most likely to serve live conditions: roughly a third of active NDBC stations report neither meteorological nor current data, most of those have no observation file, and omitting the types filter surfaces station IDs this tool cannot read.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"station_id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,20}$","description":"NDBC buoy station ID (5-character alphanumeric, e.g. \"46041\" for Cape Elizabeth). Obtain from noaa_marine_find_stations with source=\"ndbc\" and types=[\"met\"]."}},"required":["station_id"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"noaa_marine_get_current_profile","description":"Observed ocean-current depth profile from an NDBC ADCP buoy — the most recent measurement of current speed and direction at each depth bin, returning depth in meters, direction in degrees true (the direction the current flows toward), and speed in cm/s. It is distinct from noaa_marine_get_currents, which returns CO-OPS tidal-current predictions of max flood, ebb and slack rather than these observed acoustic-Doppler measurements. A depth bin is reported whenever NDBC gives it a depth, and its direction or speed is null when the sensor did not report that component. Use noaa_marine_find_stations with source=\"ndbc\" and types=[\"current_profile\"] to find station IDs, since most NDBC stations serve no ADCP profile and an unfiltered search returns IDs this tool cannot read.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"station_id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,20}$","description":"NDBC station ID (5-character alphanumeric, e.g. \"44033\"). Obtain from noaa_marine_find_stations with source=\"ndbc\" and types=[\"current_profile\"]."}},"required":["station_id"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"noaa_marine_get_currents","description":"Tidal current predictions for a CO-OPS current station: max flood and ebb speeds, slack times, and the station's mean flood and ebb bearings. These are forecast predictions from CO-OPS, distinct from noaa_marine_get_current_profile, which returns NDBC observed ocean-current measurements binned by depth. The default MAX_SLACK interval is the practical planning view, showing when currents peak and when slack water occurs, and a 6-minute interval returns the continuous curve for detailed analysis, each row carrying its own flood/ebb/slack sense. A station can publish predictions for several depth bins at different depths: bin selects one, omitting it takes the CO-OPS default of the shallowest bin, and the bin and its depth are echoed on every response — read bins[] on a noaa_marine_find_stations current row for the bins a station actually has. A station whose currents CO-OPS will not predict as discrete events answers with an empty list and its own wording in the notice rather than an error. Both intervals are bounded by response size: a range whose rows fit is returned whole, a longer one returns the leading rows with rows_matched, rows_returned, and next_offset reporting how much matched and which offset reaches the rest, and offset and limit walk whichever series the interval selects. Current station IDs are alphanumeric (e.g. ACT4176), distinct from the numeric tide and water-level IDs, and the date range is limited to 1 year per request — use noaa_marine_find_stations with types=[\"current\"] to obtain a valid current station ID.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"station_id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,20}$","description":"CO-OPS current station ID (alphanumeric, e.g. \"ACT4176\"). Obtain from noaa_marine_find_stations with types=[\"current\"]."},"begin_date":{"type":"string","pattern":"^\\d{8}$","description":"Start date in YYYYMMDD format, e.g. \"20240601\"."},"end_date":{"type":"string","pattern":"^\\d{8}$","description":"End date in YYYYMMDD format (inclusive), e.g. \"20240607\"."},"time_zone":{"default":"lst_ldt","description":"Time zone for returned timestamps. lst_ldt = local standard/daylight time (default); gmt = UTC; lst = local standard time year-round.","type":"string","enum":["lst_ldt","gmt","lst"]},"units":{"default":"english","description":"Unit system: english = knots for speed and feet for the echoed depth; metric = cm/s for speed (not m/s) and meters for the echoed depth.","type":"string","enum":["english","metric"]},"interval":{"default":"MAX_SLACK","description":"Prediction interval: MAX_SLACK (default) returns max flood, max ebb, and slack water events — ideal for passage planning. 6min returns a continuous current curve.","type":"string","enum":["MAX_SLACK","6min"]},"bin":{"description":"Depth bin to predict for, taken from the bins[] array on a noaa_marine_find_stations current row (e.g. 15, 10 or 1 at PUG1515). Omit to take the CO-OPS default, which is the shallowest bin. A bin the station does not publish comes back as bin_unavailable naming the bins it does.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"offset":{"default":0,"description":"Row offset into the matched prediction series — the max/slack events on the MAX_SLACK interval, the 6-minute curve on 6min — for reading a range whose rows do not fit one response. 0 (default) starts at the first row; pass the next_offset from a previous call to continue. An offset past the last row returns an empty page rather than an error.","type":"integer","minimum":0,"maximum":9007199254740991},"limit":{"description":"Maximum prediction rows to return on this page — max/slack events or 6-minute rows, whichever the interval selects — for a caller that wants fewer than the response budget allows. Omit for the largest page that fits; a value larger than the budget allows does not widen the page.","type":"integer","minimum":1,"maximum":9007199254740991}},"required":["station_id","begin_date","end_date"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"noaa_marine_get_ocean_observations","description":"Live sub-surface oceanographic observations from an NDBC station's water-quality sensors: at each reported depth, water temperature, conductivity, salinity, dissolved oxygen as both saturation percent and concentration in ppm, chlorophyll, turbidity, pH, and redox potential. This is the water-column counterpart to noaa_marine_get_conditions, which returns surface meteorological and wave data — use this tool for what the water is doing below the surface, that one for weather and sea state at the buoy. It returns the most recent observation as one reading per reported depth, and most stations report a single depth while some report several at the same time; sensor coverage is sparse, most stations populating only water temperature and salinity, and any value the station did not report comes back null rather than a fabricated zero, as do latitude and longitude for a station absent from the NDBC active-stations list. Sub-surface sensors are on only a subset of NDBC stations, so find one with noaa_marine_find_stations using source=\"ndbc\" and types=[\"water_quality\"], which filters on NDBC's own water-quality catalog flag — the flag and actual .ocean availability drift, so this tool reads any station that serves the file and returns observations_not_found for one that does not.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"station_id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,20}$","description":"NDBC station ID (5-character alphanumeric, e.g. \"44033\" or \"TIBC1\"). Obtain from noaa_marine_find_stations with source=\"ndbc\" and types=[\"water_quality\"]."}},"required":["station_id"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"noaa_marine_get_tide_predictions","description":"High and low tide predictions for a CO-OPS tide station over a date range. The default hilo interval returns the time, height, and tide type (H for high, L for low) of each event, while the 6-minute interval returns the detailed tide curve. Most tide stations are subordinate — CO-OPS derives their high and low events as offsets from a reference station and publishes no 6-minute curve for them — so interval=\"6min\" reaches only a reference station, and a subordinate station comes back as subordinate_no_6min naming the reference station to ask instead; the prediction_class on a noaa_marine_find_stations tide row says which kind a station is before the call. Datum defaults to MLLW, mean lower low water, the standard for US nautical charts, and the date range is limited to 1 year per request. A range whose predictions fit the response budget is returned whole; a longer one is returned as a page of leading rows, and rows_matched, rows_returned, and next_offset then report how much matched and which offset reaches the rest, so a year of events is read by walking offset rather than by splitting the range. Use noaa_marine_find_stations first to resolve a station name or location to a numeric station ID.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"station_id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,20}$","description":"CO-OPS tide station ID (numeric, e.g. \"9447130\" for Seattle). Obtain from noaa_marine_find_stations with types=[\"tide\"]."},"begin_date":{"type":"string","pattern":"^\\d{8}$","description":"Start date in YYYYMMDD format, e.g. \"20240601\"."},"end_date":{"type":"string","pattern":"^\\d{8}$","description":"End date in YYYYMMDD format (inclusive), e.g. \"20240607\"."},"datum":{"default":"MLLW","description":"Datum the predicted heights are referenced to. MLLW (default) is the US nautical chart datum, and MHHW (mean higher high water) is the flooding reference; MHW, MTL, MSL, MLW, and DTL (diurnal tide level) are the other tidal planes. NAVD is NAVD88 and reads only where the station has an NAVD88 tie. STND is the station's own datum and is the plane that works where no tidal datum exists. CRD applies at Columbia River stations only. A datum this station does not carry comes back as datum_unavailable naming the ones it does.","type":"string","enum":["MLLW","MHHW","MHW","MTL","MSL","MLW","DTL","NAVD","STND","CRD"]},"time_zone":{"default":"lst_ldt","description":"Time zone for returned timestamps. lst_ldt = local standard/daylight time (default); gmt = UTC; lst = local standard time year-round.","type":"string","enum":["lst_ldt","gmt","lst"]},"units":{"default":"english","description":"Unit system for heights: english = feet; metric = meters.","type":"string","enum":["english","metric"]},"interval":{"default":"hilo","description":"Prediction interval: hilo (default) returns only high and low tide events; 6min returns a continuous prediction curve at 6-minute intervals, and is served only by a reference station — a subordinate station has no 6-minute curve.","type":"string","enum":["hilo","6min"]},"offset":{"default":0,"description":"Row offset into the matched prediction series, for reading a range whose rows do not fit one response. 0 (default) starts at the first row; pass the next_offset from a previous call to continue. An offset past the last row returns an empty page rather than an error.","type":"integer","minimum":0,"maximum":9007199254740991},"limit":{"description":"Maximum prediction rows to return on this page, for a caller that wants fewer than the response budget allows. Omit for the largest page that fits; a value larger than the budget allows does not widen the page.","type":"integer","minimum":1,"maximum":9007199254740991}},"required":["station_id","begin_date","end_date"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"noaa_marine_get_water_level","description":"Observed water level, real-time or historical, for a CO-OPS water-level station, paired with tide predictions for the same period so the residual (observed − predicted) shows storm surge when positive and anomalous drawdown when negative. The interval selects the cadence: 6min (default) is the full curve, hourly and high_low cover months to a year of the same series at far fewer rows, and daily_mean serves Great Lakes stations only. Each interval carries its own CO-OPS range ceiling — 31 days for 6min, 365 for hourly and high_low, 3655 for daily_mean — rejected locally before the call, and only 6min and hourly report a residual. Observations and predictions are fetched independently, so when the prediction series is empty, predictions_status says whether CO-OPS has none for this station and range or the prediction fetch failed — the observed series returns either way, and residual_summary is present only when both series are and the cadence supports the join. A sensor outage leaves slots with no reading; those slots are dropped and counted in gaps_dropped, so the observed series is continuous across the range only when that count is absent. A range whose rows fit the response budget is returned whole; a longer one returns the leading rows, with rows_matched, rows_returned, and next_offset reporting how much matched and which offset reaches the rest. Use noaa_marine_find_stations first to resolve a station name or location to a valid station ID.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"station_id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,20}$","description":"CO-OPS water-level station ID (numeric, e.g. \"9447130\" for Seattle). Obtain from noaa_marine_find_stations with types=[\"water_level\"]."},"begin_date":{"type":"string","pattern":"^\\d{8}$","description":"Start date in YYYYMMDD format, e.g. \"20240601\"."},"end_date":{"type":"string","pattern":"^\\d{8}$","description":"End date in YYYYMMDD format (inclusive), e.g. \"20240601\"."},"datum":{"default":"MLLW","description":"Datum the observed heights are referenced to. MLLW (default) is the US nautical chart datum, and MHHW (mean higher high water) is the flooding reference; MHW, MTL, MSL, and MLW are the other tidal planes. NAVD is NAVD88 and reads only where the station has an NAVD88 tie. STND is the station's own datum and is the plane that works where no tidal datum exists. IGLD and LWD apply at Great Lakes stations only, CRD at Columbia River stations only, and LWI and HWI are lunitidal intervals rather than heights. A datum this station does not carry comes back as datum_unavailable naming the ones it does.","type":"string","enum":["MLLW","MHHW","MHW","MTL","MSL","MLW","NAVD","STND","IGLD","LWD","CRD","LWI","HWI"]},"time_zone":{"default":"lst_ldt","description":"Time zone for returned timestamps. lst_ldt = local standard/daylight time (default); gmt = UTC; lst = local standard time year-round. Overridden to lst on interval=\"daily_mean\", which CO-OPS serves in local standard time only and otherwise stamps every row a day off.","type":"string","enum":["lst_ldt","gmt","lst"]},"units":{"default":"english","description":"Unit system: english = feet; metric = meters.","type":"string","enum":["english","metric"]},"interval":{"default":"6min","description":"Observed cadence. 6min (default) is the full curve, 31 days per request, the only one carrying a quality flag. hourly is hourly heights, 365 days per request, and reports a residual against the hourly prediction series. high_low is the observed high and low waters with their H/HH/L/LL classification, 365 days per request, and reports no residual because observed extremes do not fall on predicted extreme times. daily_mean is the daily mean water level, 3655 days per request, published at Great Lakes stations only and with no paired prediction series; a coastal station comes back as great_lakes_only.","type":"string","enum":["6min","hourly","high_low","daily_mean"]},"offset":{"default":0,"description":"Row offset into the matched observation series, for reading a range whose rows do not fit one response. 0 (default) starts at the first row; pass the next_offset from a previous call to continue. An offset past the last row returns an empty page rather than an error.","type":"integer","minimum":0,"maximum":9007199254740991},"limit":{"description":"Maximum observation rows to return on this page, for a caller that wants fewer than the response budget allows. Omit for the largest page that fits; a value larger than the budget allows does not widen the page.","type":"integer","minimum":1,"maximum":9007199254740991}},"required":["station_id","begin_date","end_date"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}}],"scan":{"score":93,"grade":"A","scanned_at":"2026-09-19T00:30:03.314Z","report":{"scannerVersion":"0.1.3","scannedAt":"2026-09-19T00:30:03.227Z","components":{"code":{"score":25,"max":25,"notes":["36 source files scanned","36 source files scanned"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 1290ms"]},"poisoning":{"score":15,"max":15,"notes":["7 tool descriptions checked"]},"auth":{"score":10,"max":15,"notes":["open endpoint, read-only tools"]},"maintenance":{"score":15,"max":15,"notes":["last push 1 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"probes":[{"url":"https://noaa-marine.caseyjhand.com/mcp","reachable":true,"authRequired":false,"latencyMs":1290,"serverInfo":{"name":"noaa-marine-mcp-server","version":"0.5.0"}}],"packages":[{"registryType":"npm","identifier":"@cyanheads/noaa-marine-mcp-server","version":"0.5.0","found":true,"license":"Apache-2.0","hasInstallScripts":false,"dependencyCount":3,"publishedAt":"2026-09-17T20:02:57.816Z","repositoryUrl":"git+https://github.com/cyanheads/noaa-marine-mcp-server.git","weeklyDownloads":227},{"registryType":"npm","identifier":"@cyanheads/noaa-marine-mcp-server","version":"0.5.0","found":true,"license":"Apache-2.0","hasInstallScripts":false,"dependencyCount":3,"publishedAt":"2026-09-17T20:02:57.816Z","repositoryUrl":"git+https://github.com/cyanheads/noaa-marine-mcp-server.git","weeklyDownloads":227}],"repo":{"found":true,"owner":"cyanheads","repo":"noaa-marine-mcp-server","archived":false,"pushedAt":"2026-09-17T20:01:51Z","stars":1,"forks":0,"openIssues":5,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/10339515?v=4","ownerCreatedAt":"2014-12-29T13:01:12Z","license":"Apache-2.0"},"icon":{"url":"https://avatars.githubusercontent.com/u/10339515?v=4&s=128","source":"github"},"presence":{"stars":1,"forks":0,"downloadsWeek":454,"license":"Apache-2.0","lastPushAt":"2026-09-17T20:01:51.000Z","score":36}}}},"grade_history":[],"reviews":[]}