mcpField
S
seco-labor-mcp

seco-labor-mcp

本地服务
github.com法律与政务02 周前更新

关于 seco-labor-mcp

seco-labor-mcp 为研究人员、教育规划人员和 Agent 提供瑞士劳动力市场及职业事故数据。它整合年度全国数据、四个州的失业数据和 UVG 行业统计,并明确标示数据覆盖与限制。

主要功能

  1. 01搜索和获取劳动力市场数据集
  2. 02查询全国年度失业者与求职者数据
  3. 03查看 TG、FR、ZG、ZH 州失业数据
  4. 04获取青年失业及月度报告链接
  5. 05查询 UVG 事故和职业别趋势

适用场景

  1. 01比较特定州的失业情况
  2. 02分析青年失业数据以支持职业指导
  3. 03查看不同行业的职业事故趋势
  4. 04发现数据集并获取其下载链接

MCP 相关

该 MCP 服务向客户端提供 12 个工具,用于搜索数据集、查询失业与求职统计以及 UVG 职业事故数据。部分工具明确说明数据不可用或州级覆盖范围有限。

配置

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

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

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

安装包
pypiseco-labor-mcp0.5.0

工具

12

收录的工具列表 · 更新于 2 周前

参数类型必填说明
paramsobject是包含: - query (str):搜索词(德语/英语) - limit (int):结果数量上限(1-20,默认 10) - response_format (str):'markdown' 或 'json'
params.limitinteger否要返回的数据集数量上限(1-20)。
params.querystring是德语或英语搜索查询。示例:'arbeitslose kantone'、'Jugendarbeitslosigkeit'、'offene Stellen'、'Kurzarbeit'、'unemployment youth'
params.response_formatenum否输出格式:'markdown' 表示便于阅读,'json' 表示结构化数据。markdown | json

详细介绍

🇨🇭 属于 Swiss Public Data MCP Portfolio

SECO 劳动力市场 MCP 服务

版本 CI PyPI Python 3.11+ MCP 无需身份验证 许可证:MIT

🌐 英语 | 德语

一个 MCP(Model Context Protocol)服务,通过 opendata.swiss 提供来自 SECO(Staatssekretariat für Wirtschaft)和 AMSTAT 的瑞士劳动力市场数据。

演示:Claude 通过调用 seco-labor-mcp 工具查询青年失业情况


概述

此服务将 AI 模型连接到瑞士劳动力市场统计数据——失业率、求职者、空缺职位、青年失业情况和职业分类明细——全程无需 API 密钥。

主要受众:

  • 🏫 教育局 / 教育规划 — 青年失业情况、职业指导数据
  • 📊 研究与分析 — 劳动力市场趋势、各州比较
  • 🤖 AI Agent — 自动监控并报告劳动力市场情况

典型查询:
"苏黎世州哪些职业群体的青年失业率最高?哪些学徒职业受职位申报义务约束?" → 按受众查看更多用例 →


数据来源(阶段 1 — 无需身份验证)

来源说明状态
opendata.swissCKAN 目录;固定使用的 BFS 表格 T3.3.0.1 包含 SECO 年度序列✅ 在线
arbeit.swiss月度新闻稿(PDF,结构化 URL 模式)✅ 在线
amstat.chAMSTAT 参考门户⚠️ JavaScript 单页应用,无公开 REST API
unfallstatistik.chUnfallstatistik UVG(SSUV/KSUV c/o Suva)——职业事故和疾病⚠️ 仅提供 PDF,无 API(见下文)

架构

┌─────────────────────────────────────────────────────┐
│                  seco-labor-mcp                     │
│                                                     │
│  ┌─────────────┐    ┌──────────────────────────┐   │
│  │  FastMCP    │    │      9 MCP Tools         │   │
│  │  Server     │◄──►│  seco_search_datasets    │   │
│  │  (stdio /   │    │  seco_get_dataset        │   │
│  │   HTTP)     │    │  seco_get_unemployment_* │   │
│  └─────────────┘    │  seco_get_youth_*        │   │
│         │           │  seco_get_job_seekers    │   │
│         ▼           │  seco_get_open_positions │   │
│  ┌─────────────┐    │  seco_get_monthly_url    │   │
│  │  httpx      │    │  seco_list_cantons       │   │
│  │  async      │    └──────────────────────────┘   │
│  └──────┬──────┘                                   │
└─────────┼───────────────────────────────────────────┘
          │
          ▼
  ┌───────────────────────────────────┐
  │  opendata.swiss CKAN API          │
  │  https://opendata.swiss/api/3/    │
  │  action/package_search            │
  │  action/package_show              │
  └───────────┬───────────────────────┘
              │
              ▼
  ┌───────────────────────────────────┐
  │  SECO Data Resources              │
  │  CSV / XLSX / PDF Downloads       │
  │  (monthly labor market data)      │
  └───────────────────────────────────┘

数据来源与缺失内容

SECO 已不再是 opendata.swiss 上的数据发布方。 已于 2026-08-14 核实: organization_show 返回 404,且 organization_list 中的 176 条记录里没有 SECO。在此之前,服务会筛选该组织的所有搜索结果,因此返回空结果——组织名称查找失败,看起来就像搜索结果为空。

登记失业者和求职者数据仍由 SECO 提供:BFS 在表格 T3.3.0.1 中发布这些数据,并在页脚注明 SECO。服务通过固定的数据集 ID(sources.py)读取该表,并通过在线测试与实时来源进行核验。

系列20002025
登记求职者(SECO)124.6214.1
登记失业者(SECO)72.0133.7
ILO 失业者(BFS)126.5248.5

千人,年平均值

这三个系列衡量的内容并不相同:2000 年,ILO 数据是登记数据的 1.76 倍。服务会将它们分别标注并报告,绝不会将其中一个换算成另一个。

州级数据:四个州,四种架构

没有全国月度序列——但四个州会发布各自的 RAV 数据,每个州都有自己的门户和列名。对于这些州,seco_get_unemployment_overview(canton=…) 会返回实际数据:

州粒度起始时间层级备注
TG月度2016-01州仅有按年龄组划分的序列 → 青年失业人数
FR月度2004-01州和瑞士包含全国月度数据,作为对照行
ZG月度1993-01州青年失业数据仅提供比率,不提供人数
ZH年度1991市镇没有月度数据;区和地区与市镇位于同一列中,并会单独区分

其余 22 个州会收到明确的拒绝响应——既不会返回其他州的数据,也不会返回全国汇总数据。看似完整的部分覆盖,比没有数据更糟。

这四个序列彼此不可比较,也无法汇总为瑞士数据:时间轴不同、地理层级不同,而且 ZG 提供的是比率而非人数。

仍不可用的数据:按职业组划分的失业数据、全国空缺职位序列,以及瑞士全国或 26 个州中 24 个州的青年失业数据。相关工具会说明这一点,且不会返回替代数据。这些数据可在 amstat.ch 上通过交互方式查看,但该网站不提供服务可调用的接口。


工具

工具描述主要用例
seco_search_datasets搜索 opendata.swiss 上的劳动力市场数据集(每条搜索结果均显示发布方)发现数据
seco_get_dataset数据集的完整元数据和下载链接获取数据
seco_get_unemployment_overview登记失业人数:全国年度数据,以及 TG/FR/ZG/ZH 的州级数据劳动力市场概览
seco_get_youth_unemployment青年失业(15–24 岁)——仅提供 TG(人数)和 ZG(比率)数据🎓 职业选择咨询
seco_get_job_seekers登记求职者人数,全国年度序列始于 2000 年培训需求
seco_get_open_positions空缺职位——没有全国序列行业分析
seco_get_unemployment_by_occupation按 Berufshauptgruppe 划分的数据——没有机器可读的数据源🎓 职业指导
seco_get_monthly_report_url生成/验证 PDF 报告 URL访问来源
seco_list_cantons全部 26 个州的代码和名称实用工具
seco_get_uvg_overview关于职业事故和职业病的 UVG 关键数据风险概览
seco_get_uvg_by_branch按 NOGA 2008 经济行业划分的结果🎓 职业指导
seco_get_uvg_trends按行业划分的十年事故时间序列趋势分析

12 个工具,最多可提供 15 个。


UVG 事故统计(SSUV)

三个 seco_get_uvg_* 工具涵盖了与失业工具所描述的同一劳动力市场中的风险方面:各行业发生了多少起职业事故和职业病,以及这些数据在十年间如何变化。

发布方不是 SECO。 UVG 事故统计由协调小组 KSUV 和位于卢塞恩的 Sammelstelle SSUV c/o Suva 发布。seco_ 前缀指向的是此服务,而非数据来源;每个响应都会在其 source 字段中注明实际发布方。

架构决策:C(优先转储)

已于 2026-08-05 在线验证,完整报告见 PROBE_REPORT_UVG.md。

该数据源没有 API。扫描所有数据页面中的链接后,发现 165 个 PDF,且没有任何 .csv、.xlsx 或 .json 文件。opendata.swiss 完全没有列出该数据源(七个搜索词中有六个的 count=0),而 BFS dam-api 会静默忽略其筛选参数。剩下的内容在实际使用中可供机器读取,但并非专为此设计:

访问方式格式更新频率
schluesselzahlen_d.htmHTML 表格,5 年数据,覆盖全瑞士每年
Ts{YY}.pdf年度版本,按 NOGA 划分的表格 1.2 和 2.4每年 6 月
WirtKl_{BUV|NBUV}_{NN}.pdf按 NOGA 部门划分的十年序列每年 1 月

PDF 会缓存 24 小时,并采用 2s/4s/8s 的退避重试。

每个响应都会告诉你什么
  • source_freshness.data_year — 数据年份,而非版本年份。2026 年版本报告的是 2024 年数据;这两年的滞后会明确说明,不会隐藏起来。
  • totals_check — 对解析出的行进行求和,并与同一出版物中印出的总计进行比较。布局出错会在这里显现,而不会变成看似合理的错误数字。
  • significant — 数据源会用星号标记具有统计显著性的同比变化。此标记会保留在每个数据点中,因此只有数据源认定为显著的变化才会被报告为显著。

安装

Claude Desktop(stdio)

将以下内容添加到 claude_desktop_config.json:

{
  "mcpServers": {
    "seco-labor": {
      "command": "uvx",
      "args": ["seco-labor-mcp"]
    }
  }
}
云端 / HTTP
pip install seco-labor-mcp
MCP_TRANSPORT=http PORT=8000 seco-labor-mcp

应使用 http 作为传输方式。只有它能承载现代协议时代:以此服务对象进行测试时,http 会协商使用 2026-07-28,而 sse 会将所有客户端限制在 2025-11-25,即使客户端支持现代协议时代也是如此。现有部署仍可使用 sse 和 streamable-http — tests/test_transport_aera.py 会运行这两种方式,并记录它们实际采用的协议时代。

HTTP 服务默认绑定到 127.0.0.1(环回地址),以防止共享网络上的 NeighborJack。对于确实需要接受容器外部流量的容器部署,请显式设置 HOST=0.0.0.0 — 最好在 Dockerfile / 编排器配置中设置,并且仅在上游代理或防火墙之后使用:

HOST=0.0.0.0 MCP_TRANSPORT=http PORT=8000 seco-labor-mcp   # container only

现在,未知的 MCP_TRANSPORT 值会导致程序报错退出。以前它会静默回退到 stdio,因此拼写错误会让服务启动后始终无法出现在预期端口上。

开发
git clone https://github.com/malkreide/seco-labor-mcp.git
cd seco-labor-mcp
pip install -e ".[dev]"
pytest tests/ -m "not live" -v

使用示例

搜索青年失业数据
Tool: seco_search_datasets
Input: { "query": "Jugendarbeitslosigkeit Alter", "limit": 5 }
获取苏黎世州的失业数据
Tool: seco_get_unemployment_overview
Input: { "canton": "ZH", "response_format": "markdown" }
获取月度报告 URL
Tool: seco_get_monthly_report_url
Input: { "year": 2026, "month": 2, "language": "de" }

核心概念

失业者(Arbeitslose)与求职者(Stellensuchende)

记忆口诀:失业者 ⊂ 求职者 — 失业者是求职者的子集。

术语定义2025 年 12 月
Arbeitslose在 RAV 登记且可立即工作的人员~149'000 (3.2%)
Stellensuchende所有在 RAV 登记的人员(包括参加培训项目者)~233'900
青年失业的季节性
  • 7 月/8 月:大幅增加(毕业后尚未找到工作的学生)
  • 9 月/10 月:有所下降(学徒培训开始)
  • 秋季下降后仍然存在的剩余失业情况,表明需要采取结构性的过渡项目(Brückenangebote)
职位申报义务(Stellenmeldepflicht,自 2020 年起)

失业率达到或超过 5% 的职业,必须在公开发布职位前向 RAV 申报。名单每年更新。这与职业咨询直接相关 — 这些职业对瑞士求职者而言职位空缺最多。


组合协同效应

服务协同效应
swiss-statistics-mcpBFS 人口 / 就业数据,可提供更深入的背景信息
zurich-opendata-mcp苏黎世市级的教育和社会数据
swiss-snb-mcp经济背景信息(GDP、工资),用于解读劳动力市场
fedlex-mcpALV(失业保险)立法框架

已知限制

  • amstat.arbeit.swiss 没有公共 REST API(JavaScript SPA)→ 可通过 CKAN 作为替代方案
  • 职业和行业详情需要从 SECO 资源下载 CSV
  • 较早期月度新闻报告的 URL 格式可能有所不同
  • 此级别无法获取州级以下的市镇数据
  • UVG 数据通过解析 PDF 获取——2025 和 2026 版的版面保持稳定,但重新设计可能导致解析失效。每个响应中的 totals_check 可让这类问题显现,而不是悄无声息地发生。
  • UVG 数据大约滞后两年(2026 版报告的是 2024 年数据)
  • UVG 分支详情遵循 NOGA 2008,并将部分类别合并(41 – 42、77, 79 – 82);此级别没有州级细分
  • 出版物之外的详细 UVG 数据仅供 SSUV 封闭用户组访问,不在此无认证服务的范围内

第二阶段路线图:

  • 自动缓存 CSV,TTL 为 24 小时
  • 直接解析 XLSX 以获取州级细分数据
  • 与 zh-education-mcp 集成,以关联 Schulamt 专项数据

数据许可

适用两种不同的许可——无论哪种情况,此服务的代码均采用 MIT 许可,但数据不受该许可约束。

opendata.swiss 上发布的 SECO / AMSTAT 数据采用知识共享 CCZero(公有领域)许可。 来源:瑞士联邦经济事务秘书处(SECO)——seco.admin.ch

UVG 事故统计数据未采用开放许可。出版物声明:

«Abdruck – ausser für kommerzielle Nutzung – mit Quellenangabe gestattet.» (允许转载,商业用途除外,须注明出处。)

这意味着限制商业用途并要求注明出处。数据归 KSUV/SSUV 所有,不能由此仓库的 MIT 许可解除:MIT 条款适用于代码,而非代码获取的数据。如果你将此服务用于商业用途,UVG 工具不在许可范围内——请直接联系 Sammelstelle ([email protected]) 确认。每个 UVG 响应都会在其 source 字段中重复说明此限制,因为模型不会收到 README。


安全与限制

方面详情
访问权限只读(readOnlyHint: true)——服务无法修改或删除任何数据
个人数据不含个人数据——所有来源均为汇总后的匿名公共统计数据
速率限制没有强制执行的外部限制;服务默认将查询结果限制为 20 条;HTTP 超时为 30 秒
身份验证无需 API 密钥——opendata.swiss 和 arbeit.swiss 均可公开访问
许可证SECO 数据采用知识共享 CCZero(公有领域)许可
服务条款须遵守以下服务条款:opendata.swiss、SECO、arbeit.swiss
GDPR / DSG完全合规——不会传输或存储个人数据;所有数据均为官方公共统计数据

MCP 协议版本

此服务基于 fastmcp 4.x / mcp 2.x,在同一个服务对象上支持两个协议时代:

时代修订版形式
现代2026-07-28无需握手 — server/discover,每个请求使用一个自包含信封
握手2025-11-25先执行 initialize,然后建立有状态会话

支持现代协议时代的客户端会使用该版本;只支持握手时代的客户端也仍可正常使用。两种版本分别在 tests/test_protokoll_aeren.py 中固定,并且都会进行实测——测试会针对此服务对象协商一个真实连接,而不是比较两个常量。

仅固定 LATEST_PROTOCOL_VERSION 并不足够:在 mcp 2.x 中,该名称是现代时代的别名,因此握手时代的版本上限仍可变动——而目前大多数客户端实际使用的正是这个版本上限。

在 0.4.0 之前,此服务运行的是 fastmcp 3.x,该版本固定使用 mcp 1.x。在该版本中,2025-11-25 是 SDK 所知的最高修订版,因此 2026-07-28 并非仅有部分支持——而是完全不存在。过去用于保障单时代状态的测试,如今用于保障其相反状态:如果降级再次移除了现代时代,该测试就会失败。

注意:读取服务元数据时,现代连接上没有 InitializeResult。请使用与时代无关的 protocol_version / server_info,而非 initialize_result。


贡献

开发指南请参阅 CONTRIBUTING.md。


安全

有关安全措施以及如何报告漏洞,请参阅 SECURITY.md。


许可证

基于 MIT License 发布 — 版权所有 © 2026 Hayal Oezkan。


作者

Hayal Oezkan · github.com/malkreide

安装

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

{
  "mcpServers": {
    "seco-labor-mcp": {
      "command": "uvx",
      "args": [
        "seco-labor-mcp"
      ]
    }
  }
}

评论

支持 Markdown

第一次接触 MCP?

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

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