Gagelink

io.github.Adeniyikayodee由 GitHub 帳號 Adeniyikayodee 發布v0.7.0更新於 Oct 24, 2026

River level, streamflow, floods and basins from USGS, NOAA, Hub'Eau, UK Environment Agency, SWOT

已驗證STDIO僅桌面位置與生活資料與分析

概覽

AI 產生的概覽

GageLink 讓 AI 助理以唯讀方式取得水文資料——河川水位、流量、洪水預報、流域和衛星水位——並附上單位、基準面與紀錄狀態。

可以做什麼
尋找監測站,讀取測站中繼資料與參考框架,包括基準面偏移及在涵蓋範圍內透過 NOAA VDatum 的換算。取得各參數的最新讀值、指定日期範圍的時間序列、年度尖峰流量、含洪水門檻的預報、無測站河段的模型流量,以及衛星水位。沿河網追溯上游與下游測站,並取得集水流域範圍。解析參數代碼,並匯出記錄每次檢索的清單以便日後重播與稽核。四個提示詞分別引導乾舷檢查、洪水狀態、測站尋找與可重現答案;靜態資源列出參數、基準面與涵蓋範圍。
適用情境
適合涉及河川水位、流量、洪水等級、堤防乾舷、流域面積或上下游關係的問題,尤其是在混用基準面或臨時紀錄可能造成誤判時。涵蓋範圍以美國最完整,對法國、英國與全球衛星資料僅有部分支援。
執行需求
以 Python 套件形式在本機執行(需 Python 3.10 或更新版本),可透過 uvx 或 pip 安裝,也可使用 .mcpb 打包檔;選用的 HTTP 模式僅綁定回送位址。不需帳號。需要能連線各機構資料服務的網路。選用的 GAGELINK_API_KEY 可提高每小時請求額度。
安裝前請注意
標示為 pre-alpha,API 可能變動。所有工具皆為唯讀,但選用的 HTTP 模式沒有身分驗證,若綁定到可連線的網路介面會暴露每小時額度。未設定 GAGELINK_API_KEY 時每小時限 50 次請求。水文紀錄會被修訂,答案日後可能改變;基準面換算僅涵蓋美國本土相連各州,其他地區會被拒絕。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Gagelink,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

GageLink

Hydrology data for AI agents, with the reference frames kept attached.

River levels, streamflow, flood forecasts, drainage basins and satellite water levels from USGS, NOAA, Hub'Eau, the UK Environment Agency and SWOT. Every value arrives carrying its unit, the datum it was measured from, its timezone, and whether the record is provisional or approved.

mcp-name: io.github.Adeniyikayodee/gagelink

Pre-alpha. The API may change.

Install

pip install gagelink for the library. From an MCP client, with nothing installed:

json
{  "mcpServers": {    "gagelink": {      "command": "uvx",      "args": ["--from", "gagelink", "gagelink-mcp"]    }  }}

Or open the .mcpb bundle, which carries the server and its dependencies in one file.

No account is needed. A free key raises the allowance from 50 requests an hour to 1,000; set it as GAGELINK_API_KEY.

What can it answer?

  • How high is the river, and how does that compare with flood stage?
  • How much freeboard is there between the water and a surveyed levee crest?
  • What is the flow now, and what fraction of the record peak is that?
  • What is forecast over the next few days, and does it cross a flood category?
  • What lies upstream or downstream along the river network?
  • How large is the basin draining to this point?
  • What did a station record over a date range, and has that record been revised?
  • What is the water surface elevation of a river with no gage on it?
  • Is a reading provisional or approved, and how old is it?

Why the frames matter

At Little Falls on the Potomac, a river stage of 3.02 ft is measured upward from the gage's own zero. A surveyed levee crest of 41 ft is measured upward from a national datum. Both are lengths in feet, so subtracting one from the other produces a number that reads as freeboard, and a units library will pass it.

The gage zero at this station sits 37.04 ft above NAVD88, so the stage is 40.06 ft on that datum and the freeboard is 0.94 ft. Subtracting without the offset gives 37.98 ft, which overstates the margin by a factor of 40 in the direction of calling a levee safe.

GageLink refuses that subtraction and returns the offset that makes it well defined. The same applies to satellite elevations, which sit on a geoid, and to modelled flows, which may have no measurement behind them.

python demo/freeboard.py runs the whole example offline from recorded responses.

Converting a datum

The offset is available for most stations, so the refusal can become an answer. Pass on_datum to describe_location and the station's offset is converted through NOAA's VDatum, with the uncertainty of the conversion returned beside it:

text
altitude_of_gage_datum        4860 ft (NGVD29)      Boulder Creek at mouth, COaltitude_accuracy             10 ft, interpolated from a topographic mapaltitude_on_requested_datum   4863.061 ft (NAVD88)conversion_uncertainty        0.17 ftoffset_uncertainty            10 ft

Two things this surfaces are easy to miss.

The offset has an accuracy of its own. Across 7,361 USGS stream stations sampled in four states, 3,397 publish an altitude for their gage datum. Of those, 72% are known no better than a foot. The commonest published accuracy is 15 ft, a third were interpolated from a topographic map, and about one in twenty is levelled to a hundredth. A freeboard is bounded by that figure whatever precision the stage was read to, so describe_location returns it alongside the method used to determine it.

Most stations are on the older datum. 58% of those altitudes are published on NGVD29 while a modern survey or lidar product is on NAVD88. Across the contiguous states the difference runs to feet.

on_datum also takes the tidal datums (MLLW, MLW, LMSL, MTL, DTL, MHW, MHHW) for questions about level relative to the tide, and get_satellite_passes takes it to move SWOT elevations off the EGM2008 geoid they are measured against. Both cover the contiguous United States. Outside that coverage the conversion is refused and the reason is stated.

Tools

ToolWhat it does
find_locationsFind monitoring stations
describe_locationStation metadata and reference frames
get_latestThe latest reading for each parameter
get_seriesA time series over a date range
slice_seriesWork with part of a retrieved series
get_peaksAnnual peak flows
get_forecastForecasts and flood thresholds
get_model_forecastModelled flow for ungaged reaches
get_satellite_passesWater levels measured from orbit
navigate_networkUpstream and downstream stations
get_basinThe contributing drainage basin
lookup_parameterResolve a parameter code
export_manifestEverything that answered the question

All thirteen are read-only and annotated as such, so a client asks for consent once.

Results come back as structured data against each tool's output schema, so a unit, datum or grade is a field the client can read directly.

A series is returned as a handle with a summary. A year of 15-minute record is 35,000 values, and no answer needs them in a context window.

Prompts

A tool list says what can be called. It does not say what to call first, and the datum rule above is an order of operations rather than a call. Four prompts state the ones that go wrong when a model assembles them itself.

PromptWhat it walks through
freeboard_checkFetch the offset, then difference, then bound the answer
flood_statusStage against flood category, now and over the forecast
find_a_stationThe filter the relevant agency actually matches on
reproducible_answerAnswer, then export the manifest

Resources

The tables that do not change between calls, readable without spending a request against the hourly allowance.

ResourceWhat is in it
gagelink://instructionsThe four rules that decide whether an answer is right
gagelink://parametersThe common parameter codes and what each measures
gagelink://datumsEvery datum named here, and which can be converted onto
gagelink://coverageWhich tools answer for which country, and what each service omits
gagelink://manifestThis conversation's ledger, without a tool call

gagelink://parameter/{code} and gagelink://datum/{name} are templates, and their variables complete: the server answers completion/complete for them and for the prompt arguments with a closed set of values. The specification scopes completion to prompt arguments and resource template variables, which is why those two vocabularies are exposed as templates as well as inside the tool schemas.

Coverage

RegionServicesAvailable
United StatesUSGS, NOAA NWPS, NOAA National Water Model, NLDI, VDatumAll thirteen tools
FranceHub'EauSearch, metadata, latest readings, time series
United KingdomEnvironment AgencySearch, metadata, latest readings
GlobalSWOTSatellite water surface elevation

ERA5, GRACE, CAMELS and HydroBASINS are available to library callers.

Each service publishes a different amount, and the tools say which. Hub'Eau states no unit on any value, so levels in millimetres and flows in litres per second are labelled here from a recorded table. The Environment Agency publishes no record grade on live data, so age is the only staleness signal for a UK reading.

To find a UK station, find_locations takes country=GB. The agency matches river and town in full and in its own spelling, so River Thames returns stations and Thames returns none. Free text matched against the station name is the filter to use when the agency's spelling is unknown.

Protocol support

GageLink serves MCP revision 2026-07-28 and the three handshake revisions before it (2025-06-18, 2025-03-26, 2024-11-05). It declares tools, prompts, resources and completions, and declares listChanged false on all of them: every list is built at import, so a client that subscribed would be waiting on a notification that cannot come.

The 2026 revision removed the initialize handshake. Every request carries its own version and capabilities, so a client calls a tool on its first message and learns what the server is through server/discover. Clients on the earlier revisions continue to open a session and keep it.

Because a connection no longer implies a conversation, a client that wants a ledger of its own names one in _meta:

json
{"_meta": {"io.github.adeniyikayodee.gagelink/conversation": "whatever-you-call-it"}}

Each name gets its own manifest, quantities and checks. A client that sends no name shares the default.

For clients that cannot start a local process:

bash
gagelink-mcp --http          # http://127.0.0.1:8765/mcp

This binds to loopback and checks the Origin header. It has no authentication, so --host on a reachable interface gives away your hourly allowance.

Reproducible answers

Every retrieval is recorded with its URL, the time it was made, and a hash of the response body. export_manifest returns that record, and a session can be replayed later in three modes:

  • offline uses the archived bodies
  • strict checks the live service returns identical data
  • revision_aware separates a changed answer caused by an official record revision from one caused by changed code

The third mode exists because hydrology data is revised. A provisional measurement is often approved or corrected months later, so an answer can change for reasons that have nothing to do with the code. revision_aware tells the two causes apart.

Values are also checked against the ledger, so an answer can be audited:

text
[ok]         3.02 ft        from get_latest.00065[ok]         2960 ft3/s     from get_latest.00060[UNSOURCED]  116000 ft3/s   no tool output produced this value

Benchmark

waterbench measures whether the interface changes what a model gets right. It runs the same nine tasks under three conditions: raw API responses, structured results with the metadata stripped, and the full toolkit.

First results, gpt-oss-120b, eight replicates, 216 runs:

ConditionCorrect
Raw API61/72
Structured, no metadata63/72
GageLink70/72

Six of the nine tasks sit at ceiling, which is a finding about the suite. Where it separates, the causes are legible. Two long-record tasks sent 49,864 and 42,006 prompt tokens through raw JSON against 5,462 and 2,384 through the toolkit. On the opaque-unit task, stripping the reference frames sent seven of eight runs into the recorded trap, answering with the USGS discharge of 3010 ft³/s where the forecast service had published 2.95 kcfs.

One model and a small suite, so these numbers are an early signal about the interface. A general claim would need more models and more tasks.

Development

bash
python3 -m venv .venv.venv/bin/pip install -e ".[dev]".venv/bin/pytest

Requires Python 3.10 or later. The suite answers from recorded fixtures and needs no network access. mypy src/gagelink is expected to be clean.

License

MIT

來源:README.md,提交 8ce1d92

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v0.7.0最新Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分