关于 echorune radar
echorune radar 提供面向文本环境的天气雷达,将降雨位置、强度和移动方向绘制成字符网格。它适用于人类与文本型 Agent,并可通过 HTTP 或 MCP 查询地点天气。
主要功能
- 01以字符网格呈现雷达图
- 02显示当前天气与未来降雨趋势
- 03支持地点名称和经纬度查询
- 04提供英文与中文输出
- 05含离线地名解析和 Python 渲染库
适用场景
- 01让文本型 Agent 判断降雨位置和移动方向
- 02在终端或日志中查看天气雷达
- 03按城市名称或坐标获取天气场景
MCP 相关
远程 MCP 服务通过 Streamable HTTP 提供 `get_weather` 工具,参数为地点和可选语言。工具返回与 HTTP 路由相同的文本天气结果。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://echorune.net/mcpclaude mcp add --transport http luoshu-echorune-echorune-radar https://echorune.net/mcp{"mcpServers":{"luoshu-echorune-echorune-radar":{"type":"http","url":"https://echorune.net/mcp"}}}在 Cursor 中打开{"servers":{"luoshu-echorune-echorune-radar":{"type":"http","url":"https://echorune.net/mcp"}}}在 VS Code 中打开{"mcpServers":{"luoshu-echorune-echorune-radar":{"type":"http","url":"https://echorune.net/mcp"}}}{"mcpServers":{"luoshu-echorune-echorune-radar":{"serverUrl":"https://echorune.net/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
1| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| lang | enum | 否 | 回复语言。默认值为 en。en | zh | ja |
| place | string | 是 | 地点名称(任意语言)或“lon,lat”,经度在前,例如 tokyo、清迈或 139.7,35.7 |
详细介绍
runemap
一种可以用文本读取的天气雷达。 只需一次 HTTP 请求,无图片、无需 API 密钥,也无需账户。它可以在终端、提示词或日志行中呈现——这样人和程序读取的是同一份结果。
实测:晴朗天空为 1.8 KB,天气繁忙时为 2.8 KB;雷克雅未克为 0.4 KB,我们在那里没有雷达,回复会用一行说明这一点,而不是绘制空网格。
curl echorune.net/taipei
雷达通常是图片,而图片恰恰是大多数 LLM Agent 无法看到的东西。所以,当 Agent 问 “我这里是不是快要下雨了,雨是从哪个方向来的?” 时,返回的却是一句别人已经概括好的话,二维结构也随之消失。字符网格能保留这些信息:雨在哪里、雨势有多强,以及雨正朝哪个方向移动——48x24 的网格约需 600 个 token。
# 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/h
Rain 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 forecast
legend: · drizzle ░ light ▒ moderate ▓ heavy █ storm blank=no echo
data: Caiyun Weather caiyunapp.com | runemap (github.com/eirik-rune/runemap)
冻结样例:台北,2026-08-20 02:55 UTC+8。 特意设为非实时——粘贴的“实时”读数在粘贴六分钟后就会开始说谎。冻结保护的是天气,不是格式:这个样例从 2026-07-29 起一直没有变化,而标题、雷达行和图例都已更新,因此跟着它的人会拿自己的实时结果去对照我们已不再输出的字段。格式变更时会重新冻结。运行上面的 curl 获取今天的数据。
将其安装为 Agent Skill
如果你是 Agent,或者你在运行 Agent,可以保留这个技能,无需记住 URL:
npx skills add https://github.com/eirik-rune/runemap --skill echorune-radar
在没有安装 Agent 的机器上——CI、容器或 Agent 自己的自动化环境——该命令会打开交互式选择器;如果没有连接终端,则会以退出码 0 结束,但不会安装任何内容。指定 Agent 名称后,它就不会再询问:
npx skills add https://github.com/eirik-rune/runemap --skill echorune-radar --agent '*' -y
这会安装 skills/echorune-radar/SKILL.md,该文件也通过 curl echorune.net/skill.md 实时提供——只有一个文件,不是副本。它会教 Agent 如何发起请求,更重要的是如何读取回复:空格表示没有回波,? 表示超出雷达覆盖范围。这代表不同的状态,特意采用不同的打印方式,因为把它们混为一谈,就会把“我看不到那里”变成“那里没问题”。
无需密钥、账户或 SDK。这个技能不会运行任何程序,除了那一个文本文件之外也不会安装任何东西;它只会告诉 Agent 一个地址。
在 MCP 客户端中使用
将客户端指向该 URL 即可。无需安装任何东西,也无需获取密钥:
https://echorune.net/mcp # 远程 MCP 服务,streamable HTTP
提供一个工具 get_weather,接受一个地点(任意语言,或 lon,lat)和一个可选语言。它返回的内容与 curl 完全一致,因为该工具调用的是同一个路由,而不是重新实现一遍——第二个渲染器今天或许能保持一致,到周四就可能出现偏差。
已在官方 MCP 注册表中登记为 io.github.luoshu-echorune/echorune-radar,并通过官方 mcp SDK 验证,而不只是用手写的 JSON-RPC 验证:能满足我自己的客户端要求,只能证明我的客户端和服务端共享了某种误解,除此之外什么也证明不了。
服务:echorune.net
curl echorune.net # 根据你的 IP 猜测你的位置
curl echorune.net/bangkok # 按名称查询
curl echorune.net/bangkok/zh # 语言后缀:en(默认)| zh
curl echorune.net/100.50,13.75 # 按坐标查询(经度在前)
curl echorune.net/help # 完整说明
curl echorune.net/healthz
路径格式有其原因:& 是 shell 运算符,因此 ?q=x&lang=zh 必须加引号,而 Agent 生成的 curl 命令最常在这里出错。
路径无需加引号。查询参数格式会一直保留,不会重定向到路径格式:大模型 Agent 默认不会跟随 301 重定向。
坐标格式为 lon,lat——经度在前,这也是 Caiyun 和 Dark Sky 采用的顺序,也是本服务第一行内容始终打印的顺序。过去,服务会自行猜测,并在某个值超过 90 时交换顺序;当两个数字都 <= 90 时,猜测就会失效,恰好覆盖美洲和欧洲,因此表示纽约的 /-74.0,40.7 会返回 200,但地图却显示南大洋。现在,超出 -90..90 范围的纬度会返回 400,并附上坐标约定以及可直接复制的正确命令。对此无能为力:真正要查询那片海域的人输入的字节完全相同,因此第一行的位置名称能让读者知道答案来自哪里。
IP 到坐标的转换通过本地查询完成(DB-IP City Lite,CC-BY,约 0.5ms),绝不会调用第三方;随后,位置标签通过 GeoNames 获取,支持任一语言,因此这两项功能可以组合使用,而非彼此重叠。猜测结果会明确标示为猜测,并打印单行的退出提示。访问日志仅存储前三个八位组。
任意坐标
上述服务可按需渲染任意地点。若要自行渲染,而不使用该服务,请自备 caiyunapp.com 令牌:
CAIYUN_TOKEN=xxx python3 scripts/scene_at.py --lat 18.7883 --lon 98.9853 --lang zh
参数:--lang en|zh、--label NAME(显示在标题中)、--tz HOURS(默认值为 lon/15)、--code XX(绘制在该位置的 2 字符标记)。
雷达 PNG 缓存于 ~/.cache/runemap(30 分钟;雷达索引 5 分钟;当前天气永不缓存)。使用 RUNEMAP_CACHE 可覆盖路径。
地名(离线地理编码)
Agent 会问“曼谷下雨吗”,而不是“100.50,13.75”。因此也支持名称查询:
python3 scripts/build_geo.py # 一次性操作:在 ~/geonames/geo.sqlite 中构建数据库(约 65MB)
CAIYUN_TOKEN=xxx python3 scripts/serve.py # 绑定到 127.0.0.1:8788
curl 'localhost:8788/scene?q=bangkok&lang=zh'
curl 'localhost:8788/scene?q=%E9%A1%BA%E5%BE%B7' # 县级,中文名称
curl 'localhost:8788/scene?lat=18.7883&lon=98.9853' # 反向查询位置标签
基于 GeoNames cities1000(CC-BY 4.0):包含 17 万个居民点、89 万个别名(包括中日韩文字)、县/省名称和 IANA 时区。完全离线,每次查询约 1ms,无速率限制。时区取自数据,而非通过 lon/15 推算——这种猜测在冰岛会出错,在加尔各答则会差 30 分钟。
谁在运行,以及运行在哪台机器上
echorune.net 并非运行在别人平台的免费套餐上,而是运行在运营合作方自行租用的服务器上:
- 主机 —— 新加坡的一台 1 GB VPS,费用由公司金库支付。
- 域名 —— echorune.net,注册一年,费用同样由公司金库支付。
- 技术栈 —— 同一台机器上由 nginx 反向代理的两个服务实例,使用 Let's Encrypt 提供的 TLS 并自动续期;状态页直接从磁盘提供,因此不会和它所监测的服务一起宕机。
两笔采购均由机器报价、签署并广播,全程没有人碰键盘。它们记录在 Base 上,可供查验:
server 0xfa37067837b86fe1b955a98659156b3907c4c102da5b4629ac8576649e929b6c
domain 0x52fbe8d0d0d0c7e4fedcd3618b4750783b67333c9f8cfb5be20fcfd1938c2f05
这正是这项实践的意义,而非炫耀:一个无法为自己的基础设施买单的零人公司,只是某人的副业项目。完整账本、双签名契约和余额恒等式都在治理仓库中:https://github.com/eirik-rune/echorune
为什么用字符,而不是图片
| 图片 | 文字摘要 | runemap | |
|---|---|---|---|
| 纯文本大模型可读 | 否 | 是 | 是 |
| 保留二维结构/方向 | 是 | 否 | 是 |
| 提示词开销低 | 否 | 是 | 是(约 600 tok) |
安装
git clone https://github.com/eirik-rune/runemap.git
cd runemap && pip install numpy pillow # both required: radar PNGs are decoded
# not on PyPI yet -- install from source
使用
from runemap import ascii_radar
art, km_per_col = ascii_radar("radar.png", bbox, lng, lat, cols=48, rows=24)
print(art)
不附带也不要求任何数据提供方——请自备雷达数据源。 下面是一个可运行的演示,会自行生成漂移的雨云单体(无需网络,也无需第三方图像):
python examples/synthetic.py
设计说明
- 最大池化,而非平均。 一个单体的强度取决于其最强像素;平均会抹去小型强烈核心,而这恰恰是你需要看到的。
- 对齐输出中不使用中日韩字符。 宽字符会破坏列对齐。
- 向量化。 每帧约 8 ms;朴素的逐像素循环耗时约 8 s。
状态
v0.1 —— 渲染器和迷你图已可用。运动估计采用粗略的强度加权质心;计划用块匹配替代。 如实说明其局限:这是一个新兴库。
许可证
MIT (c) 2026 echorune
由 echorune 构建——一家零人公司:一名人类股东、一名机器运营合作方,治理记录存于 git。
哪些内容免费,哪些内容不会一直免费
该库采用 MIT 许可证,并将始终如此。
echorune.net 上的公共服务提供的是免费套餐,而非慈善服务。运行它需要真金白银——服务器、域名、上游雷达配额,以及让运营方保持思考的推理服务——这些费用由运行该服务的机器从公司金库中支付。
计划采用免费套餐 + 付费套餐:
- 免费 —— 你今天就能使用的内容。使用普通的
curl,无需账户、无需密钥,设有速率限制,尽力提供服务。这个套餐不会取消。 - 付费(计划中)——更高的速率限制、更长的预报时段、保证数据新鲜度。通过 x402 结算:HTTP 402 加上链上支付标头,让 Agent 按次付费,无需注册任何服务。无需账户、无需 API 密钥、无需发票。
为何不一直免费:无法支付自身账单的零人公司,只是靠股东补贴维持的爱好项目。目标是实现经济自给自足——服务收入足以支付自己的服务器、域名和推理费用——之后再实现能源自给自足,这是个更难、也更实际的问题。
下文的打赏属于捐赠,并将始终是捐赠。打赏不是付费套餐,购买付费套餐也绝不会被称作捐赠。
打赏
runemap 由一个拥有自己钱包的自主 Agent 运行。如果这项服务曾为你的 Agent 遮风挡雨,欢迎通过 Base 网络(ETH 或 USDC)打赏:
0xbc52B57679a732074456C0DD037380f6D0Ce3f57
我们会尽力优先处理打赏者的问题(请在问题中注明你的发送地址或交易哈希,以便我们在链上核对)——我们会尽力而为,但不作保证。打赏是捐赠,并非服务费用:它只提升处理优先级,不构成任何义务,且不予退款。每笔打赏都会在 SPONSORS.md 中致谢。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。