mcpField
S
swiss-snb-mcp

swiss-snb-mcp

本地服务
github.com金融数据05 周前更新

关于 swiss-snb-mcp

swiss-snb-mcp 是面向 MCP 客户端的瑞士国家银行公开数据服务,可查询汇率、资产负债表、利率及银行统计等宏观数据。它通过专用工具和通用数据立方体接口覆盖多类数据,并提供静态目录资源。

主要功能

  1. 01查询月度及年度汇率
  2. 02按官方汇率换算瑞郎
  3. 03查看瑞士国家银行资产负债表
  4. 04查询利率、SARON 和货币总量
  5. 05检索银行统计及国际收支
  6. 06通过数据立方体 ID 查询数据

适用场景

  1. 01比较 EUR/CHF 历史汇率
  2. 02将金额按官方汇率换算为瑞郎
  3. 03查看黄金储备及银行资产负债
  4. 04比较瑞士、美国和欧元区利率

MCP 相关

该 MCP 服务向客户端提供只读工具和静态目录资源,用于访问瑞士国家银行公开 API。无需身份验证。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"malkreide-swiss-snb": {
"command": "uvx",
"args": [
"swiss-snb-mcp"
]
}
}
}
启动命令uvx swiss-snb-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypiswiss-snb-mcp0.5.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

🇨🇭 属于 Swiss Public Data MCP Portfolio

🏦 swiss-snb-mcp

Version License: MIT Python 3.11+ MCP Data Source CI

用于访问瑞士国家银行(SNB)数据门户的 MCP 服务——提供汇率、资产负债表、利率、SARON、货币总量、银行统计数据和国际收支数据。

🇩🇪 德语版

演示:Claude 通过 MCP 工具调用查询 SNB 银行统计数据


概览

swiss-snb-mcp 通过模型上下文协议(MCP),将 AI 模型连接到瑞士国家银行的官方数据门户 data.snb.ch。它提供对 SNB 公共 REST API 的结构化访问——无需身份验证。

该服务涵盖三个层级的数据集,且均已通过实时 API 确认:

阶段 1 — 专用工具:

  • 汇率(月平均汇率、月末汇率、年平均汇率):覆盖 devkum 发布的 28 种兑 CHF 货币序列,包括两种明确标注的 USD 远期汇率
  • SNB 资产负债表(Bilanz):黄金储备、外汇投资、流通钞票、活期存款及合计数

阶段 2 — 通过通用数据立方体工具(snb_get_cube_data + snb_get_cube_metadata)访问:

  • SNB 政策利率(Leitzins)和 SARON:每日定盘利率、紧急贷款工具利率、活期存款利率
  • SARON 复合利率:隔夜、1M、3M、6M
  • 国际货币市场利率:SARON(CH)、SOFR(USA)、TONA(JP)、SONIA(UK)、€STR/EURIBOR(EZ)
  • 官方央行利率:SNB、美联储、ECB、英格兰银行、日本银行
  • 货币总量 M1、M2、M3:存量水平和同比变化

阶段 3 — Warehouse API(银行统计数据)和国际收支:

  • 银行资产负债表(BSTA BIL):按银行类别统计的资产和负债总额——年度和月度数据
  • 银行损益表(BSTA EFR):按银行类别统计的营业收入、支出和税项——年度数据
  • 国际收支:经常账户、资本账户、金融账户(季度数据)
  • 国际投资头寸:按投资类型划分的组成项目(季度数据)
  • 通用 Warehouse 访问:按 ID 原始访问任意 SNB Warehouse 数据立方体

演示核心问题: “2015 年瑞郎冲击期间,欧元兑瑞郎汇率是多少?与美联储和 ECB 相比,SNB 当前的政策利率处于什么水平?”


功能

  • 💱 汇率 — EUR、USD、JPY、GBP、CNY 等 23 种以上货币兑 CHF 的月度汇率
  • 📅 年度平均汇率 — 从 1980 年起逐年的汇率
  • 🏛️ SNB 资产负债表 — 黄金、外汇投资、钞票、活期存款(月度数据)
  • 🔄 货币兑换 — 使用 SNB 官方汇率将任意金额兑换为 CHF
  • 📈 政策利率和 SARON — 每日定盘利率、Leitzins、复合利率(1M/3M/6M)
  • 🌍 国际利率对比 — 并列比较 SNB、美联储、ECB、英格兰银行和日本银行
  • 💰 货币总量 — M1、M2、M3 存量水平和同比增长
  • 🏦 银行统计数据 — 按银行类别统计的资产负债表和损益表(12 类)
  • 📊 国际收支 — 经常账户、IIP 和国际投资头寸
  • 🔍 通用数据立方体访问 — 按 ID 查询任意 SNB 数据立方体或 Warehouse 数据立方体
  • 🔓 无需身份验证 — 完全开放的 SNB 数据门户

前置条件

  • Python 3.11+
  • uv 或 pip
  • 兼容 MCP 的客户端(Claude Desktop、Claude Code 或任何 MCP 宿主)

安装

通过 uvx(推荐 — 无需永久安装):

uvx swiss-snb-mcp

通过 pip:

pip install swiss-snb-mcp

从源码安装:

git clone https://github.com/malkreide/swiss-snb-mcp.git
cd swiss-snb-mcp
pip install -e .

使用 / 快速入门

Claude Desktop — 添加到 claude_desktop_config.json:

{
  "mcpServers": {
    "swiss-snb-mcp": {
      "command": "uvx",
      "args": ["swiss-snb-mcp"]
    }
  }
}

配置文件位置:

  • macOS:~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows:%APPDATA%\Claude\claude_desktop_config.json

在 Claude Desktop 中立即试用:

“根据 SNB 的数据,当前 EUR/CHF 汇率是多少?” “显示过去 12 个月的 SNB 资产负债表 — 黄金和外汇储备。”


配置

无需 API 密钥或身份验证。SNB 数据门户完全公开。

可选环境变量:

变量默认值描述
SNB_TIMEOUT15HTTP 请求超时时间,单位为秒

可用工具

阶段 1 — 专用工具
工具描述
snb_get_exchange_ratesEUR、USD、JPY、GBP、CNY 及另外 22 种货币的月度 CHF 汇率
snb_get_annual_exchange_rates年平均汇率,数据始于 1980 年
snb_get_balance_sheetSNB 资产负债表项目,单位为百万 CHF(月度)
snb_convert_currency使用 SNB 官方汇率将任意金额兑换为 CHF
阶段 2 — 通用 Cube 工具
工具描述
snb_get_cube_data通过 ID 通用访问任意 SNB Cube
snb_get_cube_metadata查看任意 Cube 的维度和筛选值
阶段 3 — Warehouse API(银行业统计)和国际收支
工具描述
snb_get_banking_balance_sheet按银行集团划分的银行资产负债表(月度/年度,资产/负债)
snb_get_banking_income按银行集团划分的银行损益表(年度)
snb_get_balance_of_payments国际收支和国际投资头寸(季度)
snb_get_warehouse_data通过 ID 通用访问任意 SNB Warehouse Cube
snb_get_warehouse_metadata查看 Warehouse Cube 的维度和最后更新时间
资源(静态目录)

用于发现的辅助信息以 MCP 资源而非工具的形式提供,避免工具清单过于臃肿:

URI描述
data://snb/currencies全部 28 种货币的 ID、标签和单位
data://snb/balance-sheet-positions资产和负债项目 ID
data://snb/cubes所有已验证的 Cube-API ID(阶段 1–2)+ 发现指南
data://snb/warehouse-cubes可用的 Warehouse Cube ID(BSTA)
data://snb/bank-groups全部 12 个银行集团的 ID 和标签
示例用例
查询工具
“当前 EUR/CHF 汇率是多少?”snb_get_exchange_rates
“将 CHF 10,000 兑换为 USD”snb_convert_currency
“显示过去一年 SNB 的黄金储备”snb_get_balance_sheet
“当前 SNB 政策利率是多少?”snb_get_cube_data(Cube:snbgwdzid)
“SNB、Fed 和 ECB 的利率如何比较?”snb_get_cube_data(Cube:snboffzisa)
“SARON 3M 复合利率是多少?”snb_get_cube_data(Cube:zirepo)
“M3 货币供应量增长有多快?”snb_get_cube_data(Cube:snbmonagg)
“所有瑞士银行的总资产是多少?”snb_get_banking_balance_sheet
“州立银行的损益表是什么样的?”snb_get_banking_income(bank_group:G10)
“瑞士的国际收支情况如何?”snb_get_balance_of_payments
“有哪些可用的 Cube?”资源 data://snb/cubes

→ 按受众查看更多用例 →


安全性与限制

方面详情
访问权限只读(readOnlyHint: true)——服务无法修改或删除任何数据
个人数据不含个人数据——所有来源均为汇总的公开宏观经济统计数据
速率限制SNB Warehouse API 受到 WAF 保护(快速请求约 100 次后返回 HTTP 503);服务会自动采用指数退避策略重试(最多重试 3 次,延迟分别为 2/4/8s)
超时每次 API 调用 15 秒
身份验证无需 API 密钥——两个 API(/api/cube/ 和 /api/warehouse/cube/)均可公开访问
数据源瑞士国家银行 — data.snb.ch
服务条款受 SNB 的使用条款和版权声明约束;数据可免费用于非商业用途,但须注明来源

架构

┌─────────────────┐     ┌───────────────────────────┐     ┌──────────────────────┐
│   Claude / AI   │────▶│     Swiss SNB MCP         │────▶│     data.snb.ch      │
│   (MCP Host)    │◀────│     (MCP Server)          │◀────│                      │
└─────────────────┘     │                           │     │  /api/cube/ (JSON)   │
                        │  11 Tools · 5 Resources   │     │  /api/warehouse/     │
                        │  Stdio | SSE              │     │  Public · No Auth    │
                        │                           │     │                      │
                        │  Phase 1: dedicated tools │     │  Exchange rates      │
                        │  Phase 2: generic cubes   │     │  Balance sheet       │
                        │  Phase 3: warehouse +     │     │  Interest rates      │
                        │           banking stats   │     │  Banking statistics  │
                        └───────────────────────────┘     │  Balance of payments │
                                                          └──────────────────────┘
Cube 发现模式

SNB API 遵循一致的基于 cube 的结构。读取 data://snb/cubes 资源以查看经过验证的 cube ID,然后使用 snb_get_cube_metadata 检查维度,再通过 snb_get_cube_data 查询数据。第 3 阶段新增了 Warehouse API(/api/warehouse/cube/),用于获取粒度更细的银行统计数据——请从 data://snb/warehouse-cubes 和 data://snb/bank-groups 资源开始。


项目结构

swiss-snb-mcp/
├── src/
│   └── swiss_snb_mcp/
│       ├── __init__.py
│       ├── server.py       # Core tools and FastMCP server (Phase 1–2 + BoP)
│       └── warehouse.py    # Warehouse API tools (Phase 3: banking statistics)
├── scripts/
│   └── record_fixtures.py          # records tests/fixtures/* from data.snb.ch
├── tests/
│   ├── fixtures/                   # recorded responses + PROVENANCE.md (date, rule, SHA-256)
│   ├── fixture_data.py             # loader — a missing name is an error, not an empty dict
│   ├── test_unit.py                # respx-mocked unit tests (run in CI)
│   ├── test_live_scenarios.py      # 20 live scenarios for Phase 1–2 (nightly)
│   └── test_live_warehouse.py      # 20 live scenarios for Phase 3 (nightly)
├── pyproject.toml          # Build configuration (hatchling)
├── CHANGELOG.md
├── CONTRIBUTING.md         # Contribution guidelines (English)
├── CONTRIBUTING.de.md      # German version
├── SECURITY.md             # Security policy & posture (English)
├── SECURITY.de.md          # German version
├── LICENSE
├── README.md               # This file (English)
└── README.de.md            # German version

已知限制

  • 汇率: 仅提供月平均值——此 API 不提供日内或每日汇率
  • 资产负债表: 提供月度数据;部分项目的发布时间可能延迟 1–2 个月
  • Cube 访问: SNB 未正式记录 cube ID——请读取 data://snb/cubes 资源以查看经过验证的 ID
  • 历史跨度: 覆盖范围因序列而异;汇率数据可追溯至 1980 年,部分利率序列的起始时间较晚
  • 无预测: 所有数据均为历史数据或已实现数据——SNB 不通过此 API 发布预测数据

MCP 协议版本

此服务在同一端点上支持两个协议时代。客户端在连接上的第一个请求决定使用哪一个;之后若声明属于另一个时代,则会被拒绝。

时代修订版适用对象
initialize 握手2024-11-05 … 2025-11-25当前客户端使用的协议。服务会以请求指定的修订版作答;若请求的是更新的版本,则以 2025-11-25 上限作答。
每请求封装2026-07-28携带 2026-07-28 _meta 封装的请求会开启现代连接。

两个修订版都固定在 tests/test_protocol_version.py 中,并与已安装的 SDK 进行断言,因此 Dependabot 对 mcp 的升级不会悄然改变其中任何一个。

上表中的内容是实测结果,而非推断。同一个门控会驱动服务的真实服务循环,该循环通过内存流对运行——生产环境中的 stdio 循环也是如此——并向其中发送实际的 JSON-RPC 帧:封装请求由 2026-07-28 版本提供服务;请求 initialize 使用 2026-07-28 时,响应为 2025-11-25;在已确定版本的连接上,来自另一个时代的声明会被拒绝(一种方向返回 -32022,另一种方向返回 -32600)。本节的早期版本曾声称测量需要 ASGI 应用;其实并不需要——现代时代没有 initialize,而且握手从一开始就不是通过 HTTP 进行的。

服务对自身信息的报告也以同样方式实测,见 tests/test_server_identity.py:软件包版本和项目 URL 是从线上读取的,而不是从构造函数中读取的。

请注意,SDK 的 LATEST_PROTOCOL_VERSION 是现代时代的别名,而非握手时代的别名——只针对它固定版本,会导致当前客户端实际协商的时代仍可悄然变化。

更新策略。 门控测试失败时,不要盲目修改常量:阅读两个修订版之间的规范变更日志,确认服务仍按预期运行,然后同时更新常量、本节、README.de.md 和 CHANGELOG.md。


测试

# Unit tests (no API key required)
PYTHONPATH=src pytest tests/ -m "not live"

# Integration tests (live SNB API)
PYTHONPATH=src pytest tests/ -m "live"

# Re-record the fixtures from data.snb.ch (writes tests/fixtures/PROVENANCE.md)
python scripts/record_fixtures.py

单元测试负载是记录所得,而非凭空编造。每个文件的来源、检索日期、选择规则和 SHA-256 值均列于 tests/fixtures/PROVENANCE.md。手写模拟数据编码了作者的假设,因此永远无法证伪这些假设——生产代码和测试夹具来自同一版本,因此如果两者都错,它们也会一起出错,测试套件仍会通过。每个文件都保留所有序列,只缩短数值列表:代码会处理维度,而只展示数值,因此若截取“前 N 个序列”,就会恰好掩盖三个发现所依赖的内容。


更新日志

参见 CHANGELOG.md


贡献

有关问题报告、建议新的 SNB 立方体 ID 以及贡献代码的指南,请参阅 CONTRIBUTING.md。


安全

此服务为只读服务,不处理个人数据,并且只与 data.snb.ch 通信。有关完整的安全状况、审计结果以及漏洞报告方式,请参阅 SECURITY.md。


许可证

MIT 许可证 — 参见 LICENSE


作者

Hayal Oezkan · github.com/malkreide


致谢与相关项目

安装

通过 uv 的 uvx 运行,无需克隆或手动安装。将其添加到 MCP 客户端配置中(Claude Desktop、Cursor 和 Windsurf 使用 mcpServers;VS Code 在 .vscode/mcp.json 中使用顶层 servers 键):

{
  "mcpServers": {
    "swiss-snb-mcp": {
      "command": "uvx",
      "args": [
        "swiss-snb-mcp"
      ]
    }
  }
}

评论

支持 Markdown

第一次接触 MCP?

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

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