使用说明
Schwaizer
MCP Server: OpenData MCP
An unofficial MCP server for interacting with Switzerland's open data portal (opendata.swiss, CKAN).
This is a community project by Schwaizer and is not an official implementation by the Swiss government.
关于Schwaizer
塑造瑞士人工智能的未来
通过负责任的人工智能采用,赋予瑞士企业和社会权力。
Schwaizer成立于2025年,是一家非营利组织,致力于在瑞士加速负责任地采用人工智能。
网站:https://www.schwaizer.ch
概述
Schwaizer OpenData MCP服务器提供对瑞士开放数据门户(OpenData.Swiss)的只读访问,该门户由CKAN提供支持。服务器公开安全、经过验证的MCP工具,这些工具映射到CKAN的公共Action API:数据集搜索/显示、组织/组/标签、资源/视图和数据存储查询。为了性能和安全,强制执行限制和合理的默认值。
特性
- 核心CKAN行动的MCP工具:
- 目录
package_search--使用方面、分页、排序搜索数据集package_show--按id/name获取数据集
- 组织/团体/标签
organization_list,organization_showgroup_list,group_showtag_list,tag_autocomplete
- 资源和视图
resource_show,resource_view_show
- 数据存储
datastore_infodatastore_search--具有安全默认值和防御限制的GET/POSTdatastore_search_sql--默认情况下禁用(由配置保护)
- 状态/帮助
status_showhelp_show
- 目录
- 安全和性能护栏:
- 服务器端通过以下方式限制行数
MAX_ROWS/DEFAULT_ROWS include_total默认为false以避免昂贵的计数datastore_search_sql默认禁用;受DDL/DML保护
- 服务器端通过以下方式限制行数
- 使用Zod进行输入验证(模式导出为JSON模式供工具使用)
- 基于ky的HTTP客户端,具有合理的超时和通过pino进行结构化日志记录
安装
先决条件
- Node.js 20.0.0或更高版本
- npm或pnpm
再进行
npm install
配置
复制示例环境文件:
cp .env.example .env
然后调整中的值 .env 根据需要。
环境变量
| 名称 | 默认值 | 描述 |
|---|---|---|
BASE_URL |
https://opendata.swiss/api/3/action |
CKAN操作API基本URL(无尾部斜线)。 |
ENABLE_SQL |
false |
启用 datastore_search_sql。出于安全考虑,默认禁用。 |
TIMEOUT_MS |
15000 |
HTTP客户端超时(毫秒)。 |
USER_AGENT |
schwaizer-opendata-mcp/0.1.0 (+https://opendata.swiss) |
发送到CKAN API的User‑Agent头。 |
MAX_ROWS |
1000 |
服务器允许行数/限制参数的绝对上限。 |
DEFAULT_ROWS |
25 |
客户端未指定值时的默认行数/限制。 |
环境变量被读入 src/config.js.
用法
通过stdio运行服务器:
# Production mode
npm start
# Development mode (auto-reload)
npm run dev
此MCP服务器通过stdio进行通信。配置启用MCP的客户端/工具以生成命令(例如。, node src/index.js 或包裹箱)并通过stdio连接。
该软件包还安装了一个bin:
"bin": { "schwaizer-opendata-mcp": "src/index.js" }
因此,您可以运行:
schwaizer-opendata-mcp
可用工具
- 目录
package_search(参数:q,fq,sort,rows,start,facetField,facetLimit,includeTotal)package_show(参数:id)
- 组织/团体/标签
organization_list(参数:all_fields,limit,offset)organization_show(参数:id)group_list(参数:order_by,limit,offset,all_fields)group_show(参数:id)tag_list(参数:query)tag_autocomplete(参数:q,limit)
- 资源和视图
resource_show(参数:id)resource_view_show(参数:id)
- 数据存储
datastore_info(参数:id,include_private)datastore_search(参数:resource_id,q,filters,fields,sort,language,include_total,limit,offset,distinct,plain,full_text)datastore_search_sql(参数:sql)--需要ENABLE_SQL=true
- 状态/帮助
status_show(无参数)help_show(参数:name)
API 文档
- CKAN Action API 数据库 (opendata.swiss):
https://opendata.swiss/api/3/action - CKAN API参考:https://docs.ckan.org/en/latest/api/index.html
集成测试
集成测试对opendata.swiss进行真正的API调用,以验证MCP服务器与活动CKAN实例是否正常工作。这些测试:
- 使用真正的API调用(无模拟)来测试实际行为
- 遵守速率限制,测试之间的延迟很小
- 使用已知数据集中的稳定测试数据(如BFS统计数据)
- 优雅地处理不可用的功能(例如,禁用SQL搜索,没有数据存储资源)
- 对于网络访问受限的CI/CD环境,可以通过环境变量禁用
运行集成测试
# Run integration tests
npm run test:integration
# Skip integration tests (useful in CI/CD)
SKIP_INTEGRATION_TESTS=true npm test
# Run with verbose output
npm run test:integration -- --reporter=verbose
集成测试覆盖率
- 目录 (
tests/integration/catalog.integration.test.js):使用过滤器/分页/排序、数据集检索、列表/自动补全、活动提要进行搜索 - 数据存储 (
tests/integration/datastore.integration.test.js):信息/搜索、字段/排序、SQL(如果启用)、资源的动态发现 - 资源 (
tests/integration/resources.integration.test.js):资源元数据和视图 - 组织/分类 (
tests/integration/org-taxonomy.integration.test.js):组织、组、标签、词汇表和许可证、自动补全 - 状态 (
tests/integration/status.integration.test.js):平台状态和API帮助
发展
项目结构
schwaizer-opendata-mcp/
├── src/
│ ├── index.js # MCP server entry (stdio)
│ ├── config.js # Configuration loader (.env)
│ ├── api/
│ │ └── ckan-client.js # CKAN HTTP client
│ ├── tools/ # MCP tool handlers
│ │ ├── catalog.js
│ │ ├── org-taxonomy.js
│ │ ├── resources.js
│ │ ├── datastore.js
│ │ └── status.js
│ └── utils/
│ └── logger.js # pino logger
├── tests/
│ ├── unit/
│ └── integration/
├── docs/
├── .env.example
└── package.json
脚本
npm start--启动MCP服务器npm run dev--从文件更改时自动重新加载开始npm test--运行所有测试npm run test:unit--运行单元测试npm run test:integration--运行集成测试npm run test:watch--测试的监视模式npm run test:coverage--生成覆盖率报告npm run lint--运行ESLintnpm run format--带Prettier的格式npm run docs-使用JSDoc构建API文档(目的地:docs/)
缓存
默认情况下,服务器不实现缓存。所有请求都直接转发到opendata.swiss上的CKAN API。如果您的用例需要,请考虑实现客户端缓存。
错误处理
服务器提供全面的错误处理:
- 输入验证:在进行API调用之前,使用Zod模式验证所有工具输入
- API错误:捕获CKAN API错误并返回描述性消息
- 速率限制:服务器遵守CKAN的速率限制;如果需要,考虑在请求之间增加延迟
- 超时处理:可配置的超时(默认15秒)可防止挂起请求
- SQL安全:
datastore_search_sql默认情况下禁用,启用时包括DDL/DML保护
常见错误场景:
- 404未找到:数据集或资源不存在
- 400错误请求:查询参数或筛选器无效
- 403禁止:访问被拒绝(公共API很少访问)
- 500服务器错误:CKAN平台问题
- 超时:请求已超出
TIMEOUT_MS限制
典型工作流程
1.搜索数据集
首先搜索与您的主题相关的数据集:
// Search for datasets about education
package_search({
"q": "education",
"fq": "organization:bundesamt-fur-statistik-bfs",
"rows": 10
})
2.获取数据集详细信息
找到相关数据集后,获取其全部详细信息:
// Get complete dataset information
package_show({
"id": "bildungsabschlusse"
})
3.探索数据存储资源
检查数据集是否具有启用数据存储的资源:
// Get datastore info for a resource
datastore_info({
"id": "resource-id-from-package-show"
})
4.查询数据
最后,使用过滤器查询实际数据:
// Search datastore with filters
datastore_search({
"resource_id": "resource-id",
"filters": {
"Jahr": "2023",
"Kanton": "ZH"
},
"limit": 100
})
贡献
欢迎投稿!请打开问题或提交拉取请求。
许可证
MIT许可证——见 LICENSE.
支持
对于此MCP服务器的问题,请在项目的GitHub存储库上打开问题。
有关CKAN/opendata.swiss平台的详细信息,请参阅上面链接的官方文档。