关于 BNR exchange rates
BNR exchange rates 是只读 MCP 服务,用于查询罗马尼亚国家银行的参考汇率,并将金额换算为 RON 或从 RON 换算。它涵盖 2005 年以来的日期,保留公布的十进制汇率,并计算 ANAF 使用的年度平均汇率。
主要功能
- 01查询 2005 年以来指定日期的汇率
- 02将金额换算为 RON 或从 RON 换算
- 03获取多种货币及日期范围内的汇率
- 04计算 ANAF 年度平均汇率
- 05保留 BNR 的十进制精度
适用场景
- 01查询发票日期适用的汇率
- 02将外币金额换算为 RON
- 03获取一段时期内的汇率
- 04查询外币收入的年度平均汇率
MCP 相关
该 MCP 服务提供只读工具,用于健康检查、汇率查询、金额换算、多汇率查询和年度平均值计算。它读取 BNR 的公开 XML 文件,无需账户或 API 密钥。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
5收录的工具列表 · 更新于 3 天前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| year | integer | 是 | 日历年份,例如 2023。 |
| currency | string | 是 | ISO 4217 代码:EUR、USD、GBP、CHF 等(XAU 表示黄金,XDR 表示 SDR);不区分大小写。 |
详细介绍
BNR 汇率 MCP 服务
通过 AI 助手查询罗马尼亚国家银行的参考汇率:自 2005 年以来任意一天的生效汇率,以及 BNR 发布该汇率的日期;兑换为 RON 或从 RON 兑换的金额;一次查询多种货币的汇率或一段时间内的定盘汇率;以及 ANAF 在 D212 中用于折算外国收入的年度平均汇率。它只读取数据:没有工具会写入数据,也不会处理money。汇率保留 BNR 的原始精度(4.2440,而非 4.244)。
你不需要任何东西:无需账户,也无需密钥。该服务读取 curs.bnr.ro 上的 BNR 公开 XML 文件。
你可以这样提问
- “2025 年 3 月 14 日 BNR 的欧元汇率是多少?”
- “将一张日期为 2026 年 10 月 3 日、金额为 1,250.50 EUR 的发票按该日期之前 BNR 发布的最新汇率兑换为列伊。”
- “今天 10,000 HUF 等于多少 RON?”
- “列出 2026 年 9 月每个银行日的 BNR EUR 和 USD 汇率。”
- “我的 2025 年 D212 应使用哪个年度平均 USD 汇率?”
安装
使用 Claude Code:
claude mcp add bnr -- npx -y @foreverworks/mcp-bnr
Claude Desktop(Settings、Developer、Edit Config)和大多数其他客户端都以 JSON 格式读取相同的命令:
{
"mcpServers": {
"bnr": {
"command": "npx",
"args": ["-y", "@foreverworks/mcp-bnr"]
}
}
}
每个客户端都会在 Node 22.19 或更高版本上运行已发布的软件包。无需设置。
从克隆的仓库安装
git clone https://github.com/foreverworks/mcps.git && cd mcps
npm ci && npm run build
claude mcp add bnr -- node "$PWD/servers/bnr/dist/index.js"
在 JSON 配置中,命令为 node,其唯一参数是 servers/bnr/dist/index.js 的完整路径。若要通过 HTTP 在多个客户端之间共享同一个运行实例,请参阅 docs/deploying.md。
配置
无需单独配置。所有服务共用的变量见
docs/configuration.md;受
MCP_EGRESS_ALLOW 限制的进程必须允许访问 curs.bnr.ro。无论主机的时区如何,日期都采用布加勒斯特日期,因此“今天”指布加勒斯特的今天。
工具
所有工具均为只读:不会更改任何内容。
| 工具 | 访问权限 | 功能 |
|---|---|---|
health | 读取 | 检查 BNR 是否有响应:返回最新定盘汇率的日期和所含货币数量;如果该汇率已超过五天,则发出警告。 |
rate | 读取 | 查询某一天(默认今天)的生效汇率:返回当天的 BNR 定盘汇率,或此前最后一个银行日的汇率,并附上日期(published_on)和倍数。 |
convert | 读取 | 按照指定的舍入规则,将金额(十进制字符串)按某一天的生效汇率兑换为 RON 或从 RON 兑换;若当天没有汇率,则使用此前的最新汇率,并返回汇率及其日期。 |
rates | 读取 | 查询多种货币在某一天的生效汇率,或查询最长 366 天的时间窗口内 BNR 发布的所有定盘汇率;每种货币分别作为一个序列返回。 |
annual_average | 读取 | 查询 ANAF 使用的年度平均汇率:BNR 十二个月度平均汇率的均值,并附上各月平均值和天数。 |
故障排除
input。 该问题无法按要求回答,且未获取任何数据:日期晚于今天或早于 2005 年、时间范围超过 366 天或超过 2,000 条汇率(请减少货币种类或缩短时间范围),或换算时没有 RON 一方(请换算两次并说明两种汇率)。消息中会说明具体原因。
not_found:“BNR publishes no ... rate here; it publishes ...”。 BNR 不发布该货币的汇率;消息中会列出 BNR 发布的货币。
not_found:“BNR has no rates file for ... yet”。 年度文件会在发布首次定盘价时出现,因此 1 月初的新年文件还没有自己的汇率:rate 和 convert 会采用 12 月的最后一个定盘价,但新年时间范围内的 rates 及其 annual_average 会等到首次定盘价发布后才提供。
api。 BNR 的服务器未响应,即使重试后仍然如此(状态码 0 表示未能连接)。请几分钟后重试。
drift。 BNR 返回的内容不是其汇率 XML,例如 HTML 页面或格式发生变化。服务器不会猜测;请报告此问题。
工作原理
数据来源
BNR 在 curs.bnr.ro 发布静态 XML,这是其“Curs XML”页面列出的主机(读取日期:2026-10-18):/nbrfxrates.xml 是最新定盘价,/files/xml/years/nbrfxrates<year>.xml 则包含某一年的所有定盘价,包括当前年份(约 300 KB)。汇率表示每单位 RON,或 HUF、JPY、KRW 等少数货币每 100 单位 RON(其 multiplier)。
旧的 www.bnr.ro 地址会返回 HTML 主页,状态码为 200,只检查状态码的读取程序会误以为这是一个没有汇率的年份。此处任何不是 BNR 汇率文档的响应都会报错为 drift,非纯十进制数值的汇率也会如此处理。
获取数据。 过去年份的文件不会变化,因此每个进程只获取一次。当前年份的文件和最新定盘价会缓存十分钟;首次读取时年份仍为当前年份的文件也会缓存十分钟,以便该年份结束后重新从最终文件读取年度平均值。遇到 5xx、429 或连接中断时,最多重试三次。
某日适用的汇率
BNR 每个银行工作日约在布加勒斯特时间 13:00 发布一次定盘价。某日的汇率就是该日的定盘价;周末、公共假日或当天定盘价发布前,采用此前最近一次定盘价(1 月初则采用 12 月的最后一个定盘价)。每个答复都包含 published_on,即所用定盘价的发布日期,因此你可以说明所依据的发布数据;如果在当天定盘价发布前查询当天汇率,答复还会附带说明这一情况的 note。
换算金额
convert 接收十进制字符串形式的金额,因此 1250.50 会按原样参与计算。换算为 RON:金额 × 汇率 / 倍数;从 RON 换算:金额 × 倍数 / 汇率(按每 100 HUF 兑换 1.2354 RON 计算,10000 HUF 等于 123.54 RON)。精确结果只舍入一次,舍入到 places 位(0 到 8 位,默认 2 位),默认采用四舍五入(半数远离零,符合发票舍入规则);除非 rounding 设为 half-even。
rate_rule 用于选择定盘价,答复会说明所采用的规则:
in_force(默认值)与rate返回的汇率一致:当天的定盘价,或最近一个银行工作日的定盘价。last_before是严格早于该日期的最近一次定盘价。罗马尼亚《财政法典》规定,外币发票应按增值税到期日“之前 BNR 公布的最后一个汇率”换算,因此,日期为星期五的发票采用星期四的定盘价,日期为星期一的发票采用星期五的定盘价。
答复会附带 BNR 公布的汇率、倍数、日期,以及一行可直接粘贴到文档中的 meaning:“100 EUR = 509.10 RON,依据 BNR 公布的 EUR 汇率 5.0910 RON/1 EUR,发布日期为 2026-10-16(于 2026-10-16 生效),按四舍五入保留 2 位小数”。
一次查询多个汇率
rates 会为每种货币返回一个序列(最多 50 种指定货币,或 BNR 发布的所有货币),每个序列都包含其乘数和定盘价,按时间从早到晚排列。指定 date(或不指定,表示今天)时,序列包含该日生效的汇率,并以其定盘日期标注;指定 from 和 to(默认为今天)时,则包含窗口内的每个定盘价,包含起止日期;若没有序列,会附注说明。窗口最多为 366 天和 2,000 个汇率(大约相当于一年内七种货币,或两个月内所有货币),因此结果仍然易于阅读。BNR 曾发布、但在窗口内没有定盘价的货币会列在 absent 中;若 BNR 在读取的年份内从未发布某种货币,则会拒绝查询,并列出 BNR 确实发布过的货币代码。
年平均汇率
D212 按照“罗马尼亚国家银行公布的年度平均汇率”将外币收入换算。BNR 发布的年度平均值(“年度序列——平均值”)是十二个月平均值的平均数(每个月的平均值又是该月每日汇率的平均数),精确到四位小数,而不是全年每日汇率的平均值(2022 年 USD:4.6885,而非 4.6923)。服务会以精确小数计算每个月的平均值和年度平均值,并将每个结果仅舍入一次,采用四舍五入到四位小数。
这与 BNR 发布的数值一致:USD 2020 年为 4.2440、2021 年为 4.1604、2022 年为 4.6885、2023 年为 4.5743,EUR 2022 年为 4.9315;无论是否先对月平均值进行舍入,结果都一致。若某年尚未结束,则会返回截至目前各月的结果,并标记 complete: false。npx tsx scripts/smoke.ts 会针对实时文件重复执行 USD 校验。
限制
- 仅限 BNR 参考汇率,不包括 ECB 或商业银行的汇率。
- 从 2005 年开始,这是 BNR 的 XML 序列起始年份。
- 不提供交叉汇率。 BNR 不发布两种其他货币之间的汇率,因此换算时其中一种货币必须是 RON。
- 若一个月内乘数发生变化,年度平均值计算会以
drift失败,而不是按两种基数分别计算该月平均值;读取的文件中尚未发生过这种情况。若乘数在不同月份之间发生变化,则会返回warning。
其他 BNR 服务
搜索日期:2026-10-18。BNR 没有发布 MCP 服务,社区中存在一个服务:
- npm 上的
@pipeworx/mcp-bnr-ro(0.1.2,2026-09),通过 Pipeworx 网关提供,与大约 30 个共享元工具并列。它的两个工具分别返回最新定盘价或某一年的定盘价,且每个汇率都是 JavaScript 数字(4.2440会以4.244返回);两者都不会选取某一天生效的汇率,也不会计算年度平均值。
2026-10-21 的第二次搜索又发现了两个可将金额换算为 RON 的工具:
- PyPI 上的 anafpy MCP 工具。
- PyPI 上的
bnr-converter-mcp-server,它也会取某个日期之前的最后一个汇率,但金额使用 Python 浮点数,并通过浮点数进行舍入。
一些库也会读取相同的 XML,但不使用 MCP:npm 上的 curs-bnr、bnr-exchange-rate 等;PyPI 上的 bnrxrate 和 anafpy 的 BNR 客户端;以及 Packagist 上的 itrack/cursbnr 和 peterlupu/curs-bnr。
开发这个服务,是为了实现这些工具都做不到的功能:它直接从 BNR 读取数据,运行位置由调用方决定;保留每个汇率在 BNR 中的原始写法;返回任意日期生效的汇率,包括周末、节假日和 13:00 之前的时段;按指定的舍入规则以精确小数进行换算;并按 BNR 发布、ANAF 使用的方式计算年度平均值。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。