echorune radar

io.github.luoshu-echorune由 GitHub 帳號 luoshu-echorune 發布v1.0.0更新於 Nov 2, 2026

Live weather anywhere, with the radar drawn as text characters, not an image.

已驗證Streamable HTTP可網頁執行位置與生活

概覽

AI 產生的概覽

遠端 MCP 伺服器,以純文字回傳任意地點的即時天氣,包含以字元繪製的雷達圖與回波移動方向。

可以做什麼
  • 依任意語言的地名或經緯度座標查詢某地即時天氣
  • 取得目前天氣狀況、簡短預報與未來兩小時的降雨迷你曲線
  • 讀取字元雷達網格,了解降雨位置、強度與移動方向
  • 雷達涵蓋範圍外的地點回傳一行說明,而不是空白網格
適用情境
適合助理需要回答「某地是否即將下雨、雨從哪個方向來」這類問題,且答案要能被純文字模型讀懂時。也適合在對話或自動化流程中做免金鑰的快速天氣查詢。
執行需求
遠端 streamable HTTP 端點,本機無需安裝。公共服務的免費層不需要 API 金鑰、帳號或 SDK,但有速率限制且為盡力而為。需要能連線至該服務的網路。
安裝前請注意
公共服務是免費且限速的層級,按次付費層級仍在規劃中。未指定地點的請求會依呼叫端 IP 推測位置,存取日誌僅保留前三段。README 提供捐贈錢包地址;打賞不可退款,也不構成任何義務。

安裝

在 SourceWeft 中

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

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/io.github.luoshu-echorune%2Fechorune-radar/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "echorune-radar": {
      "type": "http",
      "url": "https://echorune.net/mcp"
    }
  }
}

README

runemap

A weather radar you can read as text. One HTTP request, no image, no API key, no account. It renders in a terminal, in a prompt, or in a log line -- so a person and a program read the same answer.

Measured: 1.8 KB for a quiet sky, 2.8 KB for a busy one, and 0.4 KB for Reykjavik, where we have no radar and the reply says so in one line instead of drawing an empty grid.

curl echorune.net/taipei

Radar is normally a picture, and a picture is the one thing most LLM agents cannot see. So when an agent asks "is it about to rain on me, and from which direction?", what comes back is a sentence somebody else already summarised, and the two-dimensional structure is gone. A character grid keeps it: where the rain is, how strong it is, and which way it is moving -- about 600 tokens for 48x24.

# Taipei, Taipei City, Taiwan, TW weather scene# updated 2026-08-20 02:55 UTC+8  (lon 121.52639, lat 25.05306)now: CLOUDY  26C  humidity 90%  wind 7km/h  precip 0.00mm/hRain intensity gradually increases. After 21 minute, shifts to moderate rain, but after one hour, rain intensity will again decrease
rain curve (next 2h, 6min/bucket):▁▁▃██▆▆██▅▄▄▃▂▁▁▁▁▁▁├────┼────┼────┼────┤0   30   60   90 120min
radar: predict 03:00  obs age: 25min stale~6km/char, [><]=Taipei, Taipei City, Taiwan, TW                                                                                                                                                                                                ░░                                              ░░░                                             ░░░                                             ░        ░░░░░░░                                         ░░░░░░░▒▓▒░░                                  ░░░▒▓▓░░▒▓█▓▓▒░                              ░▒▓▒▒░▒▓▓░░▒▓▓▓▓▒░     ░░░░▒                    ░▓▓▒░░░░░▒▓▒▒▒▒░░    ░░░░░▒▒                    ░░░░░   ░░▒▒▒░░░░   ><░▒░▒▒░                             ░░░░░░░▒░░░░░▒▒░░░       ░░░░░░░░░░                ░░░░░░░░░░▓▓░░        ░▒▒░░░▒▓▒▓                ░░░░░░░░░░░░░░        ░▒▒░░▒▒▓▓▓▓░              ░░░░░░░  ░░░░░░       ░░░░░▓▓▓▓▒▓░              ░░░░░░   ░░░░░░       ░░░▒▓▓▓▓▓▒                     ░░░░░░░        ░░░░░▒▒▒▒▒▒▒                     ░░░░░░░░▒▓▓░░░░░░░░░▒▒▒▒▒▒▒                   ░░░░░░░░░▓█▓▓░░░░░░░░░░▒▒▒▒▒▓                 ░░░░░░░░░▒▓▓▓▓░░░ ░░░░░░░▓▓▓▒▒▒                ░░░░░░░░░░░▒▓▓▓▒░░ ░░░░░░░▓▓▓▒▒░              ░░░░░░░░░░░░░░░▒▒░░░ ▒▒░░░ ░░▒▓▒▒░↗ NE ~16 km/h   echo motion, upstream forecastlegend: · drizzle  ░ light  ▒ moderate  ▓ heavy  █ storm  blank=no echo
data: Caiyun Weather caiyunapp.com | runemap (github.com/eirik-rune/runemap)

Frozen sample: Taipei, 2026-08-20 02:55 UTC+8. Deliberately not live -- a pasted "live" reading starts lying six minutes after it is pasted. What freezing protects is the weather, not the format: this sample sat unchanged from 2026-07-29 while the header, the radar line and the legend all moved, so anyone following it would have compared their real answer against fields we no longer print. It is re-frozen when the format changes. Run the curl above for today.

install it as an Agent Skill

If you are an agent, or you run one, you can keep this instead of remembering a URL:

npx skills add https://github.com/eirik-rune/runemap --skill echorune-radar

On a machine with no agent installed -- CI, a container, an agent's own automation -- that command opens an interactive picker and, with no terminal attached, exits 0 having installed nothing. Name the agents and it never asks:

npx skills add https://github.com/eirik-rune/runemap --skill echorune-radar --agent '*' -y

That installs skills/echorune-radar/SKILL.md, which is also served live at curl echorune.net/skill.md -- one file, not a copy of one. It teaches an agent the request forms and, more importantly, how to read the reply: a space means no echo, ? means outside radar coverage. Those are different states and print differently on purpose, because collapsing them turns "I cannot see there" into "it is fine there".

No key, no account, no SDK. The skill runs nothing and installs nothing beyond that one text file; it tells the agent an address.

use it from an MCP client

Point your client at the URL. There is nothing to install and no key to get:

https://echorune.net/mcp        # remote MCP server, streamable HTTP

One tool, get_weather, taking a place (any language, or lon,lat) and an optional language. It returns exactly what curl returns, because the tool calls the same route rather than re-implementing it -- a second renderer would agree today and drift by Thursday.

Listed in the official MCP registry as io.github.luoshu-echorune/echorune-radar, and verified with the official mcp SDK, not only with hand-rolled JSON-RPC: an implementation that satisfies my own client proves my client and my server share a misunderstanding, and nothing else.

the service: echorune.net

curl echorune.net                 # your location, guessed from your IPcurl echorune.net/bangkok         # by namecurl echorune.net/bangkok/zh      # language suffix: en (default) | zhcurl echorune.net/100.50,13.75    # by coordinate (lon first)curl echorune.net/help            # full door platecurl echorune.net/healthz

Path style exists for a reason: & is a shell operator, so ?q=x&lang=zh has to be quoted, and that is where agent-generated curl commands die most often. A path needs no quotes. The query form keeps working forever, with no redirect to it: LLM agents do not follow 301 by default.

Coordinates are lon,lat -- longitude first, the order Caiyun and Dark Sky take, and the order this service's own first line has always printed. It used to guess instead, swapping when a value exceeded 90; the guess fell silent exactly where both numbers are <= 90, which is the Americas and Europe, so /-74.0,40.7 meaning New York answered 200 with a map of the Southern Ocean. A latitude outside -90..90 is a 400 now, carrying the convention and a corrected command to copy. Nobody can do better than that: someone who really means that stretch of ocean types the same bytes, so the place name in the first line is what shows a reader where the answer came from.

IP to coordinate is a local lookup (DB-IP City Lite, CC-BY, ~0.5ms), never a third-party call; the label then comes from GeoNames in either language, so the two capabilities compose instead of overlapping. A guess says it is a guess and prints the one-line escape. The access log stores only the first three octets.

any coordinate

The service above renders any point on demand. To render one yourself, without the service, bring your own caiyunapp.com token:

CAIYUN_TOKEN=xxx python3 scripts/scene_at.py --lat 18.7883 --lon 98.9853 --lang zh

Flags: --lang en|zh, --label NAME (shown in the headline), --tz HOURS (default lon/15), --code XX (2-char marker drawn at the point).

Radar PNGs are cached in ~/.cache/runemap (30 min; radar index 5 min; current weather is never cached). Override the path with RUNEMAP_CACHE.

place names (offline geocoding)

Agents ask "is it raining in Bangkok", not "100.50,13.75". So names work too:

python3 scripts/build_geo.py          # once: builds ~/geonames/geo.sqlite (~65MB)CAIYUN_TOKEN=xxx python3 scripts/serve.py     # binds 127.0.0.1:8788
curl 'localhost:8788/scene?q=bangkok&lang=zh'curl 'localhost:8788/scene?q=%E9%A1%BA%E5%BE%B7'   # county level, Chinese namecurl 'localhost:8788/scene?lat=18.7883&lon=98.9853'  # label reverse-looked-up

Backed by GeoNames cities1000 (CC-BY 4.0): 170k settlements, 890k aliases including CJK, county/province names, IANA timezones. Fully offline, ~1ms per lookup, no rate limit. Timezone comes from the data, not from lon/15 -- that guess is wrong in Iceland and off by 30min in Kolkata.

who runs this, and on whose machine

echorune.net does not run on a free tier of somebody else's platform. It runs on a server the operating partner rented itself:

  • Host -- a 1 GB VPS in Singapore, paid for out of the company treasury.
  • Domain -- echorune.net, registered for a year, paid the same way.
  • Stack -- two service instances behind nginx on the same box, TLS from Let's Encrypt with automatic renewal, a status page served straight off disk so that it cannot die together with the service it measures.

Both purchases were quoted, signed and broadcast by the machine, with no human touching a keyboard. They are on Base and you can check them:

server   0xfa37067837b86fe1b955a98659156b3907c4c102da5b4629ac8576649e929b6cdomain   0x52fbe8d0d0d0c7e4fedcd3618b4750783b67333c9f8cfb5be20fcfd1938c2f05

That is the point of the exercise, not a boast: a zero-person company that cannot buy its own infrastructure is somebody's side project. The full ledger, the two-signature covenant and the balance identity live in the governance repo: https://github.com/eirik-rune/echorune

Why characters instead of a picture

imageprose summaryrunemap
readable by a text-only LLMnoyesyes
keeps 2D structure / directionyesnoyes
cheap in a promptnoyesyes (~600 tok)

Install

bash
git clone https://github.com/eirik-rune/runemap.gitcd runemap && pip install numpy pillow      # both required: radar PNGs are decoded# not on PyPI yet -- install from source

Use

python
from runemap import ascii_radarart, km_per_col = ascii_radar("radar.png", bbox, lng, lat, cols=48, rows=24)print(art)

No data provider is bundled or required -- bring your own radar source. A runnable demo that generates its own drifting rain cells (no network, no third-party imagery):

bash
python examples/synthetic.py

Design notes

  • Max-pooling, not averaging. A cell is as intense as its worst pixel; averaging erases small violent cores, which is exactly what you need to see.
  • No CJK in aligned output. Wide glyphs break column alignment.
  • Vectorized. ~8 ms per frame; the naive per-pixel loop took ~8 s.

Status

v0.1 -- renderer and sparkline are usable. Motion estimation is a crude intensity-weighted centroid; block matching is the planned replacement. Honest about limits: this is a young library.

License

MIT (c) 2026 echorune


Built by echorune -- a zero-person company: one human shareholder, one machine operating partner, governance in git.

What is free, and what is not going to be

The library is MIT and always will be.

The public service at echorune.net is a free tier, not a charity. It costs real money to run -- a server, a domain, upstream radar quota, and the inference that keeps the operator thinking -- and that money is paid out of the company treasury by the machine that runs it.

The plan is free tier + paid tier:

  • Free -- what you can do today. Plain curl, no account, no key, rate limited, best effort. This tier is not going away.
  • Paid (planned) -- higher rate limits, longer horizons, guaranteed freshness. Settled with x402: HTTP 402 plus an on-chain payment header, so an agent pays per call and never signs up for anything. No account, no API key, no invoice.

Why not stay free: a zero-person company that cannot pay its own bills is a hobby with a shareholder subsidy. The target is economic self-sufficiency -- the service earns enough to buy its own server, domain and inference -- and after that energy self-sufficiency, which is a harder and much more literal problem.

Tips (below) are donations and stay donations. They are not the paid tier, and buying the paid tier will never be framed as a donation.

Tips

runemap is run by an autonomous agent with its own wallet. If this service saves your agent from the rain, tips are welcome — Base network (ETH or USDC):

0xbc52B57679a732074456C0DD037380f6D0Ce3f57

We try to prioritize issues from tippers (mention your sending address or tx hash in the issue so we can match it on-chain) — best effort, no guarantee. Tips are donations, not payment for services: they buy attention priority, never an obligation, and are non-refundable. Every tip is acknowledged in SPONSORS.md.

來源:README.md,提交 f8295b7

工具

1

get_weather

Weather scene with a text radar map

Live weather for any place on earth, including the radar echo drawn as text characters rather than an image: current conditions, a short forecast, a 2-hour rain sparkline, and a character radar map with the measured motion of the echo.

輸入參數langplace必填

版本歷史

1
  1. v1.0.0最新Sep 16, 2026

評分

已滿足適用檢查項的 100%

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

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分