mcpField
E
echorune radar

echorune radar

远程服务
echorune.net地图与出行34 周前更新

关于 echorune radar

echorune radar 提供面向文本环境的天气雷达,将降雨位置、强度和移动方向绘制成字符网格。它适用于人类与文本型 Agent,并可通过 HTTP 或 MCP 查询地点天气。

主要功能

  1. 01以字符网格呈现雷达图
  2. 02显示当前天气与未来降雨趋势
  3. 03支持地点名称和经纬度查询
  4. 04提供英文与中文输出
  5. 05含离线地名解析和 Python 渲染库

适用场景

  1. 01让文本型 Agent 判断降雨位置和移动方向
  2. 02在终端或日志中查看天气雷达
  3. 03按城市名称或坐标获取天气场景

MCP 相关

远程 MCP 服务通过 Streamable HTTP 提供 `get_weather` 工具,参数为地点和可选语言。工具返回与 HTTP 路由相同的文本天气结果。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://echorune.net/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

工具

1
参数类型必填说明
langenum否回复语言。默认值为 en。en | zh | ja
placestring是地点名称(任意语言)或“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 中致谢。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。